diff --git a/.codecov.yml b/.codecov.yml index 77328cf790..9e8269ead4 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,6 +1,7 @@ +# https://docs.codecov.com/docs/codecovyml-reference#codecov codecov: require_ci_to_pass: true - # https://docs.codecov.com/docs/components +# https://docs.codecov.com/docs/components component_management: individual_components: - component_id: backend @@ -9,26 +10,76 @@ component_management: - component_id: frontend paths: - src-ui/** -# https://docs.codecov.com/docs/pull-request-comments +# https://docs.codecov.com/docs/flags#step-2-flag-management-in-yaml +# https://docs.codecov.com/docs/carryforward-flags +flags: + # Backend Python versions + backend-python-3.11: + paths: + - src/** + carryforward: true + backend-python-3.12: + paths: + - src/** + carryforward: true + backend-python-3.13: + paths: + - src/** + carryforward: true + backend-python-3.14: + paths: + - src/** + carryforward: true + # Frontend (shards merge into single flag) + frontend-node-24.x: + paths: + - src-ui/** + carryforward: true comment: layout: "header, diff, components, flags, files" - # https://docs.codecov.com/docs/javascript-bundle-analysis require_bundle_changes: true bundle_change_threshold: "50Kb" coverage: + # https://docs.codecov.com/docs/commit-status status: project: - default: + backend: + flags: + - backend-python-3.11 + - backend-python-3.12 + - backend-python-3.13 + - backend-python-3.14 + paths: + - src/** # https://docs.codecov.com/docs/commit-status#threshold threshold: 1% + removed_code_behavior: adjust_base + frontend: + flags: + - frontend-node-24.x + paths: + - src-ui/** + threshold: 1% + removed_code_behavior: adjust_base patch: - default: - # For the changed lines only, target 100% covered, but - # allow as low as 75% + backend: + flags: + - backend-python-3.11 + - backend-python-3.12 + - backend-python-3.13 + - backend-python-3.14 + paths: + - src/** + target: 100% + threshold: 25% + frontend: + flags: + - frontend-node-24.x + paths: + - src-ui/** target: 100% threshold: 25% # https://docs.codecov.com/docs/javascript-bundle-analysis bundle_analysis: - # Fail if the bundle size increases by more than 1MB warning_threshold: "1MB" status: true diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index fd6448e9b6..c5bd4ec6c0 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim as main-app +FROM --platform=$BUILDPLATFORM docker.io/node:24-trixie-slim as main-app ARG DEBIAN_FRONTEND=noninteractive @@ -8,16 +8,17 @@ ARG DEBIAN_FRONTEND=noninteractive ARG TARGETARCH # Can be workflow provided, defaults set for manual building -ARG JBIG2ENC_VERSION=0.29 -ARG QPDF_VERSION=11.9.0 -ARG GS_VERSION=10.03.1 +ARG JBIG2ENC_VERSION=0.30 # Set Python environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ # Ignore warning from Whitenoise PYTHONWARNINGS="ignore:::django.http.response:517" \ - PNGX_CONTAINERIZED=1 + PNGX_CONTAINERIZED=1 \ + # https://docs.astral.sh/uv/reference/settings/#link-mode + UV_LINK_MODE=copy \ + UV_CACHE_DIR=/cache/uv/ # # Begin installation and configuration @@ -63,8 +64,6 @@ ARG RUNTIME_PACKAGES="\ libmagic1 \ media-types \ zlib1g \ - # Barcode splitter - libzbar0 \ poppler-utils \ htop \ sudo" @@ -83,37 +82,15 @@ RUN set -eux \ && apt-get update \ && apt-get install --yes --quiet ${PYTHON_PACKAGES} -COPY --from=ghcr.io/astral-sh/uv:0.7.8 /uv /bin/uv +COPY --from=ghcr.io/astral-sh/uv:0.9.10 /uv /bin/uv RUN set -eux \ && echo "Installing pre-built updates" \ - && echo "Installing qpdf ${QPDF_VERSION}" \ - && curl --fail --silent --show-error --location \ - --output libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && curl --fail --silent --show-error --location \ - --output qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && dpkg --install ./libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && dpkg --install ./qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && echo "Installing Ghostscript ${GS_VERSION}" \ - && curl --fail --silent --show-error --location \ - --output libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - && curl --fail --silent --show-error --location \ - --output ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - && curl --fail --silent --show-error --location \ - --output libgs10-common_${GS_VERSION}.dfsg-1_all.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10-common_${GS_VERSION}.dfsg-1_all.deb \ - && dpkg --install ./libgs10-common_${GS_VERSION}.dfsg-1_all.deb \ - && dpkg --install ./libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - && dpkg --install ./ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ && echo "Installing jbig2enc" \ && curl --fail --silent --show-error --location \ --output jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/jbig2enc-${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ + https://github.com/paperless-ngx/builder/releases/download/jbig2enc-trixie-v${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ && dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb # setup docker-specific things @@ -127,6 +104,7 @@ COPY [ \ RUN set -eux \ && echo "Configuring ImageMagick" \ + && mkdir -p /etc/ImageMagick-6 \ && mv paperless-policy.xml /etc/ImageMagick-6/policy.xml @@ -142,7 +120,7 @@ ARG BUILD_PACKAGES="\ pkg-config" # hadolint ignore=DL3042 -RUN --mount=type=cache,target=/root/.cache/uv,id=pip-cache \ +RUN --mount=type=cache,target=/cache/uv/,id=uv-cache \ set -eux \ && echo "Installing build system packages" \ && apt-get update \ diff --git a/.devcontainer/README.md b/.devcontainer/README.md index cec62c802b..0ce35e1834 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -89,6 +89,18 @@ Additional tasks are available for common maintenance operations: - **Migrate Database**: To apply database migrations. - **Create Superuser**: To create an admin user for the application. +## Committing from the Host Machine + +The DevContainer automatically installs Git pre-commit hooks during setup. However, these hooks are configured for use inside the container. + +If you want to commit changes from your host machine (outside the DevContainer), you need to set up prek on your host. This installs it as a standalone tool. + +```bash +uv tool install prek && prek install +``` + +After this, you can commit either from inside the DevContainer or from your host machine. + ## Let's Get Started! Follow the steps above to get your development environment up and running. Happy coding! diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index cec8e21772..4e99894747 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,26 +3,31 @@ "dockerComposeFile": "docker-compose.devcontainer.sqlite-tika.yml", "service": "paperless-development", "workspaceFolder": "/usr/src/paperless/paperless-ngx", - "postCreateCommand": "/bin/bash -c 'rm -rf .venv/.* && uv sync --group dev && uv run pre-commit install'", + "forwardPorts": [4200, 8000], + "containerEnv": { + "UV_CACHE_DIR": "/usr/src/paperless/paperless-ngx/.uv-cache" + }, + "postCreateCommand": "/bin/bash -c 'rm -rf .venv/.* && uv sync --group dev && uv run prek install'", "customizations": { "vscode": { - "extensions": [ - "mhutchie.git-graph", - "ms-python.python", - "ms-vscode.js-debug-nightly", - "eamodio.gitlens", - "yzhang.markdown-all-in-one" - ], - "settings": { - "python.defaultInterpreterPath": "/usr/src/paperless/paperless-ngx/.venv/bin/python", - "python.pythonPath": "/usr/src/paperless/paperless-ngx/.venv/bin/python", - "python.terminal.activateEnvInCurrentTerminal": true, - "editor.formatOnPaste": false, - "editor.formatOnSave": true, - "editor.formatOnType": true, - "files.trimTrailingWhitespace": true - } + "extensions": [ + "mhutchie.git-graph", + "ms-python.python", + "ms-vscode.js-debug-nightly", + "eamodio.gitlens", + "yzhang.markdown-all-in-one", + "pnpm.pnpm" + ], + "settings": { + "python.defaultInterpreterPath": "/usr/src/paperless/paperless-ngx/.venv/bin/python", + "python.pythonPath": "/usr/src/paperless/paperless-ngx/.venv/bin/python", + "python.terminal.activateEnvInCurrentTerminal": true, + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "files.trimTrailingWhitespace": true + } } - }, - "remoteUser": "paperless" - } + }, + "remoteUser": "paperless" +} diff --git a/.devcontainer/vscode/tasks.json b/.devcontainer/vscode/tasks.json index 6475e14d1d..bbc1684cea 100644 --- a/.devcontainer/vscode/tasks.json +++ b/.devcontainer/vscode/tasks.json @@ -33,7 +33,7 @@ "label": "Start: Frontend Angular", "description": "Start the Frontend Angular Dev Server", "type": "shell", - "command": "pnpm start", + "command": "pnpm exec ng serve --host 0.0.0.0", "isBackground": true, "options": { "cwd": "${workspaceFolder}/src-ui" @@ -116,9 +116,9 @@ }, { "label": "Maintenance: Build Documentation", - "description": "Build the documentation with MkDocs", + "description": "Build the documentation with Zensical", "type": "shell", - "command": "uv run mkdocs build --config-file mkdocs.yml && uv run mkdocs serve", + "command": "uv run zensical build && uv run zensical serve", "group": "none", "presentation": { "echo": true, @@ -174,12 +174,22 @@ { "label": "Maintenance: Install Frontend Dependencies", "description": "Install frontend (pnpm) dependencies", - "type": "pnpm", - "script": "install", - "path": "src-ui", + "type": "shell", + "command": "pnpm install", "group": "clean", "problemMatcher": [], - "detail": "install dependencies from package" + "options": { + "cwd": "${workspaceFolder}/src-ui" + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "shared", + "showReuseMessage": false, + "clear": true, + "revealProblems": "onProblem" + } }, { "description": "Clean install frontend dependencies and build the frontend for production", diff --git a/.dockerignore b/.dockerignore index 8c39dd615c..b9c7d2f844 100644 --- a/.dockerignore +++ b/.dockerignore @@ -28,3 +28,4 @@ ./resources # Other stuff **/*.drawio.png +.mypy_baseline diff --git a/.editorconfig b/.editorconfig index 8111f01d86..eecb25efb5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,6 +11,10 @@ end_of_line = lf charset = utf-8 max_line_length = 79 +[*.sh] +indent_style = tab +indent_size = 1 + [{*.html,*.css,*.js}] max_line_length = off @@ -35,3 +39,6 @@ max_line_length = off [Dockerfile*] indent_style = space + +[*.toml] +indent_style = space diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 91996b4d0c..77bea4917f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -35,8 +35,8 @@ NOTE: PRs that do not address the following will not be merged, please do not sk - [ ] I have read & agree with the [contributing guidelines](https://github.com/paperless-ngx/paperless-ngx/blob/main/CONTRIBUTING.md). - [ ] If applicable, I have included testing coverage for new code in this PR, for [backend](https://docs.paperless-ngx.com/development/#testing) and / or [front-end](https://docs.paperless-ngx.com/development/#testing-and-code-style) changes. -- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers. +- [ ] If applicable, I have tested my code for breaking changes & regressions on both mobile & desktop devices, using the latest version of major browsers. - [ ] If applicable, I have checked that all tests pass, see [documentation](https://docs.paperless-ngx.com/development/#back-end-development). -- [ ] I have run all `pre-commit` hooks, see [documentation](https://docs.paperless-ngx.com/development/#code-formatting-with-pre-commit-hooks). +- [ ] I have run all Git `pre-commit` hooks, see [documentation](https://docs.paperless-ngx.com/development/#code-formatting-with-pre-commit-hooks). - [ ] I have made corresponding changes to the documentation as needed. -- [ ] I have checked my modifications for any breaking changes. +- [ ] In the description of the PR above I have disclosed the use of AI tools in the coding of this PR. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 09721afb8b..8ac712f97e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,6 +12,8 @@ updates: open-pull-requests-limit: 10 schedule: interval: "monthly" + cooldown: + default-days: 7 labels: - "frontend" - "dependencies" @@ -36,35 +38,62 @@ updates: directory: "/" # Check for updates once a week schedule: - interval: "weekly" + interval: "monthly" + cooldown: + default-days: 7 labels: - "backend" - "dependencies" groups: + # Development & CI/CD Tooling development: patterns: - "*pytest*" - "ruff" - - "mkdocs-material" - - "pre-commit*" - django: + - "zensical" + - "prek*" + # Django & DRF Ecosystem + django-ecosystem: patterns: - "*django*" - "drf-*" - major-versions: + - "djangorestframework" + - "whitenoise" + - "bleach" + - "jinja2" + # Async, Task Queuing & Caching + async-tasks: + patterns: + - "celery*" + - "channels*" + - "flower" + - "redis" + # Document, PDF, and OCR Processing + document-processing: + patterns: + - "ocrmypdf" + - "pdf2image" + - "zxing-cpp" + - "tika-client" + - "gotenberg-client" + - "python-magic" + - "python-gnupg" + # Data, NLP, and Search + data-nlp-search: + patterns: + - "nltk" + - "scikit-learn" + - "langdetect" + - "rapidfuzz" + - "whoosh-reloaded" + # Utilities (Patch Updates) + utilities-patch: update-types: - - "major" - small-changes: + - "patch" + # Utilities (Minor Updates) + utilities-minor: update-types: - "minor" - - "patch" - exclude-patterns: - - "*django*" - - "drf-*" - pre-built: - patterns: - - psycopg* - - zxing-cpp # Enable updates for GitHub Actions - package-ecosystem: "github-actions" target-branch: "dev" @@ -72,6 +101,8 @@ updates: schedule: # Check for updates to GitHub Actions every month interval: "monthly" + cooldown: + default-days: 7 labels: - "ci-cd" - "dependencies" @@ -87,7 +118,9 @@ updates: - "/" - "/.devcontainer/" schedule: - interval: "weekly" + interval: "monthly" + cooldown: + default-days: 7 open-pull-requests-limit: 5 labels: - "dependencies" @@ -98,7 +131,9 @@ updates: - package-ecosystem: "docker-compose" directory: "/docker/compose/" schedule: - interval: "weekly" + interval: "monthly" + cooldown: + default-days: 7 open-pull-requests-limit: 5 labels: - "dependencies" @@ -122,3 +157,14 @@ updates: postgres: patterns: - "docker.io/library/postgres*" + greenmail: + patterns: + - "docker.io/greenmail*" + - package-ecosystem: "pre-commit" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "monthly" + groups: + pre-commit-dependencies: + patterns: + - "*" diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 89c8a96eae..2b8169f245 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -44,6 +44,7 @@ include-labels: - 'notable' exclude-labels: - 'skip-changelog' +filter-by-commitish: true category-template: '### $TITLE' change-template: '- $TITLE @$AUTHOR ([#$NUMBER]($URL))' change-title-escapes: '\<*_&#@' diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml new file mode 100644 index 0000000000..3203d72910 --- /dev/null +++ b/.github/workflows/ci-backend.yml @@ -0,0 +1,214 @@ +name: Backend Tests +on: + push: + branches-ignore: + - 'translations**' + pull_request: + branches-ignore: + - 'translations**' + workflow_dispatch: +concurrency: + group: backend-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +env: + DEFAULT_UV_VERSION: "0.10.x" + NLTK_DATA: "/usr/share/nltk_data" +jobs: + changes: + name: Detect Backend Changes + runs-on: ubuntu-slim + outputs: + backend_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.backend == 'true' }} + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Decide run mode + id: force + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event_name }}" == "push" && ( "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "dev" ) ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + else + echo "run_all=false" >> "$GITHUB_OUTPUT" + fi + - name: Set diff range + id: range + if: steps.force.outputs.run_all != 'true' + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + echo "base=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event.created }}" == "true" ]]; then + echo "base=${{ github.event.repository.default_branch }}" >> "$GITHUB_OUTPUT" + else + echo "base=${{ github.event.before }}" >> "$GITHUB_OUTPUT" + fi + echo "ref=${{ github.sha }}" >> "$GITHUB_OUTPUT" + - name: Detect changes + id: filter + if: steps.force.outputs.run_all != 'true' + uses: dorny/paths-filter@v3.0.2 + with: + base: ${{ steps.range.outputs.base }} + ref: ${{ steps.range.outputs.ref }} + filters: | + backend: + - 'src/**' + - 'pyproject.toml' + - 'uv.lock' + - 'docker/compose/docker-compose.ci-test.yml' + - '.github/workflows/ci-backend.yml' + test: + needs: changes + if: needs.changes.outputs.backend_changed == 'true' + name: "Python ${{ matrix.python-version }}" + runs-on: ubuntu-24.04 + strategy: + matrix: + python-version: ['3.11', '3.12', '3.13', '3.14'] + fail-fast: false + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Start containers + run: | + docker compose --file docker/compose/docker-compose.ci-test.yml pull --quiet + docker compose --file docker/compose/docker-compose.ci-test.yml up --detach + - name: Set up Python + id: setup-python + uses: actions/setup-python@v6.2.0 + with: + python-version: "${{ matrix.python-version }}" + - name: Install uv + uses: astral-sh/setup-uv@v7.3.1 + with: + version: ${{ env.DEFAULT_UV_VERSION }} + enable-cache: true + python-version: ${{ steps.setup-python.outputs.python-version }} + - name: Install system dependencies + run: | + sudo apt-get update -qq + sudo apt-get install -qq --no-install-recommends \ + unpaper tesseract-ocr imagemagick ghostscript poppler-utils + - name: Configure ImageMagick + run: | + sudo cp docker/rootfs/etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml + - name: Install Python dependencies + run: | + uv sync \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --group testing \ + --frozen + - name: List installed Python dependencies + run: | + uv pip list + - name: Install NLTK data + run: | + uv run python -m nltk.downloader punkt punkt_tab snowball_data stopwords -d ${{ env.NLTK_DATA }} + - name: Run tests + env: + NLTK_DATA: ${{ env.NLTK_DATA }} + PAPERLESS_CI_TEST: 1 + run: | + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --dev \ + --frozen \ + pytest + - name: Upload test results to Codecov + if: always() + uses: codecov/codecov-action@v5.5.2 + with: + flags: backend-python-${{ matrix.python-version }} + files: junit.xml + report_type: test_results + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5.5.2 + with: + flags: backend-python-${{ matrix.python-version }} + files: coverage.xml + report_type: coverage + - name: Stop containers + if: always() + run: | + docker compose --file docker/compose/docker-compose.ci-test.yml logs + docker compose --file docker/compose/docker-compose.ci-test.yml down + typing: + needs: changes + if: needs.changes.outputs.backend_changed == 'true' + name: Check project typing + runs-on: ubuntu-24.04 + env: + DEFAULT_PYTHON: "3.12" + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Set up Python + id: setup-python + uses: actions/setup-python@v6.2.0 + with: + python-version: "${{ env.DEFAULT_PYTHON }}" + - name: Install uv + uses: astral-sh/setup-uv@v7.3.1 + with: + version: ${{ env.DEFAULT_UV_VERSION }} + enable-cache: true + python-version: ${{ steps.setup-python.outputs.python-version }} + - name: Install Python dependencies + run: | + uv sync \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --group testing \ + --group typing \ + --frozen + - name: List installed Python dependencies + run: | + uv pip list + - name: Check typing (pyrefly) + continue-on-error: true + run: | + uv run pyrefly \ + check \ + src/ + - name: Cache Mypy + uses: actions/cache@v5.0.3 + with: + path: .mypy_cache + # Keyed by OS, Python version, and dependency hashes + key: ${{ runner.os }}-mypy-py${{ env.DEFAULT_PYTHON }}-${{ hashFiles('pyproject.toml', 'uv.lock') }} + restore-keys: | + ${{ runner.os }}-mypy-py${{ env.DEFAULT_PYTHON }}- + ${{ runner.os }}-mypy- + - name: Check typing (mypy) + continue-on-error: true + run: | + uv run mypy \ + --show-error-codes \ + --warn-unused-configs \ + src/ | uv run mypy-baseline filter + gate: + name: Backend CI Gate + needs: [changes, test, typing] + if: always() + runs-on: ubuntu-slim + steps: + - name: Check gate + run: | + if [[ "${{ needs.changes.outputs.backend_changed }}" != "true" ]]; then + echo "No backend-relevant changes detected." + exit 0 + fi + + if [[ "${{ needs.test.result }}" != "success" ]]; then + echo "::error::Backend test job result: ${{ needs.test.result }}" + exit 1 + fi + + if [[ "${{ needs.typing.result }}" != "success" ]]; then + echo "::error::Backend typing job result: ${{ needs.typing.result }}" + exit 1 + fi + + echo "Backend checks passed." diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml new file mode 100644 index 0000000000..2d6da2da9e --- /dev/null +++ b/.github/workflows/ci-docker.yml @@ -0,0 +1,254 @@ +name: Docker Build +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+-beta.rc[0-9]+' + branches: + - dev + - beta + pull_request: + branches: + - dev + - main + workflow_dispatch: +concurrency: + group: docker-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +env: + REGISTRY: ghcr.io +jobs: + build-arch: + name: Build ${{ matrix.arch }} + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + arch: amd64 + platform: linux/amd64 + - runner: ubuntu-24.04-arm + arch: arm64 + platform: linux/arm64 + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + outputs: + should-push: ${{ steps.check-push.outputs.should-push }} + push-external: ${{ steps.check-push.outputs.push-external }} + repository: ${{ steps.repo.outputs.name }} + ref-name: ${{ steps.ref.outputs.name }} + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Determine ref name + id: ref + run: | + ref_name="${GITHUB_HEAD_REF:-$GITHUB_REF_NAME}" + # Sanitize by replacing / with - for use in tags and cache keys + sanitized_ref="${ref_name//\//-}" + + echo "ref_name=${ref_name}" + echo "sanitized_ref=${sanitized_ref}" + + echo "name=${sanitized_ref}" >> $GITHUB_OUTPUT + - name: Check push permissions + id: check-push + env: + REF_NAME: ${{ steps.ref.outputs.name }} + run: | + # should-push: Should we push to GHCR? + # True for: + # 1. Pushes (tags/dev/beta) - filtered via the workflow triggers + # 2. Manual dispatch - always push to GHCR + # 3. Internal PRs where the branch name starts with 'feature-' or 'fix-' + + should_push="false" + if [[ "${{ github.event_name }}" == "push" ]]; then + should_push="true" + elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + should_push="true" + elif [[ "${{ github.event_name }}" == "pull_request" && "${{ github.event.pull_request.head.repo.full_name }}" == "${{ github.repository }}" ]]; then + if [[ "${REF_NAME}" == feature-* || "${REF_NAME}" == fix-* ]]; then + should_push="true" + fi + fi + + echo "should-push=${should_push}" + echo "should-push=${should_push}" >> $GITHUB_OUTPUT + + # push-external: Should we also push to Docker Hub and Quay.io? + # Only for main repo on dev/beta branches or version tags + push_external="false" + if [[ "${should_push}" == "true" && "${{ github.repository_owner }}" == "paperless-ngx" ]]; then + case "${REF_NAME}" in + dev|beta) + push_external="true" + ;; + esac + case "${{ github.ref }}" in + refs/tags/v*|*beta.rc*) + push_external="true" + ;; + esac + fi + echo "push-external=${push_external}" + echo "push-external=${push_external}" >> $GITHUB_OUTPUT + - name: Set repository name + id: repo + run: | + repo_name="${{ github.repository }}" + repo_name="${repo_name,,}" + + echo "repository=${repo_name}" + echo "name=${repo_name}" >> $GITHUB_OUTPUT + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4.0.0 + - name: Login to GitHub Container Registry + uses: docker/login-action@v4.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Maximize space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Docker metadata + id: docker-meta + uses: docker/metadata-action@v6.0.0 + with: + images: | + ${{ env.REGISTRY }}/${{ steps.repo.outputs.name }} + tags: | + type=ref,event=branch + type=raw,value=${{ steps.ref.outputs.name }},enable=${{ github.event_name == 'pull_request' }} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + - name: Build and push by digest + id: build + uses: docker/build-push-action@v7.0.0 + with: + context: . + file: ./Dockerfile + platforms: ${{ matrix.platform }} + labels: ${{ steps.docker-meta.outputs.labels }} + build-args: | + PNGX_TAG_VERSION=${{ steps.docker-meta.outputs.version }} + outputs: type=image,name=${{ env.REGISTRY }}/${{ steps.repo.outputs.name }},push-by-digest=true,name-canonical=true,push=${{ steps.check-push.outputs.should-push }} + cache-from: | + type=registry,ref=${{ env.REGISTRY }}/${{ steps.repo.outputs.name }}/cache/app:${{ steps.ref.outputs.name }}-${{ matrix.arch }} + type=registry,ref=${{ env.REGISTRY }}/${{ steps.repo.outputs.name }}/cache/app:dev-${{ matrix.arch }} + cache-to: ${{ steps.check-push.outputs.should-push == 'true' && format('type=registry,mode=max,ref={0}/{1}/cache/app:{2}-{3}', env.REGISTRY, steps.repo.outputs.name, steps.ref.outputs.name, matrix.arch) || '' }} + - name: Export digest + if: steps.check-push.outputs.should-push == 'true' + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + echo "digest=${digest}" + echo "${digest}" > "/tmp/digests/digest-${{ matrix.arch }}.txt" + - name: Upload digest + if: steps.check-push.outputs.should-push == 'true' + uses: actions/upload-artifact@v7.0.0 + with: + name: digests-${{ matrix.arch }} + path: /tmp/digests/digest-${{ matrix.arch }}.txt + if-no-files-found: error + retention-days: 1 + archive: false + merge-and-push: + name: Merge and Push Manifest + runs-on: ubuntu-24.04 + needs: build-arch + if: needs.build-arch.outputs.should-push == 'true' + permissions: + contents: read + packages: write + steps: + - name: Download digests + uses: actions/download-artifact@v8.0.0 + with: + path: /tmp/digests + pattern: digest-*.txt + merge-multiple: true + - name: List digests + run: | + echo "Downloaded digests:" + ls -la /tmp/digests/ + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4.0.0 + - name: Login to GitHub Container Registry + uses: docker/login-action@v4.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Login to Docker Hub + if: needs.build-arch.outputs.push-external == 'true' + uses: docker/login-action@v4.0.0 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Quay.io + if: needs.build-arch.outputs.push-external == 'true' + uses: docker/login-action@v4.0.0 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_ROBOT_TOKEN }} + - name: Docker metadata + id: docker-meta + uses: docker/metadata-action@v6.0.0 + with: + images: | + ${{ env.REGISTRY }}/${{ needs.build-arch.outputs.repository }} + tags: | + type=ref,event=branch + type=raw,value=${{ needs.build-arch.outputs.ref-name }},enable=${{ github.event_name == 'pull_request' }} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + - name: Create manifest list and push + working-directory: /tmp/digests + env: + REPOSITORY: ${{ needs.build-arch.outputs.repository }} + run: | + tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "${DOCKER_METADATA_OUTPUT_JSON}") + + digests="" + for digest_file in digest-*.txt; do + digest=$(cat "${digest_file}") + digests+="${{ env.REGISTRY }}/${REPOSITORY}@${digest} " + done + + echo "Creating manifest with tags: ${tags}" + echo "From digests: ${digests}" + + docker buildx imagetools create ${tags} ${digests} + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ fromJSON(steps.docker-meta.outputs.json).tags[0] }} + - name: Copy to Docker Hub + if: needs.build-arch.outputs.push-external == 'true' + env: + TAGS: ${{ steps.docker-meta.outputs.tags }} + GHCR_REPO: ${{ env.REGISTRY }}/${{ needs.build-arch.outputs.repository }} + run: | + for tag in ${TAGS}; do + dockerhub_tag="${tag/${GHCR_REPO}/docker.io/paperlessngx/paperless-ngx}" + echo "Copying ${tag} to ${dockerhub_tag}" + skopeo copy --all "docker://${tag}" "docker://${dockerhub_tag}" + done + - name: Copy to Quay.io + if: needs.build-arch.outputs.push-external == 'true' + env: + TAGS: ${{ steps.docker-meta.outputs.tags }} + GHCR_REPO: ${{ env.REGISTRY }}/${{ needs.build-arch.outputs.repository }} + run: | + for tag in ${TAGS}; do + quay_tag="${tag/${GHCR_REPO}/quay.io/paperlessngx/paperless-ngx}" + echo "Copying ${tag} to ${quay_tag}" + skopeo copy --all "docker://${tag}" "docker://${quay_tag}" + done diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml new file mode 100644 index 0000000000..81d31dffec --- /dev/null +++ b/.github/workflows/ci-docs.yml @@ -0,0 +1,132 @@ +name: Documentation +on: + push: + branches-ignore: + - 'translations**' + pull_request: + workflow_dispatch: +concurrency: + group: docs-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +permissions: + contents: read + pages: write + id-token: write +env: + DEFAULT_UV_VERSION: "0.10.x" + DEFAULT_PYTHON_VERSION: "3.12" +jobs: + changes: + name: Detect Docs Changes + runs-on: ubuntu-slim + outputs: + docs_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.docs == 'true' }} + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Decide run mode + id: force + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event_name }}" == "push" && ( "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "dev" ) ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + else + echo "run_all=false" >> "$GITHUB_OUTPUT" + fi + - name: Set diff range + id: range + if: steps.force.outputs.run_all != 'true' + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + echo "base=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event.created }}" == "true" ]]; then + echo "base=${{ github.event.repository.default_branch }}" >> "$GITHUB_OUTPUT" + else + echo "base=${{ github.event.before }}" >> "$GITHUB_OUTPUT" + fi + echo "ref=${{ github.sha }}" >> "$GITHUB_OUTPUT" + - name: Detect changes + id: filter + if: steps.force.outputs.run_all != 'true' + uses: dorny/paths-filter@v3.0.2 + with: + base: ${{ steps.range.outputs.base }} + ref: ${{ steps.range.outputs.ref }} + filters: | + docs: + - 'docs/**' + - 'zensical.toml' + - 'pyproject.toml' + - 'uv.lock' + - '.github/workflows/ci-docs.yml' + build: + needs: changes + if: needs.changes.outputs.docs_changed == 'true' + name: Build Documentation + runs-on: ubuntu-24.04 + steps: + - uses: actions/configure-pages@v5.0.0 + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Set up Python + id: setup-python + uses: actions/setup-python@v6.2.0 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Install uv + uses: astral-sh/setup-uv@v7.3.1 + with: + version: ${{ env.DEFAULT_UV_VERSION }} + enable-cache: true + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Install Python dependencies + run: | + uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen + - name: Build documentation + run: | + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --dev \ + --frozen \ + zensical build --clean + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@v4.0.0 + with: + path: site + name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} + deploy: + name: Deploy Documentation + needs: [changes, build] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' && needs.changes.outputs.docs_changed == 'true' + runs-on: ubuntu-24.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy GitHub Pages + uses: actions/deploy-pages@v4.0.5 + id: deployment + with: + artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} + gate: + name: Docs CI Gate + needs: [changes, build] + if: always() + runs-on: ubuntu-slim + steps: + - name: Check gate + run: | + if [[ "${{ needs.changes.outputs.docs_changed }}" != "true" ]]; then + echo "No docs-relevant changes detected." + exit 0 + fi + + if [[ "${{ needs.build.result }}" != "success" ]]; then + echo "::error::Docs build job result: ${{ needs.build.result }}" + exit 1 + fi + + echo "Docs checks passed." diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml new file mode 100644 index 0000000000..bfd2ee5e46 --- /dev/null +++ b/.github/workflows/ci-frontend.yml @@ -0,0 +1,273 @@ +name: Frontend Tests +on: + push: + branches-ignore: + - 'translations**' + pull_request: + branches-ignore: + - 'translations**' + workflow_dispatch: +concurrency: + group: frontend-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + changes: + name: Detect Frontend Changes + runs-on: ubuntu-slim + outputs: + frontend_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.frontend == 'true' }} + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Decide run mode + id: force + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event_name }}" == "push" && ( "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "dev" ) ]]; then + echo "run_all=true" >> "$GITHUB_OUTPUT" + else + echo "run_all=false" >> "$GITHUB_OUTPUT" + fi + - name: Set diff range + id: range + if: steps.force.outputs.run_all != 'true' + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + echo "base=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT" + elif [[ "${{ github.event.created }}" == "true" ]]; then + echo "base=${{ github.event.repository.default_branch }}" >> "$GITHUB_OUTPUT" + else + echo "base=${{ github.event.before }}" >> "$GITHUB_OUTPUT" + fi + echo "ref=${{ github.sha }}" >> "$GITHUB_OUTPUT" + - name: Detect changes + id: filter + if: steps.force.outputs.run_all != 'true' + uses: dorny/paths-filter@v3.0.2 + with: + base: ${{ steps.range.outputs.base }} + ref: ${{ steps.range.outputs.ref }} + filters: | + frontend: + - 'src-ui/**' + - '.github/workflows/ci-frontend.yml' + install-dependencies: + needs: changes + if: needs.changes.outputs.frontend_changed == 'true' + name: Install Dependencies + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Cache frontend dependencies + id: cache-frontend-deps + uses: actions/cache@v5.0.3 + with: + path: | + ~/.pnpm-store + ~/.cache + key: ${{ runner.os }}-frontend-${{ hashFiles('src-ui/pnpm-lock.yaml') }} + - name: Install dependencies + run: cd src-ui && pnpm install + lint: + name: Lint + needs: [changes, install-dependencies] + if: needs.changes.outputs.frontend_changed == 'true' + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Cache frontend dependencies + uses: actions/cache@v5.0.3 + with: + path: | + ~/.pnpm-store + ~/.cache + key: ${{ runner.os }}-frontend-${{ hashFiles('src-ui/pnpm-lock.yaml') }} + - name: Re-link Angular CLI + run: cd src-ui && pnpm link @angular/cli + - name: Run lint + run: cd src-ui && pnpm run lint + unit-tests: + name: "Unit Tests (${{ matrix.shard-index }}/${{ matrix.shard-count }})" + needs: [changes, install-dependencies] + if: needs.changes.outputs.frontend_changed == 'true' + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + node-version: [24.x] + shard-index: [1, 2, 3, 4] + shard-count: [4] + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Cache frontend dependencies + uses: actions/cache@v5.0.3 + with: + path: | + ~/.pnpm-store + ~/.cache + key: ${{ runner.os }}-frontend-${{ hashFiles('src-ui/pnpm-lock.yaml') }} + - name: Re-link Angular CLI + run: cd src-ui && pnpm link @angular/cli + - name: Run Jest unit tests + run: cd src-ui && pnpm run test --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }} + - name: Upload test results to Codecov + if: always() + uses: codecov/codecov-action@v5.5.2 + with: + flags: frontend-node-${{ matrix.node-version }} + directory: src-ui/ + report_type: test_results + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5.5.2 + with: + flags: frontend-node-${{ matrix.node-version }} + directory: src-ui/coverage/ + e2e-tests: + name: "E2E Tests (${{ matrix.shard-index }}/${{ matrix.shard-count }})" + needs: [changes, install-dependencies] + if: needs.changes.outputs.frontend_changed == 'true' + runs-on: ubuntu-24.04 + container: mcr.microsoft.com/playwright:v1.58.2-noble + env: + PLAYWRIGHT_BROWSERS_PATH: /ms-playwright + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + strategy: + fail-fast: false + matrix: + node-version: [24.x] + shard-index: [1, 2] + shard-count: [2] + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Cache frontend dependencies + uses: actions/cache@v5.0.3 + with: + path: | + ~/.pnpm-store + ~/.cache + key: ${{ runner.os }}-frontend-${{ hashFiles('src-ui/pnpm-lock.yaml') }} + - name: Re-link Angular CLI + run: cd src-ui && pnpm link @angular/cli + - name: Install dependencies + run: cd src-ui && pnpm install --no-frozen-lockfile + - name: Run Playwright E2E tests + run: cd src-ui && pnpm exec playwright test --shard ${{ matrix.shard-index }}/${{ matrix.shard-count }} + bundle-analysis: + name: Bundle Analysis + needs: [changes, unit-tests, e2e-tests] + if: needs.changes.outputs.frontend_changed == 'true' + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 2 + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Cache frontend dependencies + uses: actions/cache@v5.0.3 + with: + path: | + ~/.pnpm-store + ~/.cache + key: ${{ runner.os }}-frontend-${{ hashFiles('src-ui/pnpm-lock.yaml') }} + - name: Re-link Angular CLI + run: cd src-ui && pnpm link @angular/cli + - name: Build and analyze + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + run: cd src-ui && pnpm run build --configuration=production + gate: + name: Frontend CI Gate + needs: [changes, install-dependencies, lint, unit-tests, e2e-tests, bundle-analysis] + if: always() + runs-on: ubuntu-slim + steps: + - name: Check gate + run: | + if [[ "${{ needs.changes.outputs.frontend_changed }}" != "true" ]]; then + echo "No frontend-relevant changes detected." + exit 0 + fi + + if [[ "${{ needs['install-dependencies'].result }}" != "success" ]]; then + echo "::error::Frontend install job result: ${{ needs['install-dependencies'].result }}" + exit 1 + fi + + if [[ "${{ needs.lint.result }}" != "success" ]]; then + echo "::error::Frontend lint job result: ${{ needs.lint.result }}" + exit 1 + fi + + if [[ "${{ needs['unit-tests'].result }}" != "success" ]]; then + echo "::error::Frontend unit-tests job result: ${{ needs['unit-tests'].result }}" + exit 1 + fi + + if [[ "${{ needs['e2e-tests'].result }}" != "success" ]]; then + echo "::error::Frontend e2e-tests job result: ${{ needs['e2e-tests'].result }}" + exit 1 + fi + + if [[ "${{ needs['bundle-analysis'].result }}" != "success" ]]; then + echo "::error::Frontend bundle-analysis job result: ${{ needs['bundle-analysis'].result }}" + exit 1 + fi + + echo "Frontend checks passed." diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml new file mode 100644 index 0000000000..c4df7d893d --- /dev/null +++ b/.github/workflows/ci-lint.yml @@ -0,0 +1,24 @@ +name: Lint +on: + push: + branches-ignore: + - 'translations**' + pull_request: + branches-ignore: + - 'translations**' +concurrency: + group: lint-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + lint: + name: Linting via prek + runs-on: ubuntu-slim + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Install Python + uses: actions/setup-python@v6.2.0 + with: + python-version: "3.14" + - name: Run prek + uses: j178/prek-action@v1.1.1 diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml new file mode 100644 index 0000000000..bbd9e6b092 --- /dev/null +++ b/.github/workflows/ci-release.yml @@ -0,0 +1,238 @@ +name: Release +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+-beta.rc[0-9]+' +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false +env: + DEFAULT_UV_VERSION: "0.10.x" + DEFAULT_PYTHON_VERSION: "3.12" +jobs: + wait-for-docker: + name: Wait for Docker Build + runs-on: ubuntu-24.04 + steps: + - name: Wait for Docker build + uses: lewagon/wait-on-check-action@v1.5.0 + with: + ref: ${{ github.sha }} + check-name: 'Build Docker Image' + repo-token: ${{ secrets.GITHUB_TOKEN }} + wait-interval: 60 + build-release: + name: Build Release + needs: wait-for-docker + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + # ---- Frontend Build ---- + - name: Install pnpm + uses: pnpm/action-setup@v4.2.0 + with: + version: 10 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 + with: + node-version: 24.x + cache: 'pnpm' + cache-dependency-path: 'src-ui/pnpm-lock.yaml' + - name: Install frontend dependencies + run: cd src-ui && pnpm install + - name: Build frontend + run: cd src-ui && pnpm run build --configuration production + # ---- Backend Setup ---- + - name: Set up Python + id: setup-python + uses: actions/setup-python@v6.2.0 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Install uv + uses: astral-sh/setup-uv@v7.3.1 + with: + version: ${{ env.DEFAULT_UV_VERSION }} + enable-cache: true + python-version: ${{ steps.setup-python.outputs.python-version }} + - name: Install Python dependencies + run: | + uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen + - name: Install system dependencies + run: | + sudo apt-get update -qq + sudo apt-get install -qq --no-install-recommends gettext liblept5 + # ---- Build Documentation ---- + - name: Build documentation + run: | + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --dev \ + --frozen \ + zensical build --clean + # ---- Prepare Release ---- + - name: Generate requirements file + run: | + uv export --quiet --no-dev --all-extras --format requirements-txt --output-file requirements.txt + - name: Compile messages + run: | + cd src/ + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + manage.py compilemessages + - name: Collect static files + run: | + cd src/ + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + manage.py collectstatic --no-input --clear + - name: Assemble release package + run: | + mkdir -p dist/paperless-ngx/scripts + + for file_name in .dockerignore \ + .env \ + Dockerfile \ + pyproject.toml \ + uv.lock \ + requirements.txt \ + LICENSE \ + README.md \ + paperless.conf.example + do + cp --verbose ${file_name} dist/paperless-ngx/ + done + mv dist/paperless-ngx/paperless.conf.example dist/paperless-ngx/paperless.conf + + cp --recursive docker/ dist/paperless-ngx/docker + cp scripts/*.service scripts/*.sh scripts/*.socket dist/paperless-ngx/scripts/ + cp --recursive src/ dist/paperless-ngx/src + cp --recursive site/ dist/paperless-ngx/docs + mv static dist/paperless-ngx/ + + find dist/paperless-ngx -name "__pycache__" -type d -exec rm -rf {} + + - name: Create release archive + run: | + cd dist + sudo chown -R 1000:1000 paperless-ngx/ + tar -cJf paperless-ngx.tar.xz paperless-ngx/ + - name: Upload release artifact + uses: actions/upload-artifact@v7.0.0 + with: + name: release + path: dist/paperless-ngx.tar.xz + retention-days: 7 + publish-release: + name: Publish Release + needs: build-release + runs-on: ubuntu-24.04 + outputs: + prerelease: ${{ steps.get-version.outputs.prerelease }} + changelog: ${{ steps.create-release.outputs.body }} + version: ${{ steps.get-version.outputs.version }} + steps: + - name: Download release artifact + uses: actions/download-artifact@v8.0.0 + with: + name: release + path: ./ + - name: Get version info + id: get-version + run: | + echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT + if [[ "${{ github.ref_name }}" == *"-beta.rc"* ]]; then + echo "prerelease=true" >> $GITHUB_OUTPUT + else + echo "prerelease=false" >> $GITHUB_OUTPUT + fi + - name: Create release and changelog + id: create-release + uses: release-drafter/release-drafter@v6.2.0 + with: + name: Paperless-ngx ${{ steps.get-version.outputs.version }} + tag: ${{ steps.get-version.outputs.version }} + version: ${{ steps.get-version.outputs.version }} + prerelease: ${{ steps.get-version.outputs.prerelease }} + publish: true + commitish: main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload release archive + uses: shogo82148/actions-upload-release-asset@v1.9.2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.create-release.outputs.upload_url }} + asset_path: ./paperless-ngx.tar.xz + asset_name: paperless-ngx-${{ steps.get-version.outputs.version }}.tar.xz + asset_content_type: application/x-xz + # --------------------------------------------------------------------------- + # Append changelog to docs (only on non-prerelease) + # --------------------------------------------------------------------------- + append-changelog: + name: Append Changelog + needs: publish-release + if: needs.publish-release.outputs.prerelease == 'false' + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + ref: main + - name: Set up Python + id: setup-python + uses: actions/setup-python@v6.2.0 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Install uv + uses: astral-sh/setup-uv@v7.3.1 + with: + version: ${{ env.DEFAULT_UV_VERSION }} + enable-cache: true + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + - name: Update changelog + working-directory: docs + run: | + git branch ${{ needs.publish-release.outputs.version }}-changelog + git checkout ${{ needs.publish-release.outputs.version }}-changelog + + echo -e "# Changelog\n\n${{ needs.publish-release.outputs.changelog }}\n" > changelog-new.md + + echo "Manually linking usernames" + sed -i -r 's|@([a-zA-Z0-9_]+) \(\[#|[@\1](https://github.com/\1) ([#|g' changelog-new.md + + echo "Removing unneeded comment tags" + sed -i -r 's|@|@|g' changelog-new.md + + CURRENT_CHANGELOG=$(tail --lines +2 changelog.md) + echo -e "$CURRENT_CHANGELOG" >> changelog-new.md + mv changelog-new.md changelog.md + + uv run \ + --python ${{ steps.setup-python.outputs.python-version }} \ + --dev \ + prek run --files changelog.md || true + + git config --global user.name "github-actions" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git commit -am "Changelog ${{ needs.publish-release.outputs.version }} - GHA" + git push origin ${{ needs.publish-release.outputs.version }}-changelog + - name: Create pull request + uses: actions/github-script@v8.0.0 + with: + script: | + const { repo, owner } = context.repo; + const result = await github.rest.pulls.create({ + title: 'Documentation: Add ${{ needs.publish-release.outputs.version }} changelog', + owner, + repo, + head: '${{ needs.publish-release.outputs.version }}-changelog', + base: 'main', + body: 'This PR is auto-generated by CI.' + }); + github.rest.issues.addLabels({ + owner, + repo, + issue_number: result.data.number, + labels: ['documentation', 'skip-changelog'] + }); diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 17e9a4109c..0000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,675 +0,0 @@ -name: ci -on: - push: - tags: - # https://semver.org/#spec-item-2 - - 'v[0-9]+.[0-9]+.[0-9]+' - # https://semver.org/#spec-item-9 - - 'v[0-9]+.[0-9]+.[0-9]+-beta.rc[0-9]+' - branches-ignore: - - 'translations**' - pull_request: - branches-ignore: - - 'translations**' -env: - DEFAULT_UV_VERSION: "0.9.x" - # This is the default version of Python to use in most steps which aren't specific - DEFAULT_PYTHON_VERSION: "3.11" - NLTK_DATA: "/usr/share/nltk_data" -jobs: - detect-duplicate: - name: Detect Duplicate Run - runs-on: ubuntu-24.04 - outputs: - should_run: ${{ steps.check.outputs.should_run }} - steps: - - name: Check if workflow should run - id: check - uses: actions/github-script@v8 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - if (context.eventName !== 'push') { - core.info('Not a push event; running workflow.'); - core.setOutput('should_run', 'true'); - return; - } - - const ref = context.ref || ''; - if (!ref.startsWith('refs/heads/')) { - core.info('Push is not to a branch; running workflow.'); - core.setOutput('should_run', 'true'); - return; - } - - const branch = ref.substring('refs/heads/'.length); - const { owner, repo } = context.repo; - const prs = await github.paginate(github.rest.pulls.list, { - owner, - repo, - state: 'open', - head: `${owner}:${branch}`, - per_page: 100, - }); - - if (prs.length === 0) { - core.info(`No open PR found for ${branch}; running workflow.`); - core.setOutput('should_run', 'true'); - } else { - core.info(`Found ${prs.length} open PR(s) for ${branch}; skipping duplicate push run.`); - core.setOutput('should_run', 'false'); - } - pre-commit: - needs: - - detect-duplicate - if: needs.detect-duplicate.outputs.should_run == 'true' - name: Linting Checks - runs-on: ubuntu-24.04 - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - name: Install python - uses: actions/setup-python@v6 - with: - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Check files - uses: pre-commit/action@v3.0.1 - documentation: - name: "Build & Deploy Documentation" - runs-on: ubuntu-24.04 - needs: - - pre-commit - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Set up Python - id: setup-python - uses: actions/setup-python@v6 - with: - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Install uv - uses: astral-sh/setup-uv@v6 - with: - version: ${{ env.DEFAULT_UV_VERSION }} - enable-cache: true - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Install Python dependencies - run: | - uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen - - name: Make documentation - run: | - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - --dev \ - --frozen \ - mkdocs build --config-file ./mkdocs.yml - - name: Deploy documentation - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - run: | - echo "docs.paperless-ngx.com" > "${{ github.workspace }}/docs/CNAME" - git config --global user.name "${{ github.actor }}" - git config --global user.email "${{ github.actor }}@users.noreply.github.com" - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - --dev \ - --frozen \ - mkdocs gh-deploy --force --no-history - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: documentation - path: site/ - retention-days: 7 - tests-backend: - name: "Backend Tests (Python ${{ matrix.python-version }})" - runs-on: ubuntu-24.04 - needs: - - pre-commit - strategy: - matrix: - python-version: ['3.10', '3.11', '3.12'] - fail-fast: false - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Start containers - run: | - docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml pull --quiet - docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml up --detach - - name: Set up Python - id: setup-python - uses: actions/setup-python@v6 - with: - python-version: "${{ matrix.python-version }}" - - name: Install uv - uses: astral-sh/setup-uv@v6 - with: - version: ${{ env.DEFAULT_UV_VERSION }} - enable-cache: true - python-version: ${{ steps.setup-python.outputs.python-version }} - - name: Install system dependencies - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends unpaper tesseract-ocr imagemagick ghostscript libzbar0 poppler-utils - - name: Configure ImageMagick - run: | - sudo cp docker/rootfs/etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml - - name: Install Python dependencies - run: | - uv sync \ - --python ${{ steps.setup-python.outputs.python-version }} \ - --group testing \ - --frozen - - name: List installed Python dependencies - run: | - uv pip list - - name: Install or update NLTK dependencies - run: uv run python -m nltk.downloader punkt punkt_tab snowball_data stopwords -d ${{ env.NLTK_DATA }} - - name: Tests - env: - NLTK_DATA: ${{ env.NLTK_DATA }} - PAPERLESS_CI_TEST: 1 - # Enable paperless_mail testing against real server - PAPERLESS_MAIL_TEST_HOST: ${{ secrets.TEST_MAIL_HOST }} - PAPERLESS_MAIL_TEST_USER: ${{ secrets.TEST_MAIL_USER }} - PAPERLESS_MAIL_TEST_PASSWD: ${{ secrets.TEST_MAIL_PASSWD }} - run: | - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - --dev \ - --frozen \ - pytest - - name: Upload backend test results to Codecov - if: always() - uses: codecov/codecov-action@v5 - with: - flags: backend-python-${{ matrix.python-version }} - files: junit.xml - report_type: test_results - - name: Upload backend coverage to Codecov - uses: codecov/codecov-action@v5 - with: - flags: backend-python-${{ matrix.python-version }} - files: coverage.xml - - name: Stop containers - if: always() - run: | - docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml logs - docker compose --file ${{ github.workspace }}/docker/compose/docker-compose.ci-test.yml down - install-frontend-dependencies: - name: "Install Frontend Dependencies" - runs-on: ubuntu-24.04 - needs: - - pre-commit - steps: - - uses: actions/checkout@v5 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - name: Use Node.js 20 - uses: actions/setup-node@v5 - with: - node-version: 20.x - cache: 'pnpm' - cache-dependency-path: 'src-ui/pnpm-lock.yaml' - - name: Cache frontend dependencies - id: cache-frontend-deps - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - ~/.cache - key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }} - - name: Install dependencies - run: cd src-ui && pnpm install - tests-frontend: - name: "Frontend Unit Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})" - runs-on: ubuntu-24.04 - needs: - - install-frontend-dependencies - strategy: - fail-fast: false - matrix: - node-version: [20.x] - shard-index: [1, 2, 3, 4] - shard-count: [4] - steps: - - uses: actions/checkout@v5 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - name: Use Node.js 20 - uses: actions/setup-node@v5 - with: - node-version: 20.x - cache: 'pnpm' - cache-dependency-path: 'src-ui/pnpm-lock.yaml' - - name: Cache frontend dependencies - id: cache-frontend-deps - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - ~/.cache - key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }} - - name: Re-link Angular cli - run: cd src-ui && pnpm link @angular/cli - - name: Linting checks - run: cd src-ui && pnpm run lint - - name: Run Jest unit tests - run: cd src-ui && pnpm run test --max-workers=2 --shard=${{ matrix.shard-index }}/${{ matrix.shard-count }} - - name: Upload frontend test results to Codecov - if: always() - uses: codecov/codecov-action@v5 - with: - flags: frontend-node-${{ matrix.node-version }} - directory: src-ui/ - report_type: test_results - - name: Upload frontend coverage to Codecov - uses: codecov/codecov-action@v5 - with: - flags: frontend-node-${{ matrix.node-version }} - directory: src-ui/coverage/ - tests-frontend-e2e: - name: "Frontend E2E Tests (Node ${{ matrix.node-version }} - ${{ matrix.shard-index }}/${{ matrix.shard-count }})" - runs-on: ubuntu-24.04 - needs: - - install-frontend-dependencies - strategy: - fail-fast: false - matrix: - node-version: [20.x] - shard-index: [1, 2] - shard-count: [2] - steps: - - uses: actions/checkout@v5 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - name: Use Node.js 20 - uses: actions/setup-node@v5 - with: - node-version: 20.x - cache: 'pnpm' - cache-dependency-path: 'src-ui/pnpm-lock.yaml' - - name: Cache frontend dependencies - id: cache-frontend-deps - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - ~/.cache - key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/pnpm-lock.yaml') }} - - name: Re-link Angular cli - run: cd src-ui && pnpm link @angular/cli - - name: Cache Playwright browsers - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('src-ui/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-playwright- - - name: Install Playwright system dependencies - run: npx playwright install-deps - - name: Install dependencies - run: cd src-ui && pnpm install --no-frozen-lockfile - - name: Install Playwright - run: cd src-ui && pnpm exec playwright install - - name: Run Playwright e2e tests - run: cd src-ui && pnpm exec playwright test --shard ${{ matrix.shard-index }}/${{ matrix.shard-count }} - frontend-bundle-analysis: - name: "Frontend Bundle Analysis" - runs-on: ubuntu-24.04 - needs: - - tests-frontend - - tests-frontend-e2e - steps: - - uses: actions/checkout@v5 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - name: Use Node.js 20 - uses: actions/setup-node@v5 - with: - node-version: 20.x - cache: 'pnpm' - cache-dependency-path: 'src-ui/pnpm-lock.yaml' - - name: Cache frontend dependencies - id: cache-frontend-deps - uses: actions/cache@v4 - with: - path: | - ~/.pnpm-store - ~/.cache - key: ${{ runner.os }}-frontenddeps-${{ hashFiles('src-ui/package-lock.json') }} - - name: Re-link Angular cli - run: cd src-ui && pnpm link @angular/cli - - name: Build frontend and upload analysis - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - run: cd src-ui && pnpm run build --configuration=production - build-docker-image: - name: Build Docker image for ${{ github.ref_name }} - runs-on: ubuntu-24.04 - if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/feature-') || startsWith(github.ref, 'refs/heads/fix-') || github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/beta' || contains(github.ref, 'beta.rc') || startsWith(github.ref, 'refs/tags/v') || startsWith(github.ref, 'refs/heads/l10n_')) - concurrency: - group: ${{ github.workflow }}-build-docker-image-${{ github.ref_name }} - cancel-in-progress: true - needs: - - tests-backend - - tests-frontend - - tests-frontend-e2e - steps: - - name: Check pushing to Docker Hub - id: push-other-places - # Only push to Dockerhub from the main repo AND the ref is either: - # main - # dev - # beta - # a tag - # Otherwise forks would require a Docker Hub account and secrets setup - run: | - if [[ ${{ github.repository_owner }} == "paperless-ngx" && ( ${{ github.ref_name }} == "dev" || ${{ github.ref_name }} == "beta" || ${{ startsWith(github.ref, 'refs/tags/v') }} == "true" ) ]] ; then - echo "Enabling DockerHub image push" - echo "enable=true" >> $GITHUB_OUTPUT - else - echo "Not pushing to DockerHub" - echo "enable=false" >> $GITHUB_OUTPUT - fi - - name: Set ghcr repository name - id: set-ghcr-repository - run: | - ghcr_name=$(echo "${{ github.repository }}" | awk '{ print tolower($0) }') - echo "Name is ${ghcr_name}" - echo "ghcr-repository=${ghcr_name}" >> $GITHUB_OUTPUT - - name: Gather Docker metadata - id: docker-meta - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }} - name=paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }} - name=quay.io/paperlessngx/paperless-ngx,enable=${{ steps.push-other-places.outputs.enable }} - tags: | - # Tag branches with branch name - type=ref,event=branch - # Process semver tags - # For a tag x.y.z or vX.Y.Z, output an x.y.z and x.y image tag - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - - name: Checkout - uses: actions/checkout@v5 - # If https://github.com/docker/buildx/issues/1044 is resolved, - # the append input with a native arm64 arch could be used to - # significantly speed up building - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - with: - platforms: arm64 - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to Docker Hub - uses: docker/login-action@v3 - # Don't attempt to login if not pushing to Docker Hub - if: steps.push-other-places.outputs.enable == 'true' - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Login to Quay.io - uses: docker/login-action@v3 - # Don't attempt to login if not pushing to Quay.io - if: steps.push-other-places.outputs.enable == 'true' - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_ROBOT_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v6 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker-meta.outputs.tags }} - labels: ${{ steps.docker-meta.outputs.labels }} - build-args: | - PNGX_TAG_VERSION=${{ steps.docker-meta.outputs.version }} - # Get cache layers from this branch, then dev - # This allows new branches to get at least some cache benefits, generally from dev - cache-from: | - type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} - type=registry,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:dev - cache-to: | - type=registry,mode=max,ref=ghcr.io/${{ steps.set-ghcr-repository.outputs.ghcr-repository }}/builder/cache/app:${{ github.ref_name }} - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ fromJSON(steps.docker-meta.outputs.json).tags[0] }} - - name: Export frontend artifact from docker - run: | - docker create --name frontend-extract ${{ fromJSON(steps.docker-meta.outputs.json).tags[0] }} - docker cp frontend-extract:/usr/src/paperless/src/documents/static/frontend src/documents/static/frontend/ - - name: Upload frontend artifact - uses: actions/upload-artifact@v4 - with: - name: frontend-compiled - path: src/documents/static/frontend/ - retention-days: 7 - build-release: - name: "Build Release" - needs: - - build-docker-image - - documentation - runs-on: ubuntu-24.04 - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Set up Python - id: setup-python - uses: actions/setup-python@v6 - with: - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Install uv - uses: astral-sh/setup-uv@v6 - with: - version: ${{ env.DEFAULT_UV_VERSION }} - enable-cache: true - python-version: ${{ steps.setup-python.outputs.python-version }} - - name: Install Python dependencies - run: | - uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen - - name: Install system dependencies - run: | - sudo apt-get update -qq - sudo apt-get install -qq --no-install-recommends gettext liblept5 - - name: Download frontend artifact - uses: actions/download-artifact@v5 - with: - name: frontend-compiled - path: src/documents/static/frontend/ - - name: Download documentation artifact - uses: actions/download-artifact@v5 - with: - name: documentation - path: docs/_build/html/ - - name: Generate requirements file - run: | - uv export --quiet --no-dev --all-extras --format requirements-txt --output-file requirements.txt - - name: Compile messages - run: | - cd src/ - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - manage.py compilemessages - - name: Collect static files - run: | - cd src/ - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - manage.py collectstatic --no-input - - name: Move files - run: | - echo "Making dist folders" - for directory in dist \ - dist/paperless-ngx \ - dist/paperless-ngx/scripts; - do - mkdir --verbose --parents ${directory} - done - - echo "Copying basic files" - for file_name in .dockerignore \ - .env \ - Dockerfile \ - pyproject.toml \ - uv.lock \ - requirements.txt \ - LICENSE \ - README.md \ - paperless.conf.example - do - cp --verbose ${file_name} dist/paperless-ngx/ - done - mv --verbose dist/paperless-ngx/paperless.conf.example dist/paperless-ngx/paperless.conf - - echo "Copying Docker related files" - cp --recursive docker/ dist/paperless-ngx/docker - - echo "Copying startup scripts" - cp --verbose scripts/*.service scripts/*.sh scripts/*.socket dist/paperless-ngx/scripts/ - - echo "Copying source files" - cp --recursive src/ dist/paperless-ngx/src - echo "Copying documentation" - cp --recursive docs/_build/html/ dist/paperless-ngx/docs - - mv --verbose static dist/paperless-ngx - - name: Make release package - run: | - echo "Creating release archive" - cd dist - sudo chown -R 1000:1000 paperless-ngx/ - tar -cJf paperless-ngx.tar.xz paperless-ngx/ - - name: Upload release artifact - uses: actions/upload-artifact@v4 - with: - name: release - path: dist/paperless-ngx.tar.xz - retention-days: 7 - publish-release: - name: "Publish Release" - runs-on: ubuntu-24.04 - outputs: - prerelease: ${{ steps.get_version.outputs.prerelease }} - changelog: ${{ steps.create-release.outputs.body }} - version: ${{ steps.get_version.outputs.version }} - needs: - - build-release - if: github.ref_type == 'tag' && (startsWith(github.ref_name, 'v') || contains(github.ref_name, '-beta.rc')) - steps: - - name: Download release artifact - uses: actions/download-artifact@v5 - with: - name: release - path: ./ - - name: Get version - id: get_version - run: | - echo "version=${{ github.ref_name }}" >> $GITHUB_OUTPUT - if [[ ${{ contains(github.ref_name, '-beta.rc') }} == 'true' ]]; then - echo "prerelease=true" >> $GITHUB_OUTPUT - else - echo "prerelease=false" >> $GITHUB_OUTPUT - fi - - name: Create Release and Changelog - id: create-release - uses: release-drafter/release-drafter@v6 - with: - name: Paperless-ngx ${{ steps.get_version.outputs.version }} - tag: ${{ steps.get_version.outputs.version }} - version: ${{ steps.get_version.outputs.version }} - prerelease: ${{ steps.get_version.outputs.prerelease }} - publish: true # ensures release is not marked as draft - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload release archive - id: upload-release-asset - uses: shogo82148/actions-upload-release-asset@v1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: ./paperless-ngx.tar.xz - asset_name: paperless-ngx-${{ steps.get_version.outputs.version }}.tar.xz - asset_content_type: application/x-xz - append-changelog: - name: "Append Changelog" - runs-on: ubuntu-24.04 - needs: - - publish-release - if: needs.publish-release.outputs.prerelease == 'false' - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - ref: main - - name: Set up Python - id: setup-python - uses: actions/setup-python@v6 - with: - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Install uv - uses: astral-sh/setup-uv@v6 - with: - version: ${{ env.DEFAULT_UV_VERSION }} - enable-cache: true - python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - - name: Append Changelog to docs - id: append-Changelog - working-directory: docs - run: | - git branch ${{ needs.publish-release.outputs.version }}-changelog - git checkout ${{ needs.publish-release.outputs.version }}-changelog - echo -e "# Changelog\n\n${{ needs.publish-release.outputs.changelog }}\n" > changelog-new.md - echo "Manually linking usernames" - sed -i -r 's|@([a-zA-Z0-9_]+) \(\[#|[@\1](https://github.com/\1) ([#|g' changelog-new.md - echo "Removing unneeded comment tags" - sed -i -r 's|@|@|g' changelog-new.md - CURRENT_CHANGELOG=`tail --lines +2 changelog.md` - echo -e "$CURRENT_CHANGELOG" >> changelog-new.md - mv changelog-new.md changelog.md - uv run \ - --python ${{ steps.setup-python.outputs.python-version }} \ - --dev \ - pre-commit run --files changelog.md || true - git config --global user.name "github-actions" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -am "Changelog ${{ needs.publish-release.outputs.version }} - GHA" - git push origin ${{ needs.publish-release.outputs.version }}-changelog - - name: Create Pull Request - uses: actions/github-script@v8 - with: - script: | - const { repo, owner } = context.repo; - const result = await github.rest.pulls.create({ - title: 'Documentation: Add ${{ needs.publish-release.outputs.version }} changelog', - owner, - repo, - head: '${{ needs.publish-release.outputs.version }}-changelog', - base: 'main', - body: 'This PR is auto-generated by CI.' - }); - github.rest.issues.addLabels({ - owner, - repo, - issue_number: result.data.number, - labels: ['documentation', 'skip-changelog'] - }); diff --git a/.github/workflows/cleanup-tags.yml b/.github/workflows/cleanup-tags.yml index e0d81bb4a5..bc2ae655f2 100644 --- a/.github/workflows/cleanup-tags.yml +++ b/.github/workflows/cleanup-tags.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Clean temporary images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/ephemeral@v0.11.0 + uses: stumpylog/image-cleaner-action/ephemeral@v0.12.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" @@ -53,7 +53,7 @@ jobs: steps: - name: Clean untagged images if: "${{ env.TOKEN != '' }}" - uses: stumpylog/image-cleaner-action/untagged@v0.11.0 + uses: stumpylog/image-cleaner-action/untagged@v0.12.0 with: token: "${{ env.TOKEN }}" owner: "${{ github.repository_owner }}" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b8acfeeff0..32b1fc6380 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,10 +34,10 @@ jobs: # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6.0.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4.32.5 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -45,4 +45,4 @@ jobs: # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4.32.5 diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index b4b4cd2acc..63853f6c52 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -13,11 +13,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6.0.2 with: token: ${{ secrets.PNGX_BOT_PAT }} - name: crowdin action - uses: crowdin/github-action@v2 + uses: crowdin/github-action@v2.15.0 with: upload_translations: false download_translations: true diff --git a/.github/workflows/pr-bot.yml b/.github/workflows/pr-bot.yml index 8e3b7951d1..f36e9cd9f8 100644 --- a/.github/workflows/pr-bot.yml +++ b/.github/workflows/pr-bot.yml @@ -2,17 +2,28 @@ name: PR Bot on: pull_request_target: types: [opened] -permissions: - contents: read - pull-requests: write jobs: + anti-slop: + runs-on: ubuntu-latest + permissions: + contents: read + issues: read + pull-requests: write + steps: + - uses: peakoss/anti-slop@v0.2.1 + with: + max-failures: 4 + failure-add-pr-labels: 'ai' pr-bot: name: Automated PR Bot runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write steps: - name: Label PR by file path or branch name # see .github/labeler.yml for the labeler config - uses: actions/labeler@v6 + uses: actions/labeler@v6.0.1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Label by size @@ -26,7 +37,7 @@ jobs: fail_if_xl: 'false' excluded_files: /\.lock$/ /\.txt$/ ^src-ui/pnpm-lock\.yaml$ ^src-ui/messages\.xlf$ ^src/locale/en_US/LC_MESSAGES/django\.po$ - name: Label by PR title - uses: actions/github-script@v8 + uses: actions/github-script@v8.0.0 with: script: | const pr = context.payload.pull_request; @@ -52,7 +63,7 @@ jobs: } - name: Label bot-generated PRs if: ${{ contains(github.actor, 'dependabot') || contains(github.actor, 'crowdin-bot') }} - uses: actions/github-script@v8 + uses: actions/github-script@v8.0.0 with: script: | const pr = context.payload.pull_request; @@ -77,7 +88,7 @@ jobs: } - name: Welcome comment if: ${{ !contains(github.actor, 'bot') }} - uses: actions/github-script@v8 + uses: actions/github-script@v8.0.0 with: script: | const pr = context.payload.pull_request; diff --git a/.github/workflows/project-actions.yml b/.github/workflows/project-actions.yml index ed27a02559..289a83115c 100644 --- a/.github/workflows/project-actions.yml +++ b/.github/workflows/project-actions.yml @@ -19,6 +19,6 @@ jobs: if: github.event_name == 'pull_request_target' && (github.event.action == 'opened' || github.event.action == 'reopened') && github.event.pull_request.user.login != 'dependabot' steps: - name: Label PR with release-drafter - uses: release-drafter/release-drafter@v6 + uses: release-drafter/release-drafter@v6.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml index 75314918ba..93d41f5a6b 100644 --- a/.github/workflows/repo-maintenance.yml +++ b/.github/workflows/repo-maintenance.yml @@ -15,7 +15,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/stale@v10 + - uses: actions/stale@v10.2.0 with: days-before-stale: 7 days-before-close: 14 @@ -37,7 +37,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: dessant/lock-threads@v5 + - uses: dessant/lock-threads@v6.0.0 with: issue-inactive-days: '30' pr-inactive-days: '30' @@ -57,7 +57,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8 + - uses: actions/github-script@v8.0.0 with: script: | function sleep(ms) { @@ -114,7 +114,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8 + - uses: actions/github-script@v8.0.0 with: script: | function sleep(ms) { @@ -206,7 +206,7 @@ jobs: if: github.repository_owner == 'paperless-ngx' runs-on: ubuntu-24.04 steps: - - uses: actions/github-script@v8 + - uses: actions/github-script@v8.0.0 with: script: | function sleep(ms) { diff --git a/.github/workflows/translate-strings.yml b/.github/workflows/translate-strings.yml index f94191f192..220aee9cc3 100644 --- a/.github/workflows/translate-strings.yml +++ b/.github/workflows/translate-strings.yml @@ -11,19 +11,21 @@ jobs: contents: write steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6.0.2 + env: + GH_REF: ${{ github.ref }} # sonar rule:githubactions:S7630 - avoid injection with: token: ${{ secrets.PNGX_BOT_PAT }} - ref: ${{ github.head_ref }} + ref: ${{ env.GH_REF }} - name: Set up Python id: setup-python - uses: actions/setup-python@v6 + uses: actions/setup-python@v6.2.0 - name: Install system dependencies run: | sudo apt-get update -qq sudo apt-get install -qq --no-install-recommends gettext - name: Install uv - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@v7.3.1 with: enable-cache: true - name: Install backend python dependencies @@ -34,18 +36,18 @@ jobs: - name: Generate backend translation strings run: cd src/ && uv run manage.py makemessages -l en_US -i "samples*" - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v4.2.0 with: version: 10 - - name: Use Node.js 20 - uses: actions/setup-node@v5 + - name: Use Node.js 24 + uses: actions/setup-node@v6.3.0 with: - node-version: 20.x + node-version: 24.x cache: 'pnpm' cache-dependency-path: 'src-ui/pnpm-lock.yaml' - name: Cache frontend dependencies id: cache-frontend-deps - uses: actions/cache@v4 + uses: actions/cache@v5.0.3 with: path: | ~/.pnpm-store @@ -61,7 +63,7 @@ jobs: cd src-ui pnpm run ng extract-i18n - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v6 + uses: stefanzweifel/git-auto-commit-action@v7.1.0 with: file_pattern: 'src-ui/messages.xlf src/locale/en_US/LC_MESSAGES/django.po' commit_message: "Auto translate strings" diff --git a/.gitignore b/.gitignore index c7b5c4d8ed..c607f922d4 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ htmlcov/ .coverage .coverage.* .cache +.uv-cache nosetests.xml coverage.xml *,cover @@ -53,7 +54,7 @@ junit.xml # Django stuff: *.log -# MkDocs documentation +# Zensical documentation site/ # PyBuilder diff --git a/.mypy-baseline.txt b/.mypy-baseline.txt new file mode 100644 index 0000000000..2700bfc71c --- /dev/null +++ b/.mypy-baseline.txt @@ -0,0 +1,2453 @@ +src/documents/admin.py:0: error: "Callable[[DocumentAdmin, Any], Any]" has no attribute "short_description" [attr-defined] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/admin.py:0: error: Missing type parameters for generic type "ModelAdmin" [type-arg] +src/documents/admin.py:0: error: Missing type parameters for generic type "TabularInline" [type-arg] +src/documents/admin.py:0: error: Missing type parameters for generic type "TabularInline" [type-arg] +src/documents/admin.py:0: error: Skipping analyzing "auditlog.admin": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/admin.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/admin.py:0: error: Skipping analyzing "treenode.admin": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/barcodes.py:0: error: "Image" has no attribute "filename" [attr-defined] +src/documents/barcodes.py:0: error: Cannot find implementation or library stub for module named "zxingcpp" [import-not-found] +src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] +src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] +src/documents/bulk_download.py:0: error: Return type "None" of "add_document" incompatible with return type "Never" in supertype "BulkArchiveStrategy" [override] +src/documents/bulk_edit.py:0: error: "int" object is not iterable [misc] +src/documents/bulk_edit.py:0: error: "int" object is not iterable [misc] +src/documents/bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/bulk_edit.py:0: error: Incompatible return value type (got "Literal['ERROR']", expected "Literal['OK']") [return-value] +src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "Correspondent", expected "str | int") [misc] +src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "DocumentType", expected "str | int") [misc] +src/documents/bulk_edit.py:0: error: Incompatible type for lookup 'id': (got "StoragePath", expected "str | int") [misc] +src/documents/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "dict_items[Any, Any] | list[tuple[int, None]]", variable has type "list[int] | dict[Any, Any]") [assignment] +src/documents/bulk_edit.py:0: error: Invalid index type "str" for "dict[FieldDataType, str]"; expected type "FieldDataType" [index] +src/documents/bulk_edit.py:0: error: List comprehension has incompatible type List[tuple[int, None]]; expected List[int] [misc] +src/documents/bulk_edit.py:0: error: Missing named argument "p" for "remove" of "PageList" [call-arg] +src/documents/bulk_edit.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/bulk_edit.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/bulk_edit.py:0: error: Need type annotation for "to_create" (hint: "to_create: list[] = ...") [var-annotated] +src/documents/caching.py:0: error: Argument 1 to "hexlify" has incompatible type "bytes | None"; expected "Buffer" [arg-type] +src/documents/caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/caching.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/caching.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/caching.py:0: error: Need type annotation for "_data" [var-annotated] +src/documents/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "fit_transform" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "stem" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "stop_words_" [attr-defined] +src/documents/classifier.py:0: error: "None" has no attribute "transform" [attr-defined] +src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "CountVectorizer", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "LabelBinarizer", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "MLPClassifier", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "MLPClassifier", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "MLPClassifier", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "MLPClassifier", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "MultiLabelBinarizer", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "DocumentClassifier") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "frozenset[Any]", variable has type "None") [assignment] +src/documents/classifier.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/documents/classifier.py:0: error: List comprehension has incompatible type List[int]; expected List[list[int]] [misc] +src/documents/classifier.py:0: error: Module "sklearn.exceptions" has no attribute "InconsistentVersionWarning" [attr-defined] +src/documents/classifier.py:0: error: Skipping analyzing "nltk": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/classifier.py:0: error: Skipping analyzing "nltk.corpus": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/classifier.py:0: error: Skipping analyzing "nltk.stem": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/classifier.py:0: error: Skipping analyzing "nltk.tokenize": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/classifier.py:0: error: Unsupported right operand type for in ("None") [operator] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/conditionals.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "input_doc" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "metadata" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "renew_logging_group" [attr-defined] +src/documents/consumer.py:0: error: "ConsumerPluginMixin" has no attribute "status_mgr" [attr-defined] +src/documents/consumer.py:0: error: "None" not callable [misc] +src/documents/consumer.py:0: error: "None" object is not iterable [misc] +src/documents/consumer.py:0: error: "get_page_count" of "DocumentParser" does not return a value (it only ever returns None) [func-returns-value] +src/documents/consumer.py:0: error: Argument "data_type" to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type] +src/documents/consumer.py:0: error: Argument "logger" to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] +src/documents/consumer.py:0: error: Argument "text" to "_store" of "ConsumerPlugin" has incompatible type "Any | None"; expected "str" [arg-type] +src/documents/consumer.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | None"; expected "Path" [arg-type] +src/documents/consumer.py:0: error: Argument 2 to "parse_w_workflow_placeholders" has incompatible type "str | None"; expected "str" [arg-type] +src/documents/consumer.py:0: error: Argument 3 to "parse_w_workflow_placeholders" has incompatible type "str | None"; expected "str" [arg-type] +src/documents/consumer.py:0: error: Argument 3 to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] +src/documents/consumer.py:0: error: Argument 3 to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] +src/documents/consumer.py:0: error: Argument 4 to "parse_w_workflow_placeholders" has incompatible type "str | None"; expected "str" [arg-type] +src/documents/consumer.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "deleted_at" [union-attr] +src/documents/consumer.py:0: error: Item "None" of "Document | None" has no attribute "filename" [union-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 "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: 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] +src/documents/converters.py:0: error: List item 4 has incompatible type "Path"; expected "str" [list-item] +src/documents/converters.py:0: error: Skipping analyzing "img2pdf": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/data_models.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/data_models.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str") [assignment] +src/documents/data_models.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "__iter__" (not iterable) [union-attr] +src/documents/data_models.py:0: error: Item "Group" of "Group | dict[Any, Any]" has no attribute "__iter__" (not iterable) [union-attr] +src/documents/data_models.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr] +src/documents/data_models.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr] +src/documents/data_models.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/data_models.py:0: error: Value of type "Group | dict[Any, Any]" is not indexable [index] +src/documents/data_models.py:0: error: Value of type "Group | dict[Any, Any]" is not indexable [index] +src/documents/file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: "SharedByUser" has no attribute "model" [attr-defined] +src/documents/filters.py:0: error: "def wrapper(*args: Any, validation_prefix: Any = ..., **kwargs: Any) -> Any" has no attribute "__signature__" [attr-defined] +src/documents/filters.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] +src/documents/filters.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] +src/documents/filters.py:0: error: Argument "child" to "ListField" has incompatible type "BooleanField | None"; expected "Field[Any, Any, Any, Any]" [arg-type] +src/documents/filters.py:0: error: Argument "child" to "ListField" has incompatible type "BooleanField | None"; expected "Field[Any, Any, Any, Any]" [arg-type] +src/documents/filters.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a return 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 [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 [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 arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "CharField", variable has type "BooleanField | None") [assignment] +src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "Field[Any, Any, Any, Any]", variable has type "BooleanField | None") [assignment] +src/documents/filters.py:0: error: Incompatible types in assignment (expression has type "IntegerField", 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 "ListField", 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] +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 "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 parameters for generic type "Callable" [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] +src/documents/filters.py:0: error: Value of type "Any | None" is not indexable [index] +src/documents/index.py:0: error: "ManualResults" has no attribute "formatter" [attr-defined] +src/documents/index.py:0: error: "ManualResults" has no attribute "fragmenter" [attr-defined] +src/documents/index.py:0: error: "ManualResults" has no attribute "top_n" [attr-defined] +src/documents/index.py:0: error: "ManualResults" has no attribute "top_n" [attr-defined] +src/documents/index.py:0: error: Argument 1 to "len" has incompatible type "ManualResults"; expected "Sized" [arg-type] +src/documents/index.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/index.py:0: error: Item "str" of "Any | str" has no attribute "id" [union-attr] +src/documents/index.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "set" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "tuple" [type-arg] +src/documents/index.py:0: error: Missing type parameters for generic type "tuple" [type-arg] +src/documents/index.py:0: error: Name "page" already defined on line 0 [no-redef] +src/documents/index.py:0: error: Need type annotation for "saved_results" (hint: "saved_results: dict[, ] = ...") [var-annotated] +src/documents/index.py:0: error: Need type annotation for "termCounts" [var-annotated] +src/documents/index.py:0: error: Skipping analyzing "whoosh": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.fields": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.highlight": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.idsets": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.index": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.qparser": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.qparser.dateparse": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.qparser.plugins": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.reading": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.scoring": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.searching": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.util.times": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Skipping analyzing "whoosh.writing": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/index.py:0: error: Value of type "ManualResults" is not indexable [index] +src/documents/loggers.py:0: error: "LoggingMixin" has no attribute "logging_name" [attr-defined] +src/documents/mail.py:0: error: Incompatible types in assignment (expression has type "Message[str, str]", variable has type "bytes") [assignment] +src/documents/management/commands/convert_mariadb_uuid.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/convert_mariadb_uuid.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/convert_mariadb_uuid.py:0: error: Need type annotation for "new_field" [var-annotated] +src/documents/management/commands/convert_mariadb_uuid.py:0: error: Need type annotation for "old_field" [var-annotated] +src/documents/management/commands/document_archiver.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_archiver.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_consumer.py:0: error: "str" has no attribute "is_file" [attr-defined] +src/documents/management/commands/document_consumer.py:0: error: Argument 1 to "track" of "FileStabilityTracker" has incompatible type "str"; expected "Path" [arg-type] +src/documents/management/commands/document_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_consumer.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "str") [assignment] +src/documents/management/commands/document_create_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_exporter.py:0: error: Argument 1 to "add" of "set" has incompatible type "Path"; expected "str" [arg-type] +src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_exporter.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/management/commands/document_exporter.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/management/commands/document_exporter.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/management/commands/document_exporter.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/management/commands/document_exporter.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/management/commands/document_exporter.py:0: error: Missing type parameters for generic type "dict" [type-arg] +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 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] +src/documents/management/commands/document_importer.py:0: error: Argument 2 to "copy_file_with_basic_stats" has incompatible type "Path | None"; expected "Path | str" [arg-type] +src/documents/management/commands/document_importer.py:0: error: Attribute "version" already defined on line 0 [no-redef] +src/documents/management/commands/document_importer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_importer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_importer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_importer.py:0: error: Incompatible types in assignment (expression has type "str | None", base class "CryptMixin" defined the type as "str") [assignment] +src/documents/management/commands/document_importer.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/management/commands/document_importer.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/management/commands/document_importer.py:0: error: Missing type parameters for generic type "Generator" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/management/commands/document_importer.py:0: error: Need type annotation for "manifest_paths" (hint: "manifest_paths: list[] = ...") [var-annotated] +src/documents/management/commands/document_importer.py:0: error: Skipping analyzing "auditlog.registry": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/management/commands/document_index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_index.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_llmindex.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_llmindex.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_renamer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_renamer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_retagger.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_retagger.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_sanity_checker.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_sanity_checker.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_thumbnails.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/document_thumbnails.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/document_thumbnails.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/loaddata_stdin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/loaddata_stdin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/loaddata_stdin.py:0: error: Incompatible types in assignment (expression has type "tuple[Callable[[Any, Any], TextIO | Any], None]", target has type "tuple[Callable[[str, Literal['r', 'rb']], BufferedReader[_BufferedReaderStream]]]") [assignment] +src/documents/management/commands/manage_superuser.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/manage_superuser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/mixins.py:0: error: Attribute "kdf_algorithm" already defined on line 0 [no-redef] +src/documents/management/commands/mixins.py:0: error: Attribute "key_iterations" already defined on line 0 [no-redef] +src/documents/management/commands/mixins.py:0: error: Attribute "key_size" already defined on line 0 [no-redef] +src/documents/management/commands/mixins.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/mixins.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/management/commands/mixins.py:0: error: Incompatible types in assignment (expression has type "list[dict[str, Sequence[str]]]", variable has type "CryptFields") [assignment] +src/documents/management/commands/mixins.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/management/commands/mixins.py:0: error: Unsupported operand types for // ("None" and "int") [operator] +src/documents/management/commands/prune_audit_logs.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/prune_audit_logs.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/management/commands/prune_audit_logs.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/matching.py:0: error: Argument 1 to "existing_document_matches_workflow" has incompatible type "ConsumableDocument | Document"; expected "Document" [arg-type] +src/documents/matching.py:0: error: Argument 1 to "issubset" of "set" has incompatible type "set[int] | None"; expected "Iterable[Any]" [arg-type] +src/documents/matching.py:0: error: Argument 1 to "matches" has incompatible type "WorkflowTrigger"; expected "MatchingModel" [arg-type] +src/documents/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] +src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] +src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] +src/documents/matching.py:0: error: Incompatible types in assignment (expression has type "tuple[str]", variable has type "str") [assignment] +src/documents/matching.py:0: error: Unsupported left operand type for & ("None") [operator] +src/documents/matching.py:0: error: Unsupported left operand type for & ("None") [operator] +src/documents/matching.py:0: error: Value of type variable "AnyStr" of "fnmatch" cannot be "object" [type-var] +src/documents/migrations/0001_initial.py:0: error: Skipping analyzing "multiselectfield": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/migrations/0001_initial.py:0: error: Skipping analyzing "multiselectfield.db": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/migrations/0001_initial.py:0: error: Skipping analyzing "multiselectfield.db.fields": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/migrations/0008_sharelinkbundle.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/migrations/0008_sharelinkbundle.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/migrations/0012_savedview_visibility_to_ui_settings.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/migrations/0012_savedview_visibility_to_ui_settings.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/migrations/0012_savedview_visibility_to_ui_settings.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/models.py:0: error: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] +src/documents/models.py:0: error: Couldn't resolve related manager 'documents' for relation 'documents.models.Document.correspondent'. [django-manager-missing] +src/documents/models.py:0: error: Couldn't resolve related manager 'documents' for relation 'documents.models.Document.document_type'. [django-manager-missing] +src/documents/models.py:0: error: Couldn't resolve related manager 'documents' for relation 'documents.models.Document.storage_path'. [django-manager-missing] +src/documents/models.py:0: error: Couldn't resolve related manager 'fields' for relation 'documents.models.CustomFieldInstance.field'. [django-manager-missing] +src/documents/models.py:0: error: Couldn't resolve related manager 'runs' for relation 'documents.models.WorkflowRun.workflow'. [django-manager-missing] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/models.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "created" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "document" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "expiration" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "field" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "file_version" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "note" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "owner" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "run_at" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "slug" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "type" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "user" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_bool" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_date" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_float" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_int" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_long_text" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_monetary" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_select" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_text" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "value_url" [var-annotated] +src/documents/models.py:0: error: Need type annotation for "workflow" [var-annotated] +src/documents/models.py:0: error: Signature of "delete" incompatible with supertype "django.db.models.base.Model" [override] +src/documents/models.py:0: error: Skipping analyzing "auditlog.registry": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/models.py:0: error: Skipping analyzing "django_softdelete.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/models.py:0: error: Skipping analyzing "multiselectfield": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/models.py:0: error: Skipping analyzing "treenode.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/parsers.py:0: error: Incompatible return value type (got "str | Any", expected "type[DocumentParser] | None") [return-value] +src/documents/parsers.py:0: error: Invalid index type "str | Any" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/documents/parsers.py:0: error: Value of type "str | None" is not indexable [index] +src/documents/parsers.py:0: error: Value of type "str | None" is not indexable [index] +src/documents/parsers.py:0: error: Value of type "str | None" is not indexable [index] +src/documents/parsers.py:0: error: Value of type "str | None" is not indexable [index] +src/documents/parsers.py:0: error: Value of type "str | None" is not indexable [index] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/permissions.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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 parameters for generic type "QuerySet" [type-arg] +src/documents/permissions.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/plugins/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/plugins/helpers.py:0: error: Function is missing a type annotation [no-untyped-def] +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] +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: Argument 1 to "Path" has incompatible type "Path | None"; expected "str | PathLike[str]" [arg-type] +src/documents/sanity_checker.py:0: error: Cannot use Final inside a loop [misc] +src/documents/sanity_checker.py:0: error: Cannot use Final inside a loop [misc] +src/documents/sanity_checker.py:0: error: Cannot use Final inside a loop [misc] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/sanity_checker.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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: Missing type parameters for generic type "dict" [type-arg] +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] +src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] +src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] +src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] +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 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 | Sequence[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Sequence[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Sequence[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Sequence[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/documents/serialisers.py:0: error: Argument 1 to "len" has incompatible type "list[Any] | None"; expected "Sized" [arg-type] +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] +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] +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] +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] +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 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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [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 "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] +src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[DocumentType]", variable has type "type[Tag] | None") [assignment] +src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[SearchResultListSerializer]", base class "Meta" defined the type as "type[OwnedObjectListSerializer]") [assignment] +src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[StoragePath]", variable has type "type[Tag] | None") [assignment] +src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr] +src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] +src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" 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 "Any | None" has no attribute "name" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Any | None" has no attribute "name" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Any | None" has no attribute "pk" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Any | None" has no attribute "version" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] +src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] +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 parameters for generic type "Field" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Iterable" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ListSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ListSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "PrimaryKeyRelatedField" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "PrimaryKeyRelatedField" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "PrimaryKeyRelatedField" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "PrimaryKeyRelatedField" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/serialisers.py:0: error: Missing type parameters 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: 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] +src/documents/serialisers.py:0: error: Value of type "Match[str] | None" is not indexable [index] +src/documents/signals/handlers.py:0: error: "BaseDatabaseWrapper" has no attribute "close_pool" [attr-defined] +src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Path | Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | Any | None"; expected "Path" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 1 to "move" has incompatible type "Path | Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 1 to "move" has incompatible type "Path | Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "apply_assignment_to_document" has incompatible type "Document | ConsumableDocument"; expected "Document" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "apply_removal_to_document" has incompatible type "Document | ConsumableDocument"; expected "Document" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "match_correspondents" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "match_document_types" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "match_storage_paths" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "match_tags" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 2 to "validate_move" has incompatible type "Path | Any | None"; expected "Path" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 3 to "validate_move" has incompatible type "Path | Any | None"; expected "Path" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 5 to "_suggestion_printer" has incompatible type "Any | None"; expected "MatchingModel" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 5 to "_suggestion_printer" has incompatible type "Any | None"; expected "MatchingModel" [arg-type] +src/documents/signals/handlers.py:0: error: Argument 5 to "_suggestion_printer" has incompatible type "Any | None"; expected "MatchingModel" [arg-type] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/signals/handlers.py:0: error: Incompatible types in assignment (expression has type "list[Tag]", variable has type "set[Tag]") [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] +src/documents/signals/handlers.py:0: error: Item "None" of "Any | None" has no attribute "remove" [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: 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: 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] +src/documents/signals/handlers.py:0: error: Value of type variable "_StrPathT" of "move" cannot be "Path | Any | None" [type-var] +src/documents/tasks.py:0: error: Argument 1 to "create_source_path_directory" has incompatible type "Path | None"; expected "Path" [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 arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tasks.py:0: error: Function is missing a type annotation for one or more arguments [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 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: Incompatible types in assignment (expression has type "type[DocumentParser] | None", variable has type "type[DocumentParser]") [assignment] +src/documents/tasks.py:0: error: Missing type parameters for generic type "Task" [type-arg] +src/documents/tasks.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/tasks.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tasks.py:0: error: Skipping analyzing "whoosh.writing": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tasks.py:0: error: Value of type variable "_StrPathT" of "move" cannot be "Path | None" [type-var] +src/documents/templating/environment.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/templating/environment.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/templating/filepath.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/templating/filepath.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/templating/filepath.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/templating/filepath.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/templating/filepath.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/templating/filepath.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Tag, Tag]", variable has type "list[Tag]") [assignment] +src/documents/templating/filepath.py:0: error: Need type annotation for "field_data" [var-annotated] +src/documents/templating/filters.py:0: error: Incompatible types in assignment (expression has type "date | None", variable has type "str | datetime") [assignment] +src/documents/templating/filters.py:0: error: Incompatible types in assignment (expression has type "datetime | None", variable has type "date | datetime | str") [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: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/factories.py:0: error: Missing type parameters for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/factories.py:0: error: Missing type parameters for generic type "DjangoModelFactory" [type-arg] +src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] +src/documents/tests/test_admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] +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: Module "django.utils.timezone" does not explicitly export attribute "datetime" [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_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 type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [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 arguments [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_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: Value of type "Any | None" is not indexable [index] +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] +src/documents/tests/test_api_documents.py:0: error: Argument 1 to "assertCountEqual" of "TestCase" has incompatible type "list[int] | None"; expected "Iterable[Any]" [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 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 arguments [no-untyped-def] +src/documents/tests/test_api_documents.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_documents.py:0: error: Item "None" of "SavedViewFilterRule | None" has no attribute "value" [union-attr] +src/documents/tests/test_api_documents.py:0: error: Value of type "object" is not indexable [index] +src/documents/tests/test_api_documents.py:0: error: Value of type "object" is not indexable [index] +src/documents/tests/test_api_documents.py:0: error: Value of type variable "_StrPathT" of "copy" cannot be "Path | None" [type-var] +src/documents/tests/test_api_documents.py:0: error: Value of type variable "_StrPathT" of "copy" cannot be "Path | None" [type-var] +src/documents/tests/test_api_email.py:0: error: Function is missing a type annotation for one or more arguments [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: 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 arguments [no-untyped-def] +src/documents/tests/test_api_filter_by_custom_fields.py:0: error: List item 1 has incompatible type "list[str]"; expected "str" [list-item] +src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/tests/test_api_filter_by_custom_fields.py:0: error: Need type annotation for "documents" (hint: "documents: list[] = ...") [var-annotated] +src/documents/tests/test_api_objects.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_objects.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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 type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_permissions.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None" has no attribute "owner" [union-attr] +src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None" has no attribute "owner" [union-attr] +src/documents/tests/test_api_permissions.py:0: error: Item "None" of "Tag | None" has no attribute "owner" [union-attr] +src/documents/tests/test_api_permissions.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_permissions.py:0: error: Skipping analyzing "allauth.mfa.totp.internal": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] +src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] +src/documents/tests/test_api_profile.py:0: error: "User" has no attribute "socialaccount_set"; maybe "mailaccount_set"? [attr-defined] +src/documents/tests/test_api_profile.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_profile.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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 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 arguments [no-untyped-def] +src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_search.py:0: error: Function is missing a type annotation for one or more arguments [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: Skipping analyzing "whoosh.writing": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_status.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_api_tasks.py:0: error: Function is missing a type annotation for one or more arguments [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] +src/documents/tests/test_barcodes.py:0: error: Argument 1 to "get_reader" of "GetReaderPluginMixin" has incompatible type "str"; expected "Path" [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: 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] +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] +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] +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] +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] +src/documents/tests/test_barcodes.py:0: error: Need type annotation for "reader" [var-annotated] +src/documents/tests/test_barcodes.py:0: error: The return type of a generator function should be "Generator" or one of its supertypes [misc] +src/documents/tests/test_barcodes.py:0: error: The return type of a generator function should be "Generator" or one of its supertypes [misc] +src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_correspondent" has incompatible type "None"; expected "Correspondent" [arg-type] +src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_correspondent" has incompatible type "int"; expected "Correspondent" [arg-type] +src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_document_type" has incompatible type "None"; expected "DocumentType" [arg-type] +src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_document_type" has incompatible type "int"; expected "DocumentType" [arg-type] +src/documents/tests/test_bulk_edit.py:0: error: Argument 2 to "set_storage_path" has incompatible type "None"; 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: 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 for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_bulk_edit.py:0: error: Function is missing a type annotation for one or more arguments [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] +src/documents/tests/test_bulk_edit.py:0: error: Too few arguments for "count" of "list" [call-arg] +src/documents/tests/test_caching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "classes_" [attr-defined] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "classes_" [attr-defined] +src/documents/tests/test_classifier.py:0: error: "None" has no attribute "transform" [attr-defined] +src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] +src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] +src/documents/tests/test_classifier.py:0: error: Cannot assign to a method [method-assign] +src/documents/tests/test_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_classifier.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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 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] +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 type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_consumer.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/documents/tests/test_consumer.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/documents/tests/test_consumer.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +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 "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: No overload variant of "copy" matches argument types "Any", "None" [call-overload] +src/documents/tests/test_delayedquery.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_delayedquery.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_delayedquery.py:0: error: Need type annotation for "tests" [var-annotated] +src/documents/tests/test_delayedquery.py:0: error: Skipping analyzing "whoosh": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_double_sided.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_double_sided.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_double_sided.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] +src/documents/tests/test_file_handling.py:0: error: Argument 1 to "Path" has incompatible type "Any | 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 "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 "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: 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 arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_file_handling.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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_index.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_index.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timezone" [attr-defined] +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: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_management.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/tests/test_management_consumer.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management_exporter.py:0: error: Argument 1 to "call_command" has incompatible type "*list[object]"; expected "BaseCommand | str" [arg-type] +src/documents/tests/test_management_exporter.py:0: error: Argument 1 to "call_command" has incompatible type "*list[object]"; expected "BaseCommand | str" [arg-type] +src/documents/tests/test_management_exporter.py:0: error: Argument 1 to "call_command" has incompatible type "*list[object]"; expected "BaseCommand | str" [arg-type] +src/documents/tests/test_management_exporter.py:0: error: Argument 1 to "call_command" has incompatible type "*list[object]"; expected "BaseCommand | str" [arg-type] +src/documents/tests/test_management_exporter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_management_exporter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_management_exporter.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_management_exporter.py:0: error: Item "None" of "MailAccount | None" has no attribute "password" [union-attr] +src/documents/tests/test_management_exporter.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_management_fuzzy.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_management_retagger.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_management_superuser.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Cannot determine type of "apps" [has-type] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Cannot determine type of "apps" [has-type] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_saved_view_visibility.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_migration_share_link_bundle.py:0: error: Incompatible types in assignment (expression has type "str", base class "TestMigrations" defined the type as "None") [assignment] +src/documents/tests/test_models.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] +src/documents/tests/test_models.py:0: error: Item "None" of "Document | None" has no attribute "correspondent" [union-attr] +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_parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_sanity_check.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/test_sanity_check.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_sanity_check.py:0: error: Invalid index type "None" for "dict[int, list[dict[Any, Any]]]"; expected type "int" [index] +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 arguments [no-untyped-def] +src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_share_link_bundles.py:0: error: Function is missing a type annotation for one or more arguments [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: 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: Function is missing a type annotation for one or more arguments [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_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_tasks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "render" [attr-defined] +src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "render" [attr-defined] +src/documents/tests/test_views.py:0: error: "_MonkeyPatchedWSGIResponse" has no attribute "url" [attr-defined] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] +src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] +src/documents/tests/test_views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/documents/tests/test_views.py:0: error: Item "None" of "SuggestionCacheData | None" has no attribute "suggestions" [union-attr] +src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_views.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument "files" to "__call__" of "Task" has incompatible type "None"; expected "dict[Any, Any]" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "Any | str"; expected "Path" [arg-type] +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 "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] +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] +src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [arg-type] +src/documents/tests/test_workflows.py:0: error: Argument 1 to "run_workflows" has incompatible type "int"; expected "WorkflowTriggerType" [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: 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 arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/test_workflows.py:0: error: Function is missing a type annotation for one or more arguments [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: 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 parameters for generic type "QuerySet" [type-arg] +src/documents/tests/test_workflows.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/tests/test_workflows.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/tests/test_workflows.py:0: error: Missing type parameters for generic type "QuerySet" [type-arg] +src/documents/tests/test_workflows.py:0: error: Missing type parameters for generic type "QuerySet" [type-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] +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] +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] +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/utils.py:0: error: "Collection[str]" has no attribute "update" [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertEqual"; maybe "assertFilesEqual"? [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertEqual"; maybe "assertFilesEqual"? [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertFalse"; maybe "assertIsFile"? [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertFalse"; maybe "assertIsFile"? [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] +src/documents/tests/utils.py:0: error: "FileSystemAssertsMixin" has no attribute "assertTrue" [attr-defined] +src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] +src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] +src/documents/tests/utils.py:0: error: "GetConsumerMixin" has no attribute "dirs" [attr-defined] +src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "setUp" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "tearDown" undefined in superclass [misc] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "archive_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "consumption_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "consumption_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "data_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "index_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "logging_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "media_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "originals_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "scratch_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "scratch_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "settings_override" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "settings_override" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "static_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "static_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] +src/documents/tests/utils.py:0: error: "type[dirs@34]" has no attribute "thumbnail_dir" [attr-defined] +src/documents/tests/utils.py:0: error: Cannot determine type of "apps" [has-type] +src/documents/tests/utils.py:0: error: First argument to namedtuple() should be "dirs", not "Dirs" [name-match] +src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a type annotation [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/tests/utils.py:0: error: Function is missing a type annotation for one or more arguments [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 parameters for generic type "Callable" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/documents/tests/utils.py:0: error: Missing type parameters for generic type "tuple" [type-arg] +src/documents/tests/utils.py:0: error: Need type annotation for "payloads" (hint: "payloads: list[] = ...") [var-annotated] +src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "float | int") [assignment] +src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "float | int", variable has type "int | None") [assignment] +src/documents/utils.py:0: error: Missing type parameters for generic type "CompletedProcess" [type-arg] +src/documents/validators.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "filter_queryset" [attr-defined] +src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "get_queryset" [attr-defined] +src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] +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: "type[Model]" has no attribute "objects" [attr-defined] +src/documents/views.py:0: error: Argument "path" to "EmailAttachment" has incompatible type "Path | None"; expected "Path" [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] +src/documents/views.py:0: error: Argument 2 to "match_storage_paths" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/views.py:0: error: Argument 2 to "match_tags" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] +src/documents/views.py:0: error: Argument 4 to "autocomplete" has incompatible type "User | AnonymousUser | None"; expected "User | None" [arg-type] +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 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 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] +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] +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] +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] +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] +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] +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] +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] +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] +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] +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 for one or more arguments [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/views.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "dict[Any, Any]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Any]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Document]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "int", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[ArchiveOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] +src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[DelayedMoreLikeThisQuery]", variable has type "type[DelayedFullTextQuery]") [assignment] +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 "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 "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 parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "GenericViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "ReadOnlyModelViewSet" [type-arg] +src/documents/views.py:0: error: Missing type parameters for generic type "Serializer" [type-arg] +src/documents/views.py:0: error: Missing type parameters 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] +src/documents/views.py:0: error: Need type annotation for "doc" [var-annotated] +src/documents/views.py:0: error: Need type annotation for "docs" (hint: "docs: list[] = ...") [var-annotated] +src/documents/views.py:0: error: Need type annotation for "permission_classes" (hint: "permission_classes: list[] = ...") [var-annotated] +src/documents/views.py:0: error: Need type annotation for "ui_settings" (hint: "ui_settings: dict[, ] = ...") [var-annotated] +src/documents/views.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/views.py:0: error: Skipping analyzing "langdetect": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/documents/views.py:0: error: TypedDict key must be a string literal; expected one of ("pk", "correspondent", "document_type", "storage_path", "tags", ...) [literal-required] +src/documents/views.py:0: error: Unsupported operand types for + ("None" and "int") [operator] +src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[CustomField]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[Group]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[MailAccount]" is not indexable [index] +src/documents/views.py:0: error: Value of type "Iterable[MailRule]" is not indexable [index] +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 arguments [no-untyped-def] +src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/workflows/actions.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "Document") [assignment] +src/documents/workflows/actions.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "dict[Any, str]") [assignment] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "added" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "correspondent" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "correspondent" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "created" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "document_type" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "document_type" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "filename" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "original_filename" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "owner" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "pk" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "pk" [union-attr] +src/documents/workflows/actions.py:0: error: Item "ConsumableDocument" of "Document | ConsumableDocument" has no attribute "title" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "body" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "body" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "include_document" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "subject" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "subject" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "to" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionEmail | None" has no attribute "to" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "as_json" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "body" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "body" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "headers" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "headers" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "include_document" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "params" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "params" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "url" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "url" [union-attr] +src/documents/workflows/actions.py:0: error: Item "None" of "WorkflowActionWebhook | None" has no attribute "use_params" [union-attr] +src/documents/workflows/actions.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/workflows/actions.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/workflows/actions.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_groups"; maybe "assign_change_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_groups"; maybe "assign_change_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_users"; maybe "assign_change_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_change_users"; maybe "assign_change_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_custom_fields"; maybe "assign_custom_fields" or "assign_custom_fields_values"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_custom_fields"; maybe "assign_custom_fields" or "assign_custom_fields_values"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_tags"; maybe "assign_tags"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_tags"; maybe "assign_tags"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_view_groups"; maybe "assign_view_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_view_groups"; maybe "assign_view_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_view_users"; maybe "assign_view_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_assign_view_users"; maybe "assign_view_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_change_groups"; maybe "remove_change_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_change_groups"; maybe "remove_change_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_change_users"; maybe "remove_change_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_change_users"; maybe "remove_change_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_custom_fields"; maybe "remove_custom_fields" or "remove_all_custom_fields"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_custom_fields"; maybe "remove_custom_fields" or "remove_all_custom_fields"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_view_groups"; maybe "remove_view_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_view_groups"; maybe "remove_view_groups"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_view_users"; maybe "remove_view_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: "WorkflowAction" has no attribute "has_remove_view_users"; maybe "remove_view_users"? [attr-defined] +src/documents/workflows/mutations.py:0: error: Argument "data_type" to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type] +src/documents/workflows/mutations.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/mutations.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/mutations.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/mutations.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/mutations.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/workflows/mutations.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] +src/documents/workflows/mutations.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] +src/documents/workflows/mutations.py:0: error: Need type annotation for "permissions" [var-annotated] +src/documents/workflows/utils.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "_format_ip_for_url" of "WebhookTransport" has incompatible type "str | int"; expected "str" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "Cookies | CookieJar | dict[str, str] | list[tuple[str, str]] | None" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "Headers | Mapping[str, str] | Mapping[bytes, bytes] | Sequence[tuple[str, str]] | Sequence[tuple[bytes, bytes]] | None" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "Mapping[str, Any] | None" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "Mapping[str, IO[bytes] | bytes | str | tuple[str | None, IO[bytes] | bytes | str] | tuple[str | None, IO[bytes] | bytes | str, str | None] | tuple[str | None, IO[bytes] | bytes | str, str | None, Mapping[str, str]]] | Sequence[tuple[str, IO[bytes] | bytes | str | tuple[str | None, IO[bytes] | bytes | str] | tuple[str | None, IO[bytes] | bytes | str, str | None] | tuple[str | None, IO[bytes] | bytes | str, str | None, Mapping[str, str]]]] | None" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "URL | str" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "bool | UseClientDefault" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "float | tuple[float | None, float | None, float | None, float | None] | Timeout | None | UseClientDefault" [arg-type] +src/documents/workflows/webhooks.py:0: error: Argument 1 to "post" of "Client" has incompatible type "**dict[str, str | dict[Any, Any] | None]"; expected "tuple[str | bytes, str | bytes] | Callable[[Request], Request] | Auth | UseClientDefault" [arg-type] +src/documents/workflows/webhooks.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/documents/workflows/webhooks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/documents/workflows/webhooks.py:0: error: Incompatible return value type (got "str | int | None", expected "str | None") [return-value] +src/documents/workflows/webhooks.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/workflows/webhooks.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/documents/workflows/webhooks.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/adapter.py:0: error: Name "user" already defined on line 0 [no-redef] +src/paperless/adapter.py:0: error: Skipping analyzing "allauth.account.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/adapter.py:0: error: Skipping analyzing "allauth.core": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/adapter.py:0: error: Skipping analyzing "allauth.headless.tokens.strategies.sessions": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/adapter.py:0: error: Skipping analyzing "allauth.socialaccount.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/admin.py:0: error: "PaperlessUserForm" has no attribute "request" [attr-defined] +src/paperless/admin.py:0: error: "type[ModelForm[Any]]" has no attribute "request" [attr-defined] +src/paperless/admin.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/admin.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/admin.py:0: error: Item "None" of "dict[str, Any] | None" has no attribute "get" [union-attr] +src/paperless/admin.py:0: error: Missing type parameters for generic type "ModelForm" [type-arg] +src/paperless/admin.py:0: error: Missing type parameters for generic type "UserAdmin" [type-arg] +src/paperless/admin.py:0: error: Signature of "get_form" incompatible with supertype "django.contrib.admin.options.ModelAdmin" [override] +src/paperless/apps.py:0: error: Skipping analyzing "allauth.socialaccount.signals": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/asgi.py:0: error: Argument 1 to "URLRouter" has incompatible type "list[URLPattern]"; expected "list[_ExtendedURLPattern | URLRouter]" [arg-type] +src/paperless/auth.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/auth.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/auth.py:0: error: No return value expected [return-value] +src/paperless/auth.py:0: error: No return value expected [return-value] +src/paperless/auth.py:0: error: Return type "None" of "__call__" incompatible with return type "HttpResponseBase | Awaitable[HttpResponseBase]" in supertype "django.contrib.auth.middleware.RemoteUserMiddleware" [override] +src/paperless/auth.py:0: error: Skipping analyzing "allauth.mfa.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/checks.py:0: error: Argument 1 to "append" of "list" has incompatible type "Warning"; expected "Error" [arg-type] +src/paperless/checks.py:0: error: Argument 2 to "path_check" has incompatible type "Path | None"; expected "Path" [arg-type] +src/paperless/checks.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/checks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/config.py:0: error: Incompatible return value type (got "ApplicationConfiguration | None", expected "ApplicationConfiguration") [return-value] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/config.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +src/paperless/consumers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/consumers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/consumers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/consumers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/consumers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/consumers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/consumers.py:0: error: Item "None" of "UserLazyObject | None" has no attribute "groups" [union-attr] +src/paperless/consumers.py:0: error: Item "None" of "UserLazyObject | None" has no attribute "id" [union-attr] +src/paperless/consumers.py:0: error: Item "None" of "UserLazyObject | None" has no attribute "id" [union-attr] +src/paperless/consumers.py:0: error: Item "None" of "UserLazyObject | None" has no attribute "is_authenticated" [union-attr] +src/paperless/consumers.py:0: error: Item "None" of "UserLazyObject | None" has no attribute "is_superuser" [union-attr] +src/paperless/consumers.py:0: error: Item "UserLazyObject" of "UserLazyObject | None" has no attribute "groups" [union-attr] +src/paperless/consumers.py:0: error: Item "UserLazyObject" of "UserLazyObject | None" has no attribute "id" [union-attr] +src/paperless/consumers.py:0: error: Item "UserLazyObject" of "UserLazyObject | None" has no attribute "id" [union-attr] +src/paperless/consumers.py:0: error: Item "UserLazyObject" of "UserLazyObject | None" has no attribute "is_superuser" [union-attr] +src/paperless/db_cache.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/db_cache.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/db_cache.py:0: error: Skipping analyzing "cachalot.api": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/db_cache.py:0: error: Skipping analyzing "cachalot.utils": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/middleware.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/middleware.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/migrations/0001_initial.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/models.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: "PasswordValidationMixin" has no attribute "instance" [attr-defined] +src/paperless/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/serialisers.py:0: error: Item "None" of "str | None" has no attribute "replace" [union-attr] +src/paperless/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/paperless/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/paperless/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/paperless/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/paperless/serialisers.py:0: error: Missing type parameters for generic type "ModelSerializer" [type-arg] +src/paperless/serialisers.py:0: error: Need type annotation for "auth_token" [var-annotated] +src/paperless/serialisers.py:0: error: Signature of "run_validation" incompatible with supertype "rest_framework.fields.Field" [override] +src/paperless/serialisers.py:0: error: Skipping analyzing "allauth.mfa.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/serialisers.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/serialisers.py:0: error: Skipping analyzing "allauth.mfa.totp.internal.auth": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/serialisers.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/settings.py:0: error: "Sequence[str]" has no attribute "append" [attr-defined] +src/paperless/settings.py:0: error: "Sequence[str]" has no attribute "insert" [attr-defined] +src/paperless/settings.py:0: error: "object" has no attribute "update" [attr-defined] +src/paperless/settings.py:0: error: "object" has no attribute "update" [attr-defined] +src/paperless/settings.py:0: error: "object" has no attribute "update" [attr-defined] +src/paperless/settings.py:0: error: "object" has no attribute "update" [attr-defined] +src/paperless/settings.py:0: error: Argument 1 to "_parse_ignore_dates" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless/settings.py:0: error: Argument 1 to "append" of "list" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless/settings.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/paperless/settings.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/paperless/settings.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/paperless/settings.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +src/paperless/settings.py:0: error: Argument 2 to "__get_path" has incompatible type "str | None"; expected "PathLike[Any] | str" [arg-type] +src/paperless/settings.py:0: error: Argument 2 to "getenv" has incompatible type "None"; expected "Collection[str]" [arg-type] +src/paperless/settings.py:0: error: Argument 2 to "getenv" has incompatible type "None"; expected "Collection[str]" [arg-type] +src/paperless/settings.py:0: error: Argument 2 to "getenv" has incompatible type "None"; expected "Collection[str]" [arg-type] +src/paperless/settings.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/settings.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/settings.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/settings.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless/settings.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/settings.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/settings.py:0: error: Incompatible return value type (got "set[date]", expected "set[datetime]") [return-value] +src/paperless/settings.py:0: error: Incompatible return value type (got "tuple[str | None, str, str, str, str]", expected "tuple[str, str, str, str, str]") [return-value] +src/paperless/settings.py:0: error: Incompatible types in assignment (expression has type "bool", variable has type "str") [assignment] +src/paperless/settings.py:0: error: Incompatible types in assignment (expression has type "set[datetime]", variable has type "set[date]") [assignment] +src/paperless/settings.py:0: error: Missing type parameters for generic type "PathLike" [type-arg] +src/paperless/settings.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/paperless/settings.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/paperless/settings.py:0: error: No overload variant of "getenv" matches argument types "Collection[str]", "Collection[str]" [call-overload] +src/paperless/settings.py:0: error: Skipping analyzing "compression_middleware.middleware": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/signals.py:0: error: Function is missing a type annotation [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: Function is missing a type annotation for one or more arguments [no-untyped-def] +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_db_cache.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/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/test_settings.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_settings.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_signals.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] +src/paperless/tests/test_signals.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] +src/paperless/tests/test_utils.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_utils.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_utils.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: Item "None" of "BaseChannelLayer | None" has no attribute "group_send" [union-attr] +src/paperless/tests/test_websockets.py:0: error: TypedDict "_WebsocketTestScope" has no key "user" [typeddict-item] +src/paperless/tests/test_websockets.py:0: error: TypedDict "_WebsocketTestScope" has no key "user" [typeddict-item] +src/paperless/tests/test_websockets.py:0: error: TypedDict "_WebsocketTestScope" has no key "user" [typeddict-item] +src/paperless/tests/test_websockets.py:0: error: TypedDict "_WebsocketTestScope" has no key "user" [typeddict-item] +src/paperless/tests/test_websockets.py:0: error: TypedDict "_WebsocketTestScope" has no key "user" [typeddict-unknown-key] +src/paperless/urls.py:0: error: Argument 2 to "path" has incompatible type "_ASGIApplicationProtocol"; expected "Callable[..., HttpResponseBase]" [arg-type] +src/paperless/urls.py:0: error: Skipping analyzing "allauth.account": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/urls.py:0: error: Skipping analyzing "allauth.mfa.base": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/urls.py:0: error: Skipping analyzing "allauth.socialaccount": module is installed, but missing library stubs or py.typed marker [import-untyped] +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: 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] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless/views.py:0: error: Incompatible type for "user" of "Token" (got "User | AnonymousUser", expected "User | Combinable") [misc] +src/paperless/views.py:0: error: Incompatible type for lookup 'user': (got "User | AnonymousUser", expected "User | int | None") [misc] +src/paperless/views.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "socialaccount_set" [union-attr] +src/paperless/views.py:0: error: Item "None" of "Any | None" has no attribute "results" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "ai_enabled" [union-attr] +src/paperless/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "llm_embedding_backend" [union-attr] +src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] +src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] +src/paperless/views.py:0: error: Item "None" of "Page[Any] | None" has no attribute "paginator" [union-attr] +src/paperless/views.py:0: error: Item "None" of "User | AnonymousUser | None" has no attribute "save" [union-attr] +src/paperless/views.py:0: error: Item "None" of "User | AnonymousUser | None" has no attribute "save" [union-attr] +src/paperless/views.py:0: error: Item "None" of "User | AnonymousUser | None" has no attribute "set_password" [union-attr] +src/paperless/views.py:0: error: Item "User" of "User | AnonymousUser" has no attribute "socialaccount_set" [union-attr] +src/paperless/views.py:0: error: Item "_SupportsPagination[Any]" of "_SupportsPagination[Any] | Any" has no attribute "values_list" [union-attr] +src/paperless/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/paperless/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.base.internal.flows": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.recovery_codes.internal.flows": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.mfa.totp.internal": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.socialaccount.adapter": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless/views.py:0: error: Skipping analyzing "allauth.socialaccount.models": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/ai_classifier.py:0: error: Argument 1 to "parse_ai_response" has incompatible type "str"; expected "dict[Any, Any]" [arg-type] +src/paperless_ai/ai_classifier.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/paperless_ai/ai_classifier.py:0: error: Missing type parameters for generic type "dict" [type-arg] +src/paperless_ai/chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/chat.py:0: error: Item "AsyncGenerator[str, None]" of "Any | Generator[str, None, None] | AsyncGenerator[str, None]" has no attribute "__iter__" (not iterable) [union-attr] +src/paperless_ai/chat.py:0: error: Item "Response" of "Response | StreamingResponse | AsyncStreamingResponse | PydanticResponse" has no attribute "response_gen" [union-attr] +src/paperless_ai/client.py:0: error: Incompatible return value type (got "dict[str, Any]", expected "str") [return-value] +src/paperless_ai/indexing.py:0: error: Argument "persist_dir" to "from_defaults" of "StorageContext" has incompatible type "Path"; expected "str | None" [arg-type] +src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "FaissVectorStore" has incompatible type "Path"; expected "str" [arg-type] +src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "SimpleDocumentStore" has incompatible type "Path"; expected "str" [arg-type] +src/paperless_ai/indexing.py:0: error: Argument 1 to "from_persist_dir" of "SimpleIndexStore" has incompatible type "Path"; expected "str" [arg-type] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/indexing.py:0: error: Skipping analyzing "faiss": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_ai/matching.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/matching.py:0: error: Missing type parameters for generic type "list" [type-arg] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_classifier.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_ai_indexing.py:0: error: Return type "list[float]" of "_aget_query_embedding" incompatible with return type "Coroutine[Any, Any, list[float]]" in supertype "llama_index.core.base.embeddings.base.BaseEmbedding" [override] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_chat.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_client.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice[Any, Any, Any]" [index] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_embedding.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_correspondents_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_document_types_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_storage_paths_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument "user" to "match_tags_by_name" has incompatible type "None"; expected "User" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Argument 1 to "match_tags_by_name" has incompatible type "list[str | None]"; expected "list[str]" [arg-type] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_ai/tests/test_matching.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/admin.py:0: error: Missing type parameters for generic type "ModelAdmin" [type-arg] +src/paperless_mail/admin.py:0: error: Missing type parameters for generic type "ModelForm" [type-arg] +src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] +src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] +src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] +src/paperless_mail/mail.py:0: error: "Message[str, str]" has no attribute "_headers"; maybe "add_header"? [attr-defined] +src/paperless_mail/mail.py:0: error: Argument "original_file" to "ConsumableDocument" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 1 to "TagMailAction" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "Header | list[Header] | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "Header | list[Header] | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "bool | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "bool | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "int | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "int | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "str | Iterable[str] | UidRange | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "str | Iterable[str] | UidRange | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "str | list[str] | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "AND" has incompatible type "**dict[str, date]"; expected "str | list[str] | None" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "flag" of "BaseMailBox" has incompatible type "list[str] | None"; expected "str | Iterable[str]" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 2 to "insert" of "list" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 3 to "post_consume" of "BaseMailAction" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/mail.py:0: error: Argument 4 to "uid" of "IMAP4" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/mail.py:0: error: Incompatible return value type (got "MailBoxUnencrypted", expected "MailBox") [return-value] +src/paperless_mail/mail.py:0: error: Incompatible type for "uid" of "ProcessedMail" (got "str | None", expected "str | int | Combinable") [misc] +src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "MailBox", variable has type "MailBoxUnencrypted") [assignment] +src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "MailBoxStartTls", variable has type "MailBoxUnencrypted") [assignment] +src/paperless_mail/mail.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str") [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: 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: Incompatible types in assignment (expression has type "str", target has type "date") [assignment] +src/paperless_mail/mail.py:0: error: Missing type parameters for generic type "dict" [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] +src/paperless_mail/oauth.py:0: error: Argument "refresh_token" to "refresh_token" of "BaseOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Argument "refresh_token" to "refresh_token" of "BaseOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Argument 1 to "GoogleOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Argument 1 to "MicrosoftGraphOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Argument 2 to "GoogleOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Argument 2 to "MicrosoftGraphOAuth2" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_mail/oauth.py:0: error: Incompatible return value type (got "None", expected "GoogleOAuth2") [return-value] +src/paperless_mail/oauth.py:0: error: Incompatible return value type (got "None", expected "MicrosoftGraphOAuth2") [return-value] +src/paperless_mail/oauth.py:0: error: Incompatible types in assignment (expression has type "GoogleOAuth2", variable has type "None") [assignment] +src/paperless_mail/oauth.py:0: error: Incompatible types in assignment (expression has type "MicrosoftGraphOAuth2", variable has type "None") [assignment] +src/paperless_mail/parsers.py:0: error: "tuple[str, ...]" has no attribute "encode" [attr-defined] +src/paperless_mail/parsers.py:0: error: Argument 1 to "make_thumbnail_from_pdf" has incompatible type "None"; expected "Path" [arg-type] +src/paperless_mail/parsers.py:0: error: Argument 2 to "generate_pdf" of "MailDocumentParser" has incompatible type "int"; expected "PdfLayout | None" [arg-type] +src/paperless_mail/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "int", variable has type "PdfLayout | None") [assignment] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/paperless_mail/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "tuple[str, ...]") [assignment] +src/paperless_mail/parsers.py:0: error: Item "None" of "EmailAddress | None" has no attribute "full" [union-attr] +src/paperless_mail/parsers.py:0: error: Item "None" of "EmailAddress | None" has no attribute "full" [union-attr] +src/paperless_mail/parsers.py:0: error: Need type annotation for "result" (hint: "result: list[] = ...") [var-annotated] +src/paperless_mail/preprocessor.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/preprocessor.py:0: error: Skipping analyzing "gnupg": module is installed, but missing library stubs or py.typed marker [import-untyped] +src/paperless_mail/serialisers.py:0: error: Function is missing a return 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 [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 [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 [no-untyped-def] +src/paperless_mail/serialisers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/serialisers.py:0: error: Missing type parameters for generic type "PrimaryKeyRelatedField" [type-arg] +src/paperless_mail/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +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: "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@481]" has no attribute "filename" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@427]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@427]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message2@427]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@420]" has no attribute "from_" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@420]" has no attribute "from_values" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@479]" has no attribute "subject" [attr-defined] +src/paperless_mail/tests/test_mail.py:0: error: "type[message@532]" 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@427]"; 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@427]"; 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@420]"; 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@420]"; 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@420]"; 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@420]"; 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@479]"; 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@479]"; 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@479]"; 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@481]"; 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@481]"; 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@481]"; 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] +src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "att", not "Attachment" [name-match] +src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] +src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] +src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message", not "MailMessage" [name-match] +src/paperless_mail/tests/test_mail.py:0: error: First argument to namedtuple() should be "message2", not "MailMessage" [name-match] +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 [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_mail.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +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] +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] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/test_mail.py:0: error: Incompatible types in assignment (expression has type "filter[Never]", variable has type "list[MailMessage]") [assignment] +src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "id" [union-attr] +src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "id" [union-attr] +src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "match" [union-attr] +src/paperless_mail/tests/test_mail.py:0: error: Item "None" of "Correspondent | None" has no attribute "matching_algorithm" [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 "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 parameters 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: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_mail/tests/test_parsers.py:0: error: Argument 1 to "extract_metadata" of "MailDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_mail/tests/test_parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/tests/test_parsers.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] +src/paperless_mail/tests/test_parsers.py:0: error: Item "None" of "Request | None" has no attribute "url" [union-attr] +src/paperless_mail/tests/test_parsers_live.py:0: error: List item 0 has incompatible type "str | None"; expected "str | bytes | PathLike[str] | PathLike[bytes]" [list-item] +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] +src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] +src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] +src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] +src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] +src/paperless_mail/tests/test_preprocessor.py:0: error: "TestMailMessageGpgDecryptor" has no attribute "messageEncryptor" [attr-defined] +src/paperless_mail/tests/test_preprocessor.py:0: error: "type[TestMailMessageGpgDecryptor]" has no attribute "messageEncryptor" [attr-defined] +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: 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] +src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/views.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_mail/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] +src/paperless_mail/views.py:0: error: Missing type parameters for generic type "GenericAPIView" [type-arg] +src/paperless_mail/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/paperless_mail/views.py:0: error: Missing type parameters for generic type "ModelViewSet" [type-arg] +src/paperless_mail/views.py:0: error: Missing type parameters for generic type "ReadOnlyModelViewSet" [type-arg] +src/paperless_remote/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_remote/parsers.py:0: error: "None" has no attribute "open" [attr-defined] +src/paperless_remote/parsers.py:0: error: Argument "engine" to "RemoteEngineConfig" has incompatible type "str | None"; expected "str" [arg-type] +src/paperless_remote/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_remote/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_remote/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_remote/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_remote/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/paperless_remote/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_remote/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/paperless_remote/parsers.py:0: error: Return type "RemoteEngineConfig" of "get_settings" incompatible with return type "OcrConfig" in supertype "paperless_tesseract.parsers.RasterisedDocumentParser" [override] +src/paperless_remote/signals.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_remote/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_remote/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_remote/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_remote/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_remote/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/checks.py:0: error: Argument 1 to "append" of "list" has incompatible type "Error"; expected "Warning" [arg-type] +src/paperless_tesseract/checks.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_tesseract/checks.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/checks.py:0: error: List item 0 has incompatible type "str | None"; expected "str | bytes | PathLike[str] | PathLike[bytes]" [list-item] +src/paperless_tesseract/parsers.py:0: error: Argument "logger" to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] +src/paperless_tesseract/parsers.py:0: error: Argument "logger" to "run_subprocess" has incompatible type "LoggerAdapter[Logger]"; expected "Logger | None" [arg-type] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "Path", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/paperless_tesseract/parsers.py:0: error: List item 4 has incompatible type "Path"; expected "str" [list-item] +src/paperless_tesseract/parsers.py:0: error: List item 5 has incompatible type "Path"; expected "str" [list-item] +src/paperless_tesseract/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tesseract/tests/test_checks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_checks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_checks.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "assertIsFile" of "FileSystemAssertsMixin" has incompatible type "None"; expected "PathLike[Any] | str" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Argument 1 to "parse" of "RasterisedDocumentParser" has incompatible type "str"; expected "Path" [arg-type] +src/paperless_tesseract/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tesseract/tests/test_parser.py:0: error: Item "None" of "str | None" has no attribute "strip" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "color_conversion_strategy" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "deskew" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "language" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "max_image_pixels" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "mode" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "output_type" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "pages" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "save" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "unpaper_clean" [union-attr] +src/paperless_tesseract/tests/test_parser_custom_settings.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "user_args" [union-attr] +src/paperless_text/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_text/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_text/parsers.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "None") [assignment] +src/paperless_text/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_text/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Argument 1 to "make_thumbnail_from_pdf" has incompatible type "None"; expected "Path" [arg-type] +src/paperless_tika/parsers.py:0: error: Function is missing a return type annotation [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Function is missing a type annotation for one or more arguments [no-untyped-def] +src/paperless_tika/parsers.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "None") [assignment] +src/paperless_tika/signals.py:0: error: Function is missing a type annotation [no-untyped-def] +src/paperless_tika/signals.py:0: error: Function is missing a type annotation [no-untyped-def] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7c0167d94e..8d6456ff07 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,7 @@ # This file configures pre-commit hooks. # See https://pre-commit.com/ for general information # See https://pre-commit.com/hooks.html for a listing of possible hooks +# We actually run via https://github.com/j178/prek which is compatible repos: # General hooks - repo: https://github.com/pre-commit/pre-commit-hooks @@ -28,7 +29,7 @@ repos: - id: check-case-conflict - id: detect-private-key - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 + rev: v2.4.2 hooks: - id: codespell additional_dependencies: [tomli] @@ -37,7 +38,7 @@ repos: - json # See https://github.com/prettier/prettier/issues/15742 for the fork reason - repo: https://github.com/rbubley/mirrors-prettier - rev: 'v3.6.2' + rev: 'v3.8.1' hooks: - id: prettier types_or: @@ -45,16 +46,16 @@ repos: - ts - markdown additional_dependencies: - - prettier@3.3.3 - - 'prettier-plugin-organize-imports@4.1.0' + - prettier@3.8.1 + - 'prettier-plugin-organize-imports@4.3.0' # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.0 + rev: v0.15.6 hooks: - id: ruff-check - id: ruff-format - repo: https://github.com/tox-dev/pyproject-fmt - rev: "v2.11.0" + rev: "v2.12.1" hooks: - id: pyproject-fmt # Dockerfile hooks @@ -64,11 +65,11 @@ repos: - id: hadolint # Shell script hooks - repo: https://github.com/lovesegfault/beautysh - rev: v6.2.1 + rev: v6.4.3 hooks: - id: beautysh - additional_dependencies: - - setuptools + types: [file] + files: (\.sh$|/run$|/finish$) args: - "--tab" - repo: https://github.com/shellcheck-py/shellcheck-py @@ -76,7 +77,7 @@ repos: hooks: - id: shellcheck - repo: https://github.com/google/yamlfmt - rev: v0.18.0 + rev: v0.21.0 hooks: - id: yamlfmt exclude: "^src-ui/pnpm-lock.yaml" diff --git a/.prettierrc.js b/.prettierrc.js index e2c09cb325..362676a885 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -5,14 +5,6 @@ const config = { singleQuote: true, // https://prettier.io/docs/en/options.html#trailing-commas trailingComma: 'es5', - overrides: [ - { - files: ['docs/*.md'], - options: { - tabWidth: 4, - }, - }, - ], plugins: [require('prettier-plugin-organize-imports')], } diff --git a/.pyrefly-baseline.json b/.pyrefly-baseline.json new file mode 100644 index 0000000000..da084db229 --- /dev/null +++ b/.pyrefly-baseline.json @@ -0,0 +1,17368 @@ +{ + "errors": [ + { + "line": 94, + "column": 5, + "stop_line": 94, + "stop_column": 31, + "path": "src/documents/admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FunctionType` has no attribute `short_description`", + "concise_description": "Object of class `FunctionType` has no attribute `short_description`", + "severity": "error" + }, + { + "line": 245, + "column": 27, + "stop_line": 245, + "stop_column": 35, + "path": "src/documents/admin.py", + "code": -2, + "name": "unbound-name", + "description": "`LogEntry` may be uninitialized", + "concise_description": "`LogEntry` may be uninitialized", + "severity": "error" + }, + { + "line": 246, + "column": 25, + "stop_line": 246, + "stop_column": 33, + "path": "src/documents/admin.py", + "code": -2, + "name": "unbound-name", + "description": "`LogEntry` may be uninitialized", + "concise_description": "`LogEntry` may be uninitialized", + "severity": "error" + }, + { + "line": 239, + "column": 16, + "stop_line": 239, + "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 `/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/.local/share/uv/python/cpython-3.13.4-linux-x86_64-gnu/lib/python3.13\", \"/home/trenton/.local/share/uv/python/cpython-3.13.4-linux-x86_64-gnu/lib/python3.13/lib-dynload\", \"/home/trenton/projects/paperless-ngx/.venv/lib/python3.13/site-packages\"]", + "concise_description": "Cannot find module `zxingcpp`", + "severity": "error" + }, + { + "line": 323, + "column": 38, + "stop_line": 323, + "stop_column": 51, + "path": "src/documents/barcodes.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Image` has no attribute `filename`", + "concise_description": "Object of class `Image` has no attribute `filename`", + "severity": "error" + }, + { + "line": 77, + "column": 9, + "stop_line": 77, + "stop_column": 21, + "path": "src/documents/bulk_download.py", + "code": -2, + "name": "bad-override", + "description": "Class member `OriginalsOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner\n `OriginalsOnlyStrategy.add_document` has type `BoundMethod[OriginalsOnlyStrategy, (self: OriginalsOnlyStrategy, doc: Document) -> None]`, which is not assignable to `BoundMethod[OriginalsOnlyStrategy, (self: OriginalsOnlyStrategy, doc: Document) -> NoReturn]`, the type of `BulkArchiveStrategy.add_document`", + "concise_description": "Class member `OriginalsOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", + "severity": "error" + }, + { + "line": 82, + "column": 9, + "stop_line": 82, + "stop_column": 21, + "path": "src/documents/bulk_download.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ArchiveOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner\n `ArchiveOnlyStrategy.add_document` has type `BoundMethod[ArchiveOnlyStrategy, (self: ArchiveOnlyStrategy, doc: Document) -> None]`, which is not assignable to `BoundMethod[ArchiveOnlyStrategy, (self: ArchiveOnlyStrategy, doc: Document) -> NoReturn]`, the type of `BulkArchiveStrategy.add_document`", + "concise_description": "Class member `ArchiveOnlyStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", + "severity": "error" + }, + { + "line": 95, + "column": 9, + "stop_line": 95, + "stop_column": 21, + "path": "src/documents/bulk_download.py", + "code": -2, + "name": "bad-override", + "description": "Class member `OriginalAndArchiveStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner\n `OriginalAndArchiveStrategy.add_document` has type `BoundMethod[OriginalAndArchiveStrategy, (self: OriginalAndArchiveStrategy, doc: Document) -> None]`, which is not assignable to `BoundMethod[OriginalAndArchiveStrategy, (self: OriginalAndArchiveStrategy, doc: Document) -> NoReturn]`, the type of `BulkArchiveStrategy.add_document`", + "concise_description": "Class member `OriginalAndArchiveStrategy.add_document` overrides parent class `BulkArchiveStrategy` in an inconsistent manner", + "severity": "error" + }, + { + "line": 200, + "column": 16, + "stop_line": 200, + "stop_column": 23, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `Literal['ERROR']` is not assignable to declared return type `Literal['OK']`", + "concise_description": "Returned type `Literal['ERROR']` is not assignable to declared return type `Literal['OK']`", + "severity": "error" + }, + { + "line": 214, + "column": 9, + "stop_line": 216, + "stop_column": 60, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "bad-assignment", + "description": "`dict_items[Unknown, Unknown] | list[tuple[int, None]]` is not assignable to variable `add_custom_fields` with type `dict[Unknown, Unknown] | list[int]`", + "concise_description": "`dict_items[Unknown, Unknown] | list[tuple[int, None]]` is not assignable to variable `add_custom_fields` with type `dict[Unknown, Unknown] | list[int]`", + "severity": "error" + }, + { + "line": 220, + "column": 32, + "stop_line": 220, + "stop_column": 40, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "not-iterable", + "description": "Type `int` is not iterable", + "concise_description": "Type `int` is not iterable", + "severity": "error" + }, + { + "line": 222, + "column": 9, + "stop_line": 222, + "stop_column": 24, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "not-iterable", + "description": "Type `int` is not iterable", + "concise_description": "Type `int` is not iterable", + "severity": "error" + }, + { + "line": 228, + "column": 21, + "stop_line": 228, + "stop_column": 43, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `dict[CustomField.FieldDataType, str]`\n Argument `str` is not assignable to parameter `key` with type `CustomField.FieldDataType` in function `dict.__getitem__`", + "concise_description": "Cannot index into `dict[CustomField.FieldDataType, str]`", + "severity": "error" + }, + { + "line": 264, + "column": 5, + "stop_line": 267, + "stop_column": 18, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `QuerySet` has no attribute `hard_delete`", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "line": 536, + "column": 33, + "stop_line": 536, + "stop_column": 63, + "path": "src/documents/bulk_edit.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `p` in function `pikepdf._core.PageList.remove`", + "concise_description": "Missing argument `p` in function `pikepdf._core.PageList.remove`", + "severity": "error" + }, + { + "line": 772, + "column": 13, + "stop_line": 772, + "stop_column": 64, + "path": "src/documents/bulk_edit.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": 180, + "column": 25, + "stop_line": 180, + "stop_column": 55, + "path": "src/documents/caching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `binascii.hexlify`\n Protocol `Buffer` requires attribute `__buffer__`", + "concise_description": "Argument `bytes | None` is not assignable to parameter `data` with type `Buffer` in function `binascii.hexlify`", + "severity": "error" + }, + { + "line": 27, + "column": 1, + "stop_line": 27, + "stop_column": 12, + "path": "src/documents/checks.py", + "code": -2, + "name": "bad-specialization", + "description": "`(app_configs: Unknown, **kwargs: Unknown) -> list[django.core.checks.messages.Warning | builtins.Warning] | list[Unknown]` is not assignable to upper bound `_CheckCallable` of type variable `_C`", + "concise_description": "`(app_configs: Unknown, **kwargs: Unknown) -> list[django.core.checks.messages.Warning | builtins.Warning] | list[Unknown]` is not assignable to upper bound `_CheckCallable` of type variable `_C`", + "severity": "error" + }, + { + "line": 37, + "column": 21, + "stop_line": 37, + "stop_column": 25, + "path": "src/documents/checks.py", + "code": -2, + "name": "unexpected-keyword", + "description": "Unexpected keyword argument `hint` in function `BaseException.__init__`", + "concise_description": "Unexpected keyword argument `hint` in function `BaseException.__init__`", + "severity": "error" + }, + { + "line": 131, + "column": 40, + "stop_line": 131, + "stop_column": 66, + "path": "src/documents/classifier.py", + "code": -2, + "name": "missing-module-attribute", + "description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", + "concise_description": "Could not import `InconsistentVersionWarning` from `sklearn.exceptions`", + "severity": "error" + }, + { + "line": 307, + "column": 36, + "stop_line": 309, + "stop_column": 10, + "path": "src/documents/classifier.py", + "code": -2, + "name": "bad-assignment", + "description": "`ndarray[tuple[Any, ...], dtype[Any]] | spmatrix` is not assignable to `ndarray[tuple[Any, ...], dtype[Any]]`", + "concise_description": "`ndarray[tuple[Any, ...], dtype[Any]] | spmatrix` is not assignable to `ndarray[tuple[Any, ...], dtype[Any]]`", + "severity": "error" + }, + { + "line": 314, + "column": 44, + "stop_line": 314, + "stop_column": 48, + "path": "src/documents/classifier.py", + "code": -2, + "name": "bad-assignment", + "description": "`None` is not assignable to attribute `stop_words_` with type `set[Unknown]`", + "concise_description": "`None` is not assignable to attribute `stop_words_` with type `set[Unknown]`", + "severity": "error" + }, + { + "line": 327, + "column": 51, + "stop_line": 329, + "stop_column": 24, + "path": "src/documents/classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `spmatrix` has no attribute `ravel`", + "concise_description": "Object of class `spmatrix` has no attribute `ravel`", + "severity": "error" + }, + { + "line": 332, + "column": 42, + "stop_line": 332, + "stop_column": 88, + "path": "src/documents/classifier.py", + "code": -2, + "name": "bad-assignment", + "description": "`ndarray[tuple[Any, ...], dtype[Any]] | spmatrix` is not assignable to variable `labels_tags_vectorized` with type `ndarray[tuple[Any, ...], dtype[Any]]`", + "concise_description": "`ndarray[tuple[Any, ...], dtype[Any]] | spmatrix` is not assignable to variable `labels_tags_vectorized` with type `ndarray[tuple[Any, ...], dtype[Any]]`", + "severity": "error" + }, + { + "line": 424, + "column": 18, + "stop_line": 424, + "stop_column": 42, + "path": "src/documents/classifier.py", + "code": -2, + "name": "not-iterable", + "description": "`in` is not supported between `str` and `None`", + "concise_description": "`in` is not supported between `str` and `None`", + "severity": "error" + }, + { + "line": 430, + "column": 26, + "stop_line": 430, + "stop_column": 44, + "path": "src/documents/classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `stem`", + "concise_description": "Object of class `NoneType` has no attribute `stem`", + "severity": "error" + }, + { + "line": 487, + "column": 22, + "stop_line": 487, + "stop_column": 52, + "path": "src/documents/classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `transform`", + "concise_description": "Object of class `NoneType` has no attribute `transform`", + "severity": "error" + }, + { + "line": 522, + "column": 24, + "stop_line": 522, + "stop_column": 61, + "path": "src/documents/classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `inverse_transform`", + "concise_description": "Object of class `NoneType` has no attribute `inverse_transform`", + "severity": "error" + }, + { + "line": 79, + "column": 5, + "stop_line": 79, + "stop_column": 16, + "path": "src/documents/conditionals.py", + "code": -2, + "name": "unreachable", + "description": "This `return` statement is unreachable", + "concise_description": "This `return` statement is unreachable", + "severity": "error" + }, + { + "line": 93, + "column": 5, + "stop_line": 93, + "stop_column": 16, + "path": "src/documents/conditionals.py", + "code": -2, + "name": "unreachable", + "description": "This `return` statement is unreachable", + "concise_description": "This `return` statement is unreachable", + "severity": "error" + }, + { + "line": 109, + "column": 5, + "stop_line": 109, + "stop_column": 16, + "path": "src/documents/conditionals.py", + "code": -2, + "name": "unreachable", + "description": "This `return` statement is unreachable", + "concise_description": "This `return` statement is unreachable", + "severity": "error" + }, + { + "line": 122, + "column": 5, + "stop_line": 122, + "stop_column": 16, + "path": "src/documents/conditionals.py", + "code": -2, + "name": "unreachable", + "description": "This `return` statement is unreachable", + "concise_description": "This `return` statement is unreachable", + "severity": "error" + }, + { + "line": 68, + "column": 9, + "stop_line": 68, + "stop_column": 23, + "path": "src/documents/consumer.py", + "code": -2, + "name": "not-iterable", + "description": "Type `None` is not iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "line": 113, + "column": 26, + "stop_line": 113, + "stop_column": 35, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-count", + "description": "Expected 0 positional arguments, got 5 in function `object.__init__`", + "concise_description": "Expected 0 positional arguments, got 5 in function `object.__init__`", + "severity": "error" + }, + { + "line": 115, + "column": 9, + "stop_line": 115, + "stop_column": 33, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `renew_logging_group`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `renew_logging_group`", + "severity": "error" + }, + { + "line": 117, + "column": 25, + "stop_line": 117, + "stop_column": 38, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 117, + "column": 51, + "stop_line": 117, + "stop_column": 65, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `input_doc`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `input_doc`", + "severity": "error" + }, + { + "line": 127, + "column": 9, + "stop_line": 127, + "stop_column": 24, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `status_mgr`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `status_mgr`", + "severity": "error" + }, + { + "line": 134, + "column": 29, + "stop_line": 134, + "stop_column": 42, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 134, + "column": 55, + "stop_line": 134, + "stop_column": 68, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 135, + "column": 36, + "stop_line": 135, + "stop_column": 49, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 136, + "column": 20, + "stop_line": 136, + "stop_column": 33, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 137, + "column": 37, + "stop_line": 137, + "stop_column": 50, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 138, + "column": 20, + "stop_line": 138, + "stop_column": 33, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `metadata`", + "severity": "error" + }, + { + "line": 150, + "column": 9, + "stop_line": 150, + "stop_column": 17, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumerPluginMixin` has no attribute `log`", + "concise_description": "Object of class `ConsumerPluginMixin` has no attribute `log`", + "severity": "error" + }, + { + "line": 196, + "column": 17, + "stop_line": 196, + "stop_column": 25, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 273, + "column": 17, + "stop_line": 273, + "stop_column": 25, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 321, + "column": 25, + "stop_line": 325, + "stop_column": 26, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 326, + "column": 32, + "stop_line": 326, + "stop_column": 40, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 436, + "column": 66, + "stop_line": 436, + "stop_column": 70, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `content` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `content` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", + "severity": "error" + }, + { + "line": 481, + "column": 26, + "stop_line": 481, + "stop_column": 30, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `text` with type `str` in function `ConsumerPlugin._store`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `text` with type `str` in function `ConsumerPlugin._store`", + "severity": "error" + }, + { + "line": 523, + "column": 54, + "stop_line": 523, + "stop_column": 75, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "severity": "error" + }, + { + "line": 610, + "column": 13, + "stop_line": 610, + "stop_column": 31, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `correspondent_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `str | None` is not assignable to parameter `correspondent_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 611, + "column": 13, + "stop_line": 611, + "stop_column": 26, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `doc_type_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `str | None` is not assignable to parameter `doc_type_name` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 612, + "column": 13, + "stop_line": 612, + "stop_column": 27, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `owner_username` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `str | None` is not assignable to parameter `owner_username` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 731, + "column": 31, + "stop_line": 731, + "stop_column": 46, + "path": "src/documents/consumer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "severity": "error" + }, + { + "line": 804, + "column": 21, + "stop_line": 804, + "stop_column": 36, + "path": "src/documents/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": 805, + "column": 24, + "stop_line": 805, + "stop_column": 51, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `original_filename`", + "concise_description": "Object of class `NoneType` has no attribute `original_filename`", + "severity": "error" + }, + { + "line": 806, + "column": 30, + "stop_line": 806, + "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__`", + "concise_description": "Argument `object | Unknown` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 806, + "column": 58, + "stop_line": 806, + "stop_column": 76, + "path": "src/documents/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": 807, + "column": 28, + "stop_line": 807, + "stop_column": 40, + "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": 814, + "column": 65, + "stop_line": 814, + "stop_column": 77, + "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": 891, + "column": 16, + "stop_line": 891, + "stop_column": 51, + "path": "src/documents/consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `deleted_at`", + "concise_description": "Object of class `NoneType` has no attribute `deleted_at`", + "severity": "error" + }, + { + "line": 31, + "column": 13, + "stop_line": 37, + "stop_column": 14, + "path": "src/documents/converters.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 46, + "column": 24, + "stop_line": 46, + "stop_column": 49, + "path": "src/documents/converters.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `bytes | None` is not assignable to parameter `buffer` with type `Buffer` in function `_io.BufferedWriter.write`\n Protocol `Buffer` requires attribute `__buffer__`", + "concise_description": "Argument `bytes | None` is not assignable to parameter `buffer` with type `Buffer` in function `_io.BufferedWriter.write`", + "severity": "error" + }, + { + "line": 109, + "column": 13, + "stop_line": 112, + "stop_column": 26, + "path": "src/documents/data_models.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `values_list`", + "concise_description": "Object of class `list` has no attribute `values_list`", + "severity": "error" + }, + { + "line": 115, + "column": 13, + "stop_line": 118, + "stop_column": 26, + "path": "src/documents/data_models.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `values_list`", + "concise_description": "Object of class `list` has no attribute `values_list`", + "severity": "error" + }, + { + "line": 131, + "column": 26, + "stop_line": 131, + "stop_column": 43, + "path": "src/documents/data_models.py", + "code": -2, + "name": "not-iterable", + "description": "Type `Group` is not iterable", + "concise_description": "Type `Group` is not iterable", + "severity": "error" + }, + { + "line": 132, + "column": 35, + "stop_line": 132, + "stop_column": 59, + "path": "src/documents/data_models.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `Group`\n Object of class `Group` has no attribute `__getitem__`", + "concise_description": "Cannot index into `Group`", + "severity": "error" + }, + { + "line": 136, + "column": 26, + "stop_line": 136, + "stop_column": 43, + "path": "src/documents/data_models.py", + "code": -2, + "name": "not-iterable", + "description": "Type `Group` is not iterable", + "concise_description": "Type `Group` is not iterable", + "severity": "error" + }, + { + "line": 137, + "column": 37, + "stop_line": 137, + "stop_column": 61, + "path": "src/documents/data_models.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `Group`\n Object of class `Group` has no attribute `__getitem__`", + "concise_description": "Cannot index into `Group`", + "severity": "error" + }, + { + "line": 165, + "column": 22, + "stop_line": 165, + "stop_column": 65, + "path": "src/documents/data_models.py", + "code": -2, + "name": "bad-assignment", + "description": "`None` is not assignable to `str`", + "concise_description": "`None` is not assignable to `str`", + "severity": "error" + }, + { + "line": 174, + "column": 51, + "stop_line": 174, + "stop_column": 61, + "path": "src/documents/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `SharedByUser` has no attribute `model`", + "concise_description": "Object of class `SharedByUser` has no attribute `model`", + "severity": "error" + }, + { + "line": 227, + "column": 31, + "stop_line": 227, + "stop_column": 51, + "path": "src/documents/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 259, + "column": 25, + "stop_line": 259, + "stop_column": 66, + "path": "src/documents/filters.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 286, + "column": 47, + "stop_line": 286, + "stop_column": 76, + "path": "src/documents/filters.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `dict[Unknown | None, Unknown]` is not assignable to parameter `detail` with type `ErrorDetail | Mapping[str, Unknown] | Sequence[Unknown] | _StrPromise | dict[str, Unknown] | list[Unknown] | str | None` in function `rest_framework.exceptions.APIException.__init__`", + "concise_description": "Argument `dict[Unknown | None, Unknown]` is not assignable to parameter `detail` with type `ErrorDetail | Mapping[str, Unknown] | Sequence[Unknown] | _StrPromise | dict[str, Unknown] | list[Unknown] | str | None` in function `rest_framework.exceptions.APIException.__init__`", + "severity": "error" + }, + { + "line": 295, + "column": 5, + "stop_line": 295, + "stop_column": 26, + "path": "src/documents/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FunctionType` has no attribute `__signature__`", + "concise_description": "Object of class `FunctionType` has no attribute `__signature__`", + "severity": "error" + }, + { + "line": 600, + "column": 26, + "stop_line": 600, + "stop_column": 49, + "path": "src/documents/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ForeignObjectRel` has no attribute `deconstruct`\nObject of class `GenericForeignKey` has no attribute `deconstruct`", + "concise_description": "Object of class `ForeignObjectRel` has no attribute `deconstruct`\nObject of class `GenericForeignKey` has no attribute `deconstruct`", + "severity": "error" + }, + { + "line": 603, + "column": 17, + "stop_line": 603, + "stop_column": 28, + "path": "src/documents/filters.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Field[Unknown, Unknown] | ForeignObjectRel | GenericForeignKey` is not assignable to parameter `model_field` with type `Field[Unknown, Unknown]` in function `rest_framework.serializers.ModelSerializer.build_standard_field`", + "concise_description": "Argument `Field[Unknown, Unknown] | ForeignObjectRel | GenericForeignKey` is not assignable to parameter `model_field` with type `Field[Unknown, Unknown]` in function `rest_framework.serializers.ModelSerializer.build_standard_field`", + "severity": "error" + }, + { + "line": 660, + "column": 17, + "stop_line": 660, + "stop_column": 42, + "path": "src/documents/filters.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `set.__init__` called with arguments: (Any | None)\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `set.__init__` called with arguments: (Any | None)", + "severity": "error" + }, + { + "line": 845, + "column": 9, + "stop_line": 845, + "stop_column": 24, + "path": "src/documents/filters.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ObjectOwnedOrGrantedPermissionsFilter.filter_queryset` overrides parent class `ObjectPermissionsFilter` in an inconsistent manner\n `ObjectOwnedOrGrantedPermissionsFilter.filter_queryset` has type `BoundMethod[ObjectOwnedOrGrantedPermissionsFilter, (self: ObjectOwnedOrGrantedPermissionsFilter, request: Unknown, queryset: Unknown, view: Unknown) -> type[Any]]`, which is not assignable to `BoundMethod[ObjectOwnedOrGrantedPermissionsFilter, (self: ObjectOwnedOrGrantedPermissionsFilter, request: Unknown, queryset: Unknown, view: Unknown) -> QuerySet[Unknown, Unknown]]`, the type of `ObjectPermissionsFilter.filter_queryset`", + "concise_description": "Class member `ObjectOwnedOrGrantedPermissionsFilter.filter_queryset` overrides parent class `ObjectPermissionsFilter` in an inconsistent manner", + "severity": "error" + }, + { + "line": 858, + "column": 9, + "stop_line": 858, + "stop_column": 24, + "path": "src/documents/filters.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ObjectOwnedPermissionsFilter.filter_queryset` overrides parent class `ObjectPermissionsFilter` in an inconsistent manner\n `ObjectOwnedPermissionsFilter.filter_queryset` has type `BoundMethod[ObjectOwnedPermissionsFilter, (self: ObjectOwnedPermissionsFilter, request: Unknown, queryset: Unknown, view: Unknown) -> type[Any] | Unknown]`, which is not assignable to `BoundMethod[ObjectOwnedPermissionsFilter, (self: ObjectOwnedPermissionsFilter, request: Unknown, queryset: Unknown, view: Unknown) -> QuerySet[Unknown, Unknown]]`, the type of `ObjectPermissionsFilter.filter_queryset`", + "concise_description": "Class member `ObjectOwnedPermissionsFilter.filter_queryset` overrides parent class `ObjectPermissionsFilter` in an inconsistent manner", + "severity": "error" + }, + { + "line": 928, + "column": 25, + "stop_line": 928, + "stop_column": 45, + "path": "src/documents/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 138, + "column": 1, + "stop_line": 138, + "stop_column": 16, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `(*, optimize: bool | Unknown = False) -> AsyncWriter` is not assignable to parameter `func` with type `(*, optimize: bool | Unknown = False) -> Iterator[@_]` in function `contextlib.contextmanager`\n Protocol `Iterator` requires attribute `__next__`", + "concise_description": "Argument `(*, optimize: bool | Unknown = False) -> AsyncWriter` is not assignable to parameter `func` with type `(*, optimize: bool | Unknown = False) -> Iterator[@_]` in function `contextlib.contextmanager`", + "severity": "error" + }, + { + "line": 139, + "column": 45, + "stop_line": 139, + "stop_column": 56, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-return", + "description": "Generator function should return `Generator`", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "line": 151, + "column": 1, + "stop_line": 151, + "stop_column": 16, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `() -> Searcher` is not assignable to parameter `func` with type `() -> Iterator[@_]` in function `contextlib.contextmanager`\n Protocol `Iterator` requires attribute `__next__`", + "concise_description": "Argument `() -> Searcher` is not assignable to parameter `func` with type `() -> Iterator[@_]` in function `contextlib.contextmanager`", + "severity": "error" + }, + { + "line": 152, + "column": 30, + "stop_line": 152, + "stop_column": 38, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-return", + "description": "Generator function should return `Generator`", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "line": 187, + "column": 37, + "stop_line": 187, + "stop_column": 41, + "path": "src/documents/index.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `str` has no attribute `id`", + "concise_description": "Object of class `str` has no attribute `id`", + "severity": "error" + }, + { + "line": 211, + "column": 32, + "stop_line": 211, + "stop_column": 49, + "path": "src/documents/index.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": 257, + "column": 9, + "stop_line": 257, + "stop_column": 21, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-param-name-override", + "description": "Class member `MappedDocIdSet.__contains__` overrides parent class `DocIdSet` in an inconsistent manner\n Got parameter name `docnum`, expected `i`", + "concise_description": "Class member `MappedDocIdSet.__contains__` overrides parent class `DocIdSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 258, + "column": 50, + "stop_line": 258, + "stop_column": 58, + "path": "src/documents/index.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `docnum` in function `whoosh.reading.IndexReader.stored_fields`", + "concise_description": "Missing argument `docnum` in function `whoosh.reading.IndexReader.stored_fields`", + "severity": "error" + }, + { + "line": 344, + "column": 36, + "stop_line": 344, + "stop_column": 52, + "path": "src/documents/index.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `score`", + "concise_description": "Object of class `list` has no attribute `score`", + "severity": "error" + }, + { + "line": 380, + "column": 20, + "stop_line": 380, + "stop_column": 43, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-assignment", + "description": "`ManualResultsPage` is not assignable to variable `page` with type `ResultsPage`", + "concise_description": "`ManualResultsPage` is not assignable to variable `page` with type `ResultsPage`", + "severity": "error" + }, + { + "line": 447, + "column": 9, + "stop_line": 447, + "stop_column": 19, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DelayedFullTextQuery._get_query` overrides parent class `DelayedQuery` in an inconsistent manner\n `DelayedFullTextQuery._get_query` has type `BoundMethod[DelayedFullTextQuery, (self: DelayedFullTextQuery) -> tuple[Unknown, ...]]`, which is not assignable to `BoundMethod[DelayedFullTextQuery, (self: DelayedFullTextQuery) -> Never]`, the type of `DelayedQuery._get_query`", + "concise_description": "Class member `DelayedFullTextQuery._get_query` overrides parent class `DelayedQuery` in an inconsistent manner", + "severity": "error" + }, + { + "line": 485, + "column": 9, + "stop_line": 485, + "stop_column": 19, + "path": "src/documents/index.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DelayedMoreLikeThisQuery._get_query` overrides parent class `DelayedQuery` in an inconsistent manner\n `DelayedMoreLikeThisQuery._get_query` has type `BoundMethod[DelayedMoreLikeThisQuery, (self: DelayedMoreLikeThisQuery) -> tuple[Unknown, ...]]`, which is not assignable to `BoundMethod[DelayedMoreLikeThisQuery, (self: DelayedMoreLikeThisQuery) -> Never]`, the type of `DelayedQuery._get_query`", + "concise_description": "Class member `DelayedMoreLikeThisQuery._get_query` overrides parent class `DelayedQuery` in an inconsistent manner", + "severity": "error" + }, + { + "line": 637, + "column": 21, + "stop_line": 637, + "stop_column": 26, + "path": "src/documents/index.py", + "code": -2, + "name": "unbound-name", + "description": "`start` may be uninitialized", + "concise_description": "`start` may be uninitialized", + "severity": "error" + }, + { + "line": 638, + "column": 19, + "stop_line": 638, + "stop_column": 22, + "path": "src/documents/index.py", + "code": -2, + "name": "unbound-name", + "description": "`end` may be uninitialized", + "concise_description": "`end` may be uninitialized", + "severity": "error" + }, + { + "line": 13, + "column": 31, + "stop_line": 13, + "stop_column": 48, + "path": "src/documents/loggers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `LoggingMixin` has no attribute `logging_name`", + "concise_description": "Object of class `LoggingMixin` has no attribute `logging_name`", + "severity": "error" + }, + { + "line": 35, + "column": 9, + "stop_line": 35, + "stop_column": 15, + "path": "src/documents/management/commands/convert_mariadb_uuid.py", + "code": -2, + "name": "bad-override", + "description": "Class member `Command.handle` overrides parent class `BaseCommand` in an inconsistent manner\n `Command.handle` has type `BoundMethod[Command, (self: Command, **options: Unknown) -> None]`, which is not assignable to `BoundMethod[Command, (self: Command, *args: Any, **options: Any) -> str | None]`, the type of `BaseCommand.handle`", + "concise_description": "Class member `Command.handle` overrides parent class `BaseCommand` in an inconsistent manner", + "severity": "error" + }, + { + "line": 426, + "column": 41, + "stop_line": 426, + "stop_column": 50, + "path": "src/documents/management/commands/document_exporter.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | str` is not assignable to parameter `element` with type `str` in function `set.add`", + "concise_description": "Argument `Path | str` is not assignable to parameter `element` with type `str` in function `set.add`", + "severity": "error" + }, + { + "line": 571, + "column": 32, + "stop_line": 571, + "stop_column": 60, + "path": "src/documents/management/commands/document_exporter.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['exporter_key'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 572, + "column": 32, + "stop_line": 572, + "stop_column": 54, + "path": "src/documents/management/commands/document_exporter.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['fields'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 104, + "column": 38, + "stop_line": 104, + "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": 237, + "column": 14, + "stop_line": 237, + "stop_column": 18, + "path": "src/documents/management/commands/document_importer.py", + "code": -2, + "name": "bad-override", + "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" + }, + { + "line": 413, + "column": 50, + "stop_line": 413, + "stop_column": 71, + "path": "src/documents/management/commands/document_importer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "severity": "error" + }, + { + "line": 417, + "column": 62, + "stop_line": 417, + "stop_column": 83, + "path": "src/documents/management/commands/document_importer.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `dest` with type `Path | str` in function `documents.utils.copy_file_with_basic_stats`", + "concise_description": "Argument `Path | None` is not assignable to parameter `dest` with type `Path | str` in function `documents.utils.copy_file_with_basic_stats`", + "severity": "error" + }, + { + "line": 432, + "column": 39, + "stop_line": 432, + "stop_column": 65, + "path": "src/documents/management/commands/document_importer.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['model_name'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 433, + "column": 37, + "stop_line": 433, + "stop_column": 59, + "path": "src/documents/management/commands/document_importer.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['fields'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 14, + "column": 9, + "stop_line": 14, + "stop_column": 19, + "path": "src/documents/management/commands/loaddata_stdin.py", + "code": -2, + "name": "bad-override", + "description": "Class member `Command.parse_name` overrides parent class `Command` in an inconsistent manner\n `Command.parse_name` has type `BoundMethod[Command, (self: Command, fixture_name: Unknown) -> tuple[Literal['-'], Literal['json'], Literal['stdin']] | None]`, which is not assignable to `BoundMethod[Command, (self: Command, fixture_name: str) -> tuple[str, str | None, str | None]]`, the type of `Command.parse_name`", + "concise_description": "Class member `Command.parse_name` overrides parent class `Command` in an inconsistent manner", + "severity": "error" + }, + { + "line": 15, + "column": 45, + "stop_line": 15, + "stop_column": 75, + "path": "src/documents/management/commands/loaddata_stdin.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str | None, tuple[(str, _ReadBinaryMode) -> BufferedReader[_BufferedReaderStream]]]`\n Argument `tuple[(x: str, y: _ReadBinaryMode) -> TextIO | Any, None]` is not assignable to parameter `value` with type `tuple[(str, _ReadBinaryMode) -> BufferedReader[_BufferedReaderStream]]` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str | None, tuple[(str, _ReadBinaryMode) -> BufferedReader[_BufferedReaderStream]]]`", + "severity": "error" + }, + { + "line": 19, + "column": 9, + "stop_line": 19, + "stop_column": 22, + "path": "src/documents/management/commands/loaddata_stdin.py", + "code": -2, + "name": "bad-override", + "description": "Class member `Command.find_fixtures` overrides parent class `Command` in an inconsistent manner\n `Command.find_fixtures` has type `BoundMethod[Command, (self: Command, fixture_label: Unknown) -> list[tuple[str, str | None, str | None]] | list[tuple[str, None, str]]]`, which is not assignable to `BoundMethod[Command, (self: Command, fixture_label: str) -> list[tuple[str, str | None, str | None]]]`, the type of `Command.find_fixtures`", + "concise_description": "Class member `Command.find_fixtures` overrides parent class `Command` in an inconsistent manner", + "severity": "error" + }, + { + "line": 33, + "column": 28, + "stop_line": 33, + "stop_column": 47, + "path": "src/documents/management/commands/mixins.py", + "code": -2, + "name": "unsupported-operation", + "description": "`//` is not supported between `None` and `Literal[4]`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__rfloordiv__`", + "concise_description": "`//` is not supported between `None` and `Literal[4]`", + "severity": "error" + }, + { + "line": 94, + "column": 33, + "stop_line": 111, + "stop_column": 6, + "path": "src/documents/management/commands/mixins.py", + "code": -2, + "name": "bad-assignment", + "description": "`list[dict[str, list[str] | str]]` is not assignable to `CryptFields`", + "concise_description": "`list[dict[str, list[str] | str]]` is not assignable to `CryptFields`", + "severity": "error" + }, + { + "line": 19, + "column": 9, + "stop_line": 19, + "stop_column": 15, + "path": "src/documents/management/commands/prune_audit_logs.py", + "code": -2, + "name": "bad-override", + "description": "Class member `Command.handle` overrides parent class `BaseCommand` in an inconsistent manner\n `Command.handle` has type `BoundMethod[Command, (self: Command, **options: Unknown) -> None]`, which is not assignable to `BoundMethod[Command, (self: Command, *args: Any, **options: Any) -> str | None]`, the type of `BaseCommand.handle`", + "concise_description": "Class member `Command.handle` overrides parent class `BaseCommand` in an inconsistent manner", + "severity": "error" + }, + { + "line": 345, + "column": 24, + "stop_line": 348, + "stop_column": 10, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-specialization", + "description": "`Path` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", + "concise_description": "`Path` is not assignable to upper bound `bytes | str` of type variable `AnyStr`", + "severity": "error" + }, + { + "line": 347, + "column": 13, + "stop_line": 347, + "stop_column": 32, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `pat` with type `Path` in function `fnmatch.fnmatch`", + "concise_description": "Argument `str` is not assignable to parameter `pat` with type `Path` in function `fnmatch.fnmatch`", + "severity": "error" + }, + { + "line": 356, + "column": 12, + "stop_line": 356, + "stop_column": 37, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[bool, Literal[''] | tuple[str]]` is not assignable to declared return type `tuple[bool, str]`", + "concise_description": "Returned type `tuple[bool, Literal[''] | tuple[str]]` is not assignable to declared return type `tuple[bool, str]`", + "severity": "error" + }, + { + "line": 370, + "column": 9, + "stop_line": 370, + "stop_column": 16, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `WorkflowTrigger` is not assignable to parameter `matching_model` with type `MatchingModel` in function `matches`", + "concise_description": "Argument `WorkflowTrigger` is not assignable to parameter `matching_model` with type `MatchingModel` in function `matches`", + "severity": "error" + }, + { + "line": 395, + "column": 17, + "stop_line": 395, + "stop_column": 55, + "path": "src/documents/matching.py", + "code": -2, + "name": "unsupported-operation", + "description": "`&` is not supported between `None` and `set[Any]`\n Cannot find `__and__` or `__rand__`", + "concise_description": "`&` is not supported between `None` and `set[Any]`", + "severity": "error" + }, + { + "line": 405, + "column": 42, + "stop_line": 405, + "stop_column": 58, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `set[Any] | None` is not assignable to parameter `s` with type `Iterable[Any]` in function `set.issubset`\n Protocol `Iterable` requires attribute `__iter__`", + "concise_description": "Argument `set[Any] | None` is not assignable to parameter `s` with type `Iterable[Any]` in function `set.issubset`", + "severity": "error" + }, + { + "line": 414, + "column": 12, + "stop_line": 414, + "stop_column": 47, + "path": "src/documents/matching.py", + "code": -2, + "name": "unsupported-operation", + "description": "`&` is not supported between `None` and `set[Any]`\n Cannot find `__and__` or `__rand__`", + "concise_description": "`&` is not supported between `None` and `set[Any]`", + "severity": "error" + }, + { + "line": 685, + "column": 21, + "stop_line": 685, + "stop_column": 29, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `ConsumableDocument` in function `consumable_document_matches_workflow`", + "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `ConsumableDocument` in function `consumable_document_matches_workflow`", + "severity": "error" + }, + { + "line": 694, + "column": 21, + "stop_line": 694, + "stop_column": 29, + "path": "src/documents/matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `existing_document_matches_workflow`", + "concise_description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `existing_document_matches_workflow`", + "severity": "error" + }, + { + "line": 117, + "column": 11, + "stop_line": 117, + "stop_column": 15, + "path": "src/documents/models.py", + "code": -2, + "name": "inconsistent-inheritance", + "description": "Field `ordering` has inconsistent types inherited from multiple base classes\n Inherited types include:\n `tuple[Literal['name']]` from `Meta`\n `list[str]` from `Meta`", + "concise_description": "Field `ordering` has inconsistent types inherited from multiple base classes", + "severity": "error" + }, + { + "line": 372, + "column": 21, + "stop_line": 372, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 872, + "column": 9, + "stop_line": 872, + "stop_column": 15, + "path": "src/documents/models.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ShareLinkBundle.delete` overrides parent class `Model` in an inconsistent manner\n `ShareLinkBundle.delete` has type `BoundMethod[ShareLinkBundle, (self: ShareLinkBundle, using: Unknown | None = None, *, keep_parents: bool | Unknown = False) -> tuple[int, dict[str, int]]]`, which is not assignable to `BoundMethod[ShareLinkBundle, (self: ShareLinkBundle, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]]`, the type of `Model.delete`", + "concise_description": "Class member `ShareLinkBundle.delete` overrides parent class `Model` in an inconsistent manner", + "severity": "error" + }, + { + "line": 1035, + "column": 31, + "stop_line": 1035, + "stop_column": 70, + "path": "src/documents/models.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 1059, + "column": 54, + "stop_line": 1059, + "stop_column": 74, + "path": "src/documents/models.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `CustomFieldInstance.get_value_field_name`", + "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `CustomFieldInstance.get_value_field_name`", + "severity": "error" + }, + { + "line": 1064, + "column": 5, + "stop_line": 1064, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1069, + "column": 5, + "stop_line": 1069, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1070, + "column": 5, + "stop_line": 1070, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1071, + "column": 5, + "stop_line": 1071, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1072, + "column": 5, + "stop_line": 1072, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1073, + "column": 5, + "stop_line": 1073, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 1074, + "column": 5, + "stop_line": 1074, + "stop_column": 13, + "path": "src/documents/models.py", + "code": -2, + "name": "unbound-name", + "description": "`auditlog` may be uninitialized", + "concise_description": "`auditlog` may be uninitialized", + "severity": "error" + }, + { + "line": 71, + "column": 32, + "stop_line": 71, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['mime_types'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 71, + "column": 32, + "stop_line": 71, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 99, + "column": 32, + "stop_line": 99, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['mime_types'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 99, + "column": 32, + "stop_line": 99, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 121, + "column": 32, + "stop_line": 121, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['mime_types'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 121, + "column": 32, + "stop_line": 121, + "stop_column": 64, + "path": "src/documents/parsers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 202, + "column": 28, + "stop_line": 202, + "stop_column": 31, + "path": "src/documents/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Path | str | Unknown]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str | Unknown]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 94, + "column": 42, + "stop_line": 94, + "stop_column": 64, + "path": "src/documents/permissions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `exists`", + "concise_description": "Object of class `list` has no attribute `exists`", + "severity": "error" + }, + { + "line": 95, + "column": 35, + "stop_line": 95, + "stop_column": 58, + "path": "src/documents/permissions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `exclude`", + "concise_description": "Object of class `list` has no attribute `exclude`", + "severity": "error" + }, + { + "line": 96, + "column": 16, + "stop_line": 96, + "stop_column": 38, + "path": "src/documents/permissions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `exists`", + "concise_description": "Object of class `list` has no attribute `exists`", + "severity": "error" + }, + { + "line": 181, + "column": 12, + "stop_line": 181, + "stop_column": 64, + "path": "src/documents/permissions.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `UnionType | type` is not assignable to declared return type `QuerySet[Unknown, Unknown]`", + "concise_description": "Returned type `UnionType | type` is not assignable to declared return type `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 40, + "column": 29, + "stop_line": 40, + "stop_column": 48, + "path": "src/documents/plugins/helpers.py", + "code": -2, + "name": "bad-assignment", + "description": "`BaseChannelLayer | None` is not assignable to attribute `_channel` with type `RedisPubSubChannelLayer | None`", + "concise_description": "`BaseChannelLayer | None` is not assignable to attribute `_channel` with type `RedisPubSubChannelLayer | None`", + "severity": "error" + }, + { + "line": 90, + "column": 19, + "stop_line": 90, + "stop_column": 26, + "path": "src/documents/plugins/helpers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `dict[str, str | dict[str, ProgressStatusOptions | int | str | None]]` is not assignable to parameter `payload` with type `dict[str, int | str | None]` in function `BaseStatusManager.send`", + "concise_description": "Argument `dict[str, str | dict[str, ProgressStatusOptions | int | str | None]]` is not assignable to parameter `payload` with type `dict[str, int | str | None]` in function `BaseStatusManager.send`", + "severity": "error" + }, + { + "line": 102, + "column": 19, + "stop_line": 102, + "stop_column": 26, + "path": "src/documents/plugins/helpers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `dict[str, str | dict[str, list[int]]]` is not assignable to parameter `payload` with type `dict[str, int | str | None]` in function `BaseStatusManager.send`", + "concise_description": "Argument `dict[str, str | dict[str, list[int]]]` is not assignable to parameter `payload` with type `dict[str, int | str | None]` in function `BaseStatusManager.send`", + "severity": "error" + }, + { + "line": 23, + "column": 26, + "stop_line": 23, + "stop_column": 33, + "path": "src/documents/regex.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `error` has no attribute `msg`", + "concise_description": "Object of class `error` has no attribute `msg`", + "severity": "error" + }, + { + "line": 127, + "column": 9, + "stop_line": 127, + "stop_column": 17, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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" + }, + { + "line": 201, + "column": 62, + "stop_line": 203, + "stop_column": 26, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, QuerySet[User, User]]`\n Argument `QuerySet[Group, Group]` is not assignable to parameter `value` with type `QuerySet[User, User]` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, QuerySet[User, User]]`", + "severity": "error" + }, + { + "line": 290, + "column": 17, + "stop_line": 294, + "stop_column": 30, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `list` has no attribute `values_list`", + "concise_description": "Object of class `list` has no attribute `values_list`", + "severity": "error" + }, + { + "line": 356, + "column": 21, + "stop_line": 356, + "stop_column": 37, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `has_perm`", + "concise_description": "Object of class `NoneType` has no attribute `has_perm`", + "severity": "error" + }, + { + "line": 468, + "column": 9, + "stop_line": 468, + "stop_column": 26, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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" + }, + { + "line": 469, + "column": 9, + "stop_line": 469, + "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": 469, + "column": 51, + "stop_line": 469, + "stop_column": 83, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "concise_description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "severity": "error" + }, + { + "line": 478, + "column": 11, + "stop_line": 478, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 478, + "column": 11, + "stop_line": 478, + "stop_column": 15, + "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": 497, + "column": 11, + "stop_line": 497, + "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": 497, + "column": 11, + "stop_line": 497, + "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", + "severity": "error" + }, + { + "line": 554, + "column": 11, + "stop_line": 554, + "stop_column": 15, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TagSerializerVersion1.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner\n `TagSerializerVersion1.Meta` has type `type[TagSerializerVersion1.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `MatchingModelSerializer.Meta`", + "concise_description": "Class member `TagSerializerVersion1.Meta` overrides parent class `MatchingModelSerializer` in an inconsistent manner", + "severity": "error" + }, + { + "line": 554, + "column": 11, + "stop_line": 554, + "stop_column": 15, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TagSerializerVersion1.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner\n `TagSerializerVersion1.Meta` has type `type[TagSerializerVersion1.Meta]`, which is not assignable to `type[ModelSerializer.Meta]`, the type of `OwnedObjectSerializer.Meta`", + "concise_description": "Class member `TagSerializerVersion1.Meta` overrides parent class `OwnedObjectSerializer` in an inconsistent manner", + "severity": "error" + }, + { + "line": 590, + "column": 14, + "stop_line": 595, + "stop_column": 6, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`ManyRelatedField | RelatedField[@_, @_, Any]` is not assignable to attribute `parent` with type `BaseSerializer[Unknown]`", + "concise_description": "`ManyRelatedField | RelatedField[@_, @_, Any]` is not assignable to attribute `parent` with type `BaseSerializer[Unknown]`", + "severity": "error" + }, + { + "line": 644, + "column": 11, + "stop_line": 644, + "stop_column": 15, + "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": 644, + "column": 11, + "stop_line": 644, + "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", + "severity": "error" + }, + { + "line": 671, + "column": 9, + "stop_line": 671, + "stop_column": 17, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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" + }, + { + "line": 733, + "column": 17, + "stop_line": 733, + "stop_column": 42, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[CustomField.FieldDataType]` is not assignable to parameter `choices` with type `Sequence[Any]` in function `rest_framework.fields.ChoiceField.__init__`", + "concise_description": "Argument `type[CustomField.FieldDataType]` is not assignable to parameter `choices` with type `Sequence[Any]` in function `rest_framework.fields.ChoiceField.__init__`", + "severity": "error" + }, + { + "line": 739, + "column": 11, + "stop_line": 739, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 850, + "column": 28, + "stop_line": 850, + "stop_column": 39, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-assignment", + "description": "`Unknown | None` is not assignable to attribute `method_name` with type `str`", + "concise_description": "`Unknown | None` is not assignable to attribute `method_name` with type `str`", + "severity": "error" + }, + { + "line": 869, + "column": 13, + "stop_line": 869, + "stop_column": 35, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "severity": "error" + }, + { + "line": 885, + "column": 9, + "stop_line": 885, + "stop_column": 18, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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" + }, + { + "line": 888, + "column": 9, + "stop_line": 888, + "stop_column": 17, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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" + }, + { + "line": 931, + "column": 34, + "stop_line": 931, + "stop_column": 68, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 949, + "column": 21, + "stop_line": 949, + "stop_column": 34, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Unknown] | None` is not assignable to parameter `obj` with type `Sized` in function `len`\n Protocol `Sized` requires attribute `__len__`", + "concise_description": "Argument `list[Unknown] | None` is not assignable to parameter `obj` with type `Sized` in function `len`", + "severity": "error" + }, + { + "line": 1001, + "column": 11, + "stop_line": 1001, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1011, + "column": 11, + "stop_line": 1011, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1019, + "column": 11, + "stop_line": 1019, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1130, + "column": 30, + "stop_line": 1130, + "stop_column": 55, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 1190, + "column": 12, + "stop_line": 1190, + "stop_column": 34, + "path": "src/documents/serialisers.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": 1194, + "column": 42, + "stop_line": 1194, + "stop_column": 64, + "path": "src/documents/serialisers.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": 1224, + "column": 35, + "stop_line": 1224, + "stop_column": 50, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get_ancestors`", + "concise_description": "Object of class `NoneType` has no attribute `get_ancestors`", + "severity": "error" + }, + { + "line": 1277, + "column": 11, + "stop_line": 1277, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1277, + "column": 11, + "stop_line": 1277, + "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": 1277, + "column": 11, + "stop_line": 1277, + "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": 1311, + "column": 9, + "stop_line": 1311, + "stop_column": 26, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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": 1314, + "column": 21, + "stop_line": 1314, + "stop_column": 47, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "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`", + "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": 1315, + "column": 9, + "stop_line": 1315, + "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": 1317, + "column": 9, + "stop_line": 1317, + "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": 1317, + "column": 51, + "stop_line": 1317, + "stop_column": 83, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "concise_description": "Object of class `BaseSerializer` has no attribute `get_shared_object_pks`\nObject of class `Field` has no attribute `get_shared_object_pks`\nObject of class `NoneType` has no attribute `get_shared_object_pks`", + "severity": "error" + }, + { + "line": 1342, + "column": 9, + "stop_line": 1342, + "stop_column": 26, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-param-name-override", + "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": 1353, + "column": 35, + "stop_line": 1353, + "stop_column": 49, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `notes`", + "concise_description": "Object of class `Document` has no attribute `notes`", + "severity": "error" + }, + { + "line": 1368, + "column": 9, + "stop_line": 1368, + "stop_column": 30, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "bad-override", + "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": 1372, + "column": 11, + "stop_line": 1372, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1380, + "column": 11, + "stop_line": 1380, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 1403, + "column": 21, + "stop_line": 1403, + "stop_column": 62, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`Literal[SavedView.DisplayFields.CUSTOM_FIELD]` is not subscriptable", + "concise_description": "`Literal[SavedView.DisplayFields.CUSTOM_FIELD]` is not subscriptable", + "severity": "error" + }, + { + "line": 1405, + "column": 36, + "stop_line": 1405, + "stop_column": 63, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 2059, + "column": 73, + "stop_line": 2059, + "stop_column": 80, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unbound-name", + "description": "`address` is uninitialized", + "concise_description": "`address` is uninitialized", + "severity": "error" + }, + { + "line": 2072, + "column": 11, + "stop_line": 2072, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2072, + "column": 11, + "stop_line": 2072, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2117, + "column": 11, + "stop_line": 2117, + "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": 2143, + "column": 11, + "stop_line": 2143, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2181, + "column": 30, + "stop_line": 2181, + "stop_column": 57, + "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`", + "severity": "error" + }, + { + "line": 2232, + "column": 11, + "stop_line": 2232, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2266, + "column": 11, + "stop_line": 2266, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2413, + "column": 17, + "stop_line": 2413, + "stop_column": 37, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `objects`", + "concise_description": "Object of class `NoneType` has no attribute `objects`", + "severity": "error" + }, + { + "line": 2457, + "column": 11, + "stop_line": 2457, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2553, + "column": 11, + "stop_line": 2553, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 2571, + "column": 11, + "stop_line": 2571, + "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": 2594, + "column": 11, + "stop_line": 2594, + "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": 2713, + "column": 11, + "stop_line": 2713, + "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": 2895, + "column": 16, + "stop_line": 2895, + "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": 2899, + "column": 16, + "stop_line": 2899, + "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`", + "severity": "error" + }, + { + "line": 2914, + "column": 52, + "stop_line": 2914, + "stop_column": 60, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unbound-name", + "description": "`triggers` may be uninitialized", + "concise_description": "`triggers` may be uninitialized", + "severity": "error" + }, + { + "line": 2914, + "column": 62, + "stop_line": 2914, + "stop_column": 69, + "path": "src/documents/serialisers.py", + "code": -2, + "name": "unbound-name", + "description": "`actions` may be uninitialized", + "concise_description": "`actions` may be uninitialized", + "severity": "error" + }, + { + "line": 118, + "column": 72, + "stop_line": 118, + "stop_column": 82, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "severity": "error" + }, + { + "line": 144, + "column": 17, + "stop_line": 144, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "severity": "error" + }, + { + "line": 174, + "column": 71, + "stop_line": 174, + "stop_column": 81, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "severity": "error" + }, + { + "line": 201, + "column": 17, + "stop_line": 201, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "severity": "error" + }, + { + "line": 236, + "column": 50, + "stop_line": 236, + "stop_column": 60, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "severity": "error" + }, + { + "line": 247, + "column": 19, + "stop_line": 247, + "stop_column": 37, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `SUCCESS`", + "concise_description": "Object of class `NoneType` has no attribute `SUCCESS`", + "severity": "error" + }, + { + "line": 249, + "column": 13, + "stop_line": 249, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `write`", + "concise_description": "Object of class `NoneType` has no attribute `write`", + "severity": "error" + }, + { + "line": 250, + "column": 13, + "stop_line": 250, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `write`", + "concise_description": "Object of class `NoneType` has no attribute `write`", + "severity": "error" + }, + { + "line": 252, + "column": 13, + "stop_line": 252, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `write`", + "concise_description": "Object of class `NoneType` has no attribute `write`", + "severity": "error" + }, + { + "line": 252, + "column": 36, + "stop_line": 252, + "stop_column": 54, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `SUCCESS`", + "concise_description": "Object of class `NoneType` has no attribute `SUCCESS`", + "severity": "error" + }, + { + "line": 254, + "column": 13, + "stop_line": 254, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `write`", + "concise_description": "Object of class `NoneType` has no attribute `write`", + "severity": "error" + }, + { + "line": 256, + "column": 13, + "stop_line": 256, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `write`", + "concise_description": "Object of class `NoneType` has no attribute `write`", + "severity": "error" + }, + { + "line": 289, + "column": 9, + "stop_line": 289, + "stop_column": 19, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "severity": "error" + }, + { + "line": 317, + "column": 17, + "stop_line": 317, + "stop_column": 25, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `selected` with type `MatchingModel` in function `_suggestion_printer`", + "severity": "error" + }, + { + "line": 365, + "column": 16, + "stop_line": 365, + "stop_column": 24, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`settings` may be uninitialized", + "concise_description": "`settings` may be uninitialized", + "severity": "error" + }, + { + "line": 384, + "column": 18, + "stop_line": 384, + "stop_column": 26, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`settings` may be uninitialized", + "concise_description": "`settings` may be uninitialized", + "severity": "error" + }, + { + "line": 390, + "column": 22, + "stop_line": 390, + "stop_column": 30, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`settings` may be uninitialized", + "concise_description": "`settings` may be uninitialized", + "severity": "error" + }, + { + "line": 495, + "column": 46, + "stop_line": 495, + "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__`", + "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 496, + "column": 49, + "stop_line": 496, + "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__`", + "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 534, + "column": 21, + "stop_line": 534, + "stop_column": 37, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `old_path` with type `Path` in function `validate_move`", + "concise_description": "Argument `Path | None` is not assignable to parameter `old_path` with type `Path` in function `validate_move`", + "severity": "error" + }, + { + "line": 535, + "column": 21, + "stop_line": 535, + "stop_column": 42, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `new_path` with type `Path` in function `validate_move`", + "concise_description": "Argument `Path | None` is not assignable to parameter `new_path` with type `Path` in function `validate_move`", + "severity": "error" + }, + { + "line": 538, + "column": 46, + "stop_line": 538, + "stop_column": 67, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "severity": "error" + }, + { + "line": 539, + "column": 28, + "stop_line": 539, + "stop_column": 69, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-specialization", + "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "severity": "error" + }, + { + "line": 539, + "column": 29, + "stop_line": 539, + "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`", + "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "severity": "error" + }, + { + "line": 559, + "column": 20, + "stop_line": 559, + "stop_column": 33, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`move_original` is uninitialized", + "concise_description": "`move_original` is uninitialized", + "severity": "error" + }, + { + "line": 561, + "column": 55, + "stop_line": 561, + "stop_column": 70, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`old_source_path` is uninitialized", + "concise_description": "`old_source_path` is uninitialized", + "severity": "error" + }, + { + "line": 563, + "column": 20, + "stop_line": 563, + "stop_column": 32, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`move_archive` is uninitialized", + "concise_description": "`move_archive` is uninitialized", + "severity": "error" + }, + { + "line": 563, + "column": 37, + "stop_line": 563, + "stop_column": 66, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `is_file`", + "concise_description": "Object of class `NoneType` has no attribute `is_file`", + "severity": "error" + }, + { + "line": 565, + "column": 32, + "stop_line": 565, + "stop_column": 73, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-specialization", + "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "severity": "error" + }, + { + "line": 565, + "column": 33, + "stop_line": 565, + "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`", + "concise_description": "Argument `Path | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "severity": "error" + }, + { + "line": 565, + "column": 56, + "stop_line": 565, + "stop_column": 72, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`old_archive_path` is uninitialized", + "concise_description": "`old_archive_path` is uninitialized", + "severity": "error" + }, + { + "line": 579, + "column": 33, + "stop_line": 579, + "stop_column": 45, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`old_filename` is uninitialized", + "concise_description": "`old_filename` is uninitialized", + "severity": "error" + }, + { + "line": 580, + "column": 41, + "stop_line": 580, + "stop_column": 61, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unbound-name", + "description": "`old_archive_filename` is uninitialized", + "concise_description": "`old_archive_filename` is uninitialized", + "severity": "error" + }, + { + "line": 590, + "column": 49, + "stop_line": 590, + "stop_column": 73, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `is_file`", + "concise_description": "Object of class `NoneType` has no attribute `is_file`", + "severity": "error" + }, + { + "line": 592, + "column": 22, + "stop_line": 592, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 609, + "column": 23, + "stop_line": 609, + "stop_column": 50, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 613, + "column": 5, + "stop_line": 613, + "stop_column": 24, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CustomField` has no attribute `fields`", + "concise_description": "Object of class `CustomField` has no attribute `fields`", + "severity": "error" + }, + { + "line": 617, + "column": 24, + "stop_line": 617, + "stop_column": 43, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CustomField` has no attribute `fields`", + "concise_description": "Object of class `CustomField` has no attribute `fields`", + "severity": "error" + }, + { + "line": 634, + "column": 13, + "stop_line": 634, + "stop_column": 28, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CustomField` has no attribute `fields`", + "concise_description": "Object of class `CustomField` has no attribute `fields`", + "severity": "error" + }, + { + "line": 648, + "column": 12, + "stop_line": 648, + "stop_column": 51, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "not-iterable", + "description": "`in` is not supported between `str` and `None`", + "concise_description": "`in` is not supported between `str` and `None`", + "severity": "error" + }, + { + "line": 652, + "column": 13, + "stop_line": 652, + "stop_column": 39, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `remove`", + "concise_description": "Object of class `NoneType` has no attribute `remove`", + "severity": "error" + }, + { + "line": 691, + "column": 27, + "stop_line": 691, + "stop_column": 51, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 711, + "column": 17, + "stop_line": 711, + "stop_column": 52, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `None`\n Object of class `NoneType` has no attribute `__setitem__`", + "concise_description": "Cannot set item in `None`", + "severity": "error" + }, + { + "line": 778, + "column": 13, + "stop_line": 778, + "stop_column": 33, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `source_path`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `source_path`", + "severity": "error" + }, + { + "line": 778, + "column": 60, + "stop_line": 778, + "stop_column": 82, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `original_file`", + "concise_description": "Object of class `Document` has no attribute `original_file`", + "severity": "error" + }, + { + "line": 789, + "column": 13, + "stop_line": 789, + "stop_column": 37, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `refresh_from_db`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `refresh_from_db`", + "severity": "error" + }, + { + "line": 790, + "column": 32, + "stop_line": 790, + "stop_column": 45, + "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`", + "severity": "error" + }, + { + "line": 807, + "column": 29, + "stop_line": 807, + "stop_column": 37, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_assignment_to_document`", + "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": 808, + "column": 29, + "stop_line": 808, + "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": 815, + "column": 59, + "stop_line": 815, + "stop_column": 67, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `ConsumableDocument | Document` is not assignable to parameter `document` with type `Document` in function `documents.workflows.mutations.apply_removal_to_document`", + "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": 815, + "column": 69, + "stop_line": 815, + "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": 840, + "column": 17, + "stop_line": 840, + "stop_column": 31, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `title`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", + "severity": "error" + }, + { + "line": 840, + "column": 34, + "stop_line": 840, + "stop_column": 48, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `title`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", + "severity": "error" + }, + { + "line": 842, + "column": 17, + "stop_line": 842, + "stop_column": 30, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `save`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `save`", + "severity": "error" + }, + { + "line": 843, + "column": 17, + "stop_line": 843, + "stop_column": 30, + "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`", + "severity": "error" + }, + { + "line": 843, + "column": 35, + "stop_line": 843, + "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": 866, + "column": 8, + "stop_line": 866, + "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": 866, + "column": 33, + "stop_line": 866, + "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": 873, + "column": 21, + "stop_line": 873, + "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": 881, + "column": 21, + "stop_line": 881, + "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": 939, + "column": 36, + "stop_line": 939, + "stop_column": 41, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "bad-assignment", + "description": "`Unknown | None` is not assignable to attribute `status` with type `str`", + "concise_description": "`Unknown | None` is not assignable to attribute `status` with type `str`", + "severity": "error" + }, + { + "line": 988, + "column": 13, + "stop_line": 988, + "stop_column": 28, + "path": "src/documents/signals/handlers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BaseDatabaseWrapper` has no attribute `close_pool`", + "concise_description": "Object of class `BaseDatabaseWrapper` has no attribute `close_pool`", + "severity": "error" + }, + { + "line": 185, + "column": 17, + "stop_line": 185, + "stop_column": 32, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `task_id` with type `str` in function `documents.plugins.base.ConsumeTaskPlugin.__init__`", + "concise_description": "Argument `str | None` is not assignable to parameter `task_id` with type `str` in function `documents.plugins.base.ConsumeTaskPlugin.__init__`", + "severity": "error" + }, + { + "line": 217, + "column": 12, + "stop_line": 217, + "stop_column": 15, + "path": "src/documents/tasks.py", + "code": -2, + "name": "unbound-name", + "description": "`msg` may be uninitialized", + "concise_description": "`msg` may be uninitialized", + "severity": "error" + }, + { + "line": 276, + "column": 42, + "stop_line": 276, + "stop_column": 83, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-assignment", + "description": "`type[DocumentParser] | None` is not assignable to `type[DocumentParser]`", + "concise_description": "`type[DocumentParser] | None` is not assignable to `type[DocumentParser]`", + "severity": "error" + }, + { + "line": 299, + "column": 27, + "stop_line": 299, + "stop_column": 52, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 316, + "column": 21, + "stop_line": 316, + "stop_column": 48, + "path": "src/documents/tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `log_create`", + "concise_description": "Object of class `Manager` has no attribute `log_create`", + "severity": "error" + }, + { + "line": 340, + "column": 21, + "stop_line": 340, + "stop_column": 48, + "path": "src/documents/tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `log_create`", + "concise_description": "Object of class `Manager` has no attribute `log_create`", + "severity": "error" + }, + { + "line": 353, + "column": 50, + "stop_line": 353, + "stop_column": 71, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "concise_description": "Argument `Path | None` is not assignable to parameter `source_path` with type `Path` in function `documents.file_handling.create_source_path_directory`", + "severity": "error" + }, + { + "line": 354, + "column": 32, + "stop_line": 354, + "stop_column": 82, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-specialization", + "description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "concise_description": "`Path | None` is not assignable to upper bound `PathLike[str] | str` of type variable `_StrPathT`", + "severity": "error" + }, + { + "line": 354, + "column": 33, + "stop_line": 354, + "stop_column": 58, + "path": "src/documents/tasks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `src` with type `PathLike[str] | str` in function `shutil.move`", + "severity": "error" + }, + { + "line": 520, + "column": 33, + "stop_line": 520, + "stop_column": 61, + "path": "src/documents/tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `run_at`", + "concise_description": "Object of class `NoneType` has no attribute `run_at`", + "severity": "error" + }, + { + "line": 84, + "column": 49, + "stop_line": 84, + "stop_column": 61, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`\n Argument `(custom_field_data: dict[str, dict[str, str]], name: str, default: str | None = None) -> str | None` is not assignable to parameter `value` with type `((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`", + "severity": "error" + }, + { + "line": 86, + "column": 45, + "stop_line": 86, + "stop_column": 60, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`\n Argument `(value: datetime | str, format: str) -> str` is not assignable to parameter `value` with type `((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`", + "severity": "error" + }, + { + "line": 90, + "column": 50, + "stop_line": 90, + "stop_column": 63, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`\n Argument `(value: date | datetime | str, format: str, locale: str) -> str` is not assignable to parameter `value` with type `((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`", + "severity": "error" + }, + { + "line": 239, + "column": 17, + "stop_line": 239, + "stop_column": 66, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 241, + "column": 23, + "stop_line": 241, + "stop_column": 72, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 261, + "column": 12, + "stop_line": 261, + "stop_column": 22, + "path": "src/documents/templating/filepath.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `dict[str, dict[str, dict[str, str | Unknown | None]]]` is not assignable to declared return type `dict[str, dict[str, dict[str, str]]]`", + "concise_description": "Returned type `dict[str, dict[str, dict[str, str | Unknown | None]]]` is not assignable to declared return type `dict[str, dict[str, dict[str, str]]]`", + "severity": "error" + }, + { + "line": 30, + "column": 17, + "stop_line": 30, + "stop_column": 38, + "path": "src/documents/templating/filters.py", + "code": -2, + "name": "bad-assignment", + "description": "`datetime | None` is not assignable to variable `value` with type `date | datetime | str`", + "concise_description": "`datetime | None` is not assignable to variable `value` with type `date | datetime | str`", + "severity": "error" + }, + { + "line": 47, + "column": 17, + "stop_line": 47, + "stop_column": 34, + "path": "src/documents/templating/filters.py", + "code": -2, + "name": "bad-assignment", + "description": "`date | None` is not assignable to variable `value` with type `datetime | str`", + "concise_description": "`date | None` is not assignable to variable `value` with type `datetime | str`", + "severity": "error" + }, + { + "line": 48, + "column": 12, + "stop_line": 48, + "stop_column": 26, + "path": "src/documents/templating/filters.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `str` has no attribute `strftime`", + "concise_description": "Object of class `str` has no attribute `strftime`", + "severity": "error" + }, + { + "line": 25, + "column": 45, + "stop_line": 25, + "stop_column": 60, + "path": "src/documents/templating/workflows.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`\n Argument `(value: datetime | str, format: str) -> str` is not assignable to parameter `value` with type `((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`", + "severity": "error" + }, + { + "line": 29, + "column": 50, + "stop_line": 29, + "stop_column": 63, + "path": "src/documents/templating/workflows.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`\n Argument `(value: date | datetime | str, format: str, locale: str) -> str` is not assignable to parameter `value` with type `((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, ((obj: Sized, /) -> int) | ((s: Any, /) -> Markup) | ((s: Any, /) -> str) | ((env: Environment, s: str, length: int = 255, killwords: bool = False, end: str = '...', leeway: int | None = None) -> str) | ((environment: Environment, obj: Any, name: str) -> Undefined | Any) | ((environment: Environment, s: str, width: int = 79, break_long_words: bool = True, wrapstring: str | None = None, break_on_hyphens: bool = True) -> str) | ((eval_ctx: EvalContext, d: Mapping[str, Any], autospace: bool = True) -> str) | ((eval_ctx: EvalContext, s: str, old: str, new: str, count: int | None = None) -> str) | ((eval_ctx: EvalContext, value: str, trim_url_limit: int | None = None, nofollow: bool = False, target: str | None = None, rel: str | None = None, extra_schemes: Iterable[str] | None = None) -> str) | ((eval_ctx: EvalContext, value: Any, indent: int | None = None) -> Markup) | ((s: str) -> int) | ((s: str) -> str) | ((s: str, width: int | str = 4, first: bool = False, blank: bool = False) -> str) | ((value: HasHTML | str) -> Markup) | ((value: HasHTML | str) -> str) | ((value: Iterable[tuple[str, Any]] | Mapping[str, Any] | str) -> str) | ((value: float | int | str, binary: bool = False) -> str) | ((value: float, precision: int = 0, method: Literal['ceil', 'common', 'floor'] = 'common') -> float) | ((value: str) -> Markup) | ((value: str, chars: str | None = None) -> str) | ((value: str, width: int = 80) -> str) | ((value: str, *args: Any, **kwargs: Any) -> str) | ((value: Any) -> str) | ((value: Any, default: float = ...) -> float) | ((value: Any, default: int = 0, base: int = 10) -> int) | ((*args: Unknown, **kwargs: Unknown) -> Unknown) | Overload[(context: Context, value: AsyncIterable[Any] | Iterable[Any], name: str, *args: Any, **kwargs: Any) -> Iterable[Any], (context: Context, value: AsyncIterable[Any] | Iterable[Any], *, attribute: str = ..., default: Any | None = None) -> Iterable[Any]] | Overload[(value: str) -> str, [V](value: Iterable[Unknown]) -> Iterable[Unknown]] | [K, V](value: Mapping[Unknown, Unknown], case_sensitive: bool = False, by: Literal['key', 'value'] = 'key', reverse: bool = False) -> list[tuple[Unknown, Unknown]] | [K, V](value: Mapping[Unknown, Unknown] | Undefined) -> Iterator[tuple[Unknown, Unknown]] | [V](value: Iterable[Unknown], linecount: int, fill_with: Unknown | None = None) -> Iterator[list[Unknown]] | [V](value: Unknown, default_value: Unknown = ..., boolean: bool = False) -> Unknown | [V](environment: Environment, seq: Reversible[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], case_sensitive: bool = False, attribute: int | str | None = None) -> Undefined | Unknown | [V](context: Context, seq: Sequence[Unknown]) -> Undefined | Unknown | [V](environment: Environment, value: Iterable[Unknown], reverse: bool = False, case_sensitive: bool = False, attribute: int | str | None = None) -> list[Unknown] | [_T](x: SupportsAbs[Unknown], /) -> Unknown]`", + "severity": "error" + }, + { + "line": 109, + "column": 12, + "stop_line": 109, + "stop_column": 16, + "path": "src/documents/templating/workflows.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `None` is not assignable to declared return type `str`", + "concise_description": "Returned type `None` is not assignable to declared return type `str`", + "severity": "error" + }, + { + "line": 28, + "column": 12, + "stop_line": 28, + "stop_column": 41, + "path": "src/documents/tests/conftest.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`", + "severity": "error" + }, + { + "line": 9, + "column": 11, + "stop_line": 9, + "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": 16, + "column": 11, + "stop_line": 16, + "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": 36, + "column": 26, + "stop_line": 36, + "stop_column": 65, + "path": "src/documents/tests/test_admin.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 107, + "column": 26, + "stop_line": 107, + "stop_column": 38, + "path": "src/documents/tests/test_admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ModelForm` has no attribute `request`", + "concise_description": "Object of class `ModelForm` has no attribute `request`", + "severity": "error" + }, + { + "line": 119, + "column": 9, + "stop_line": 119, + "stop_column": 21, + "path": "src/documents/tests/test_admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ModelForm` has no attribute `request`", + "concise_description": "Object of class `ModelForm` has no attribute `request`", + "severity": "error" + }, + { + "line": 127, + "column": 9, + "stop_line": 127, + "stop_column": 21, + "path": "src/documents/tests/test_admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ModelForm` has no attribute `request`", + "concise_description": "Object of class `ModelForm` has no attribute `request`", + "severity": "error" + }, + { + "line": 91, + "column": 9, + "stop_line": 91, + "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": 92, + "column": 9, + "stop_line": 92, + "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": 93, + "column": 9, + "stop_line": 93, + "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": 98, + "column": 30, + "stop_line": 98, + "stop_column": 46, + "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": 99, + "column": 29, + "stop_line": 99, + "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`", + "severity": "error" + }, + { + "line": 125, + "column": 26, + "stop_line": 125, + "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": 150, + "column": 26, + "stop_line": 150, + "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": 151, + "column": 26, + "stop_line": 151, + "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": 152, + "column": 26, + "stop_line": 152, + "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": 187, + "column": 20, + "stop_line": 187, + "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": 636, + "column": 9, + "stop_line": 636, + "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": 637, + "column": 9, + "stop_line": 637, + "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": 650, + "column": 9, + "stop_line": 650, + "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": 651, + "column": 26, + "stop_line": 651, + "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": 663, + "column": 9, + "stop_line": 663, + "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": 676, + "column": 9, + "stop_line": 676, + "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": 677, + "column": 9, + "stop_line": 677, + "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": 678, + "column": 9, + "stop_line": 678, + "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, + "stop_line": 57, + "stop_column": 83, + "path": "src/documents/tests/test_api_bulk_download.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", + "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", + "severity": "error" + }, + { + "line": 278, + "column": 26, + "stop_line": 278, + "stop_column": 43, + "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": 358, + "column": 13, + "stop_line": 358, + "stop_column": 47, + "path": "src/documents/tests/test_api_custom_fields.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 422, + "column": 26, + "stop_line": 422, + "stop_column": 43, + "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": 635, + "column": 30, + "stop_line": 635, + "stop_column": 47, + "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": 676, + "column": 26, + "stop_line": 676, + "stop_column": 43, + "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": 693, + "column": 26, + "stop_line": 693, + "stop_column": 43, + "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": 741, + "column": 30, + "stop_line": 741, + "stop_column": 47, + "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": 758, + "column": 30, + "stop_line": 758, + "stop_column": 47, + "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": 759, + "column": 26, + "stop_line": 759, + "stop_column": 43, + "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": 800, + "column": 30, + "stop_line": 800, + "stop_column": 47, + "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": 840, + "column": 38, + "stop_line": 840, + "stop_column": 55, + "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": 892, + "column": 30, + "stop_line": 892, + "stop_column": 47, + "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": 963, + "column": 30, + "stop_line": 963, + "stop_column": 47, + "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": 998, + "column": 30, + "stop_line": 998, + "stop_column": 47, + "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": 1039, + "column": 30, + "stop_line": 1039, + "stop_column": 47, + "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": 1076, + "column": 30, + "stop_line": 1076, + "stop_column": 47, + "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": 1171, + "column": 26, + "stop_line": 1171, + "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": 1172, + "column": 26, + "stop_line": 1172, + "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": 1173, + "column": 26, + "stop_line": 1173, + "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": 1190, + "column": 26, + "stop_line": 1190, + "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": 1207, + "column": 26, + "stop_line": 1207, + "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": 1208, + "column": 26, + "stop_line": 1208, + "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": 1209, + "column": 26, + "stop_line": 1209, + "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": 1221, + "column": 26, + "stop_line": 1221, + "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": 1222, + "column": 26, + "stop_line": 1222, + "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": 1223, + "column": 26, + "stop_line": 1223, + "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": 1248, + "column": 26, + "stop_line": 1248, + "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": 316, + "column": 44, + "stop_line": 316, + "stop_column": 67, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 331, + "column": 31, + "stop_line": 331, + "stop_column": 54, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `thumbnail_dir`", + "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", + "severity": "error" + }, + { + "line": 361, + "column": 44, + "stop_line": 361, + "stop_column": 67, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 383, + "column": 20, + "stop_line": 383, + "stop_column": 43, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `thumbnail_dir`", + "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", + "severity": "error" + }, + { + "line": 421, + "column": 19, + "stop_line": 421, + "stop_column": 35, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 1192, + "column": 47, + "stop_line": 1192, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1235, + "column": 47, + "stop_line": 1235, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1266, + "column": 47, + "stop_line": 1266, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1279, + "column": 47, + "stop_line": 1279, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1292, + "column": 47, + "stop_line": 1292, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1313, + "column": 47, + "stop_line": 1313, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1335, + "column": 47, + "stop_line": 1335, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1349, + "column": 47, + "stop_line": 1349, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1371, + "column": 47, + "stop_line": 1371, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1385, + "column": 47, + "stop_line": 1385, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1407, + "column": 47, + "stop_line": 1407, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1421, + "column": 47, + "stop_line": 1421, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1438, + "column": 31, + "stop_line": 1438, + "stop_column": 48, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[int] | None` is not assignable to parameter `first` with type `Iterable[Any]` in function `unittest.case.TestCase.assertCountEqual`\n Protocol `Iterable` requires attribute `__iter__`", + "concise_description": "Argument `list[int] | None` is not assignable to parameter `first` with type `Iterable[Any]` in function `unittest.case.TestCase.assertCountEqual`", + "severity": "error" + }, + { + "line": 1444, + "column": 47, + "stop_line": 1444, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1460, + "column": 47, + "stop_line": 1460, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1488, + "column": 47, + "stop_line": 1488, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1512, + "column": 47, + "stop_line": 1512, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1546, + "column": 47, + "stop_line": 1546, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1593, + "column": 9, + "stop_line": 1593, + "stop_column": 25, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "not-iterable", + "description": "Type `None` is not iterable", + "concise_description": "Type `None` is not iterable", + "severity": "error" + }, + { + "line": 1608, + "column": 47, + "stop_line": 1608, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1654, + "column": 47, + "stop_line": 1654, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1726, + "column": 47, + "stop_line": 1726, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1750, + "column": 47, + "stop_line": 1750, + "stop_column": 60, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.result` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 1781, + "column": 20, + "stop_line": 1781, + "stop_column": 52, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", + "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", + "severity": "error" + }, + { + "line": 2089, + "column": 26, + "stop_line": 2089, + "stop_column": 41, + "path": "src/documents/tests/test_api_documents.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": 2101, + "column": 26, + "stop_line": 2101, + "stop_column": 41, + "path": "src/documents/tests/test_api_documents.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": 2109, + "column": 26, + "stop_line": 2109, + "stop_column": 41, + "path": "src/documents/tests/test_api_documents.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": 2110, + "column": 26, + "stop_line": 2110, + "stop_column": 41, + "path": "src/documents/tests/test_api_documents.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": 2118, + "column": 26, + "stop_line": 2118, + "stop_column": 41, + "path": "src/documents/tests/test_api_documents.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": 2527, + "column": 27, + "stop_line": 2527, + "stop_column": 39, + "path": "src/documents/tests/test_api_documents.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": 2528, + "column": 33, + "stop_line": 2528, + "stop_column": 51, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `username`", + "concise_description": "Object of class `NoneType` has no attribute `username`", + "severity": "error" + }, + { + "line": 2529, + "column": 35, + "stop_line": 2529, + "stop_column": 55, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `first_name`", + "concise_description": "Object of class `NoneType` has no attribute `first_name`", + "severity": "error" + }, + { + "line": 2530, + "column": 34, + "stop_line": 2530, + "stop_column": 53, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `last_name`", + "concise_description": "Object of class `NoneType` has no attribute `last_name`", + "severity": "error" + }, + { + "line": 3129, + "column": 20, + "stop_line": 3129, + "stop_column": 52, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", + "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", + "severity": "error" + }, + { + "line": 3466, + "column": 39, + "stop_line": 3466, + "stop_column": 53, + "path": "src/documents/tests/test_api_documents.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[bool] | list[date] | list[float] | list[int] | list[str]` is not assignable to parameter `iterable` with type `Iterable[bool]` in function `enumerate.__new__`", + "concise_description": "Argument `list[bool] | list[date] | list[float] | list[int] | list[str]` is not assignable to parameter `iterable` with type `Iterable[bool]` in function `enumerate.__new__`", + "severity": "error" + }, + { + "line": 44, + "column": 20, + "stop_line": 47, + "stop_column": 10, + "path": "src/documents/tests/test_api_email.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)\n Possible overloads:\n (src: StrPath, dst: _StrPathT, *, follow_symlinks: bool = True) -> str | _StrPathT [closest match]\n (src: BytesPath, dst: _BytesPathT, *, follow_symlinks: bool = True) -> bytes | _BytesPathT", + "concise_description": "No matching overload found for function `shutil.copy` called with arguments: (Path, Path | None)", + "severity": "error" + }, + { + "line": 103, + "column": 24, + "stop_line": 103, + "stop_column": 51, + "path": "src/documents/tests/test_api_email.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `stat`", + "concise_description": "Object of class `NoneType` has no attribute `stat`", + "severity": "error" + }, + { + "line": 25, + "column": 16, + "stop_line": 25, + "stop_column": 44, + "path": "src/documents/tests/test_api_filter_by_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": 28, + "column": 16, + "stop_line": 28, + "stop_column": 44, + "path": "src/documents/tests/test_api_filter_by_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": 222, + "column": 26, + "stop_line": 222, + "stop_column": 36, + "path": "src/documents/tests/test_api_permissions.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": 252, + "column": 26, + "stop_line": 252, + "stop_column": 36, + "path": "src/documents/tests/test_api_permissions.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": 299, + "column": 55, + "stop_line": 299, + "stop_column": 59, + "path": "src/documents/tests/test_api_permissions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.core.ObjectPermissionChecker.has_perm`", + "severity": "error" + }, + { + "line": 300, + "column": 53, + "stop_line": 300, + "stop_column": 57, + "path": "src/documents/tests/test_api_permissions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "severity": "error" + }, + { + "line": 344, + "column": 26, + "stop_line": 344, + "stop_column": 36, + "path": "src/documents/tests/test_api_permissions.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": 345, + "column": 53, + "stop_line": 345, + "stop_column": 57, + "path": "src/documents/tests/test_api_permissions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "concise_description": "Argument `Tag | None` is not assignable to parameter `obj` with type `Model` in function `guardian.shortcuts.get_perms`", + "severity": "error" + }, + { + "line": 46, + "column": 21, + "stop_line": 46, + "stop_column": 29, + "path": "src/documents/tests/test_api_profile.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": 49, + "column": 19, + "stop_line": 49, + "stop_column": 39, + "path": "src/documents/tests/test_api_profile.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `provider_id`", + "concise_description": "Object of class `NoneType` has no attribute `provider_id`", + "severity": "error" + }, + { + "line": 71, + "column": 9, + "stop_line": 71, + "stop_column": 36, + "path": "src/documents/tests/test_api_profile.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `User` has no attribute `socialaccount_set`", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "line": 279, + "column": 41, + "stop_line": 279, + "stop_column": 51, + "path": "src/documents/tests/test_api_profile.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `key`", + "concise_description": "Object of class `NoneType` has no attribute `key`", + "severity": "error" + }, + { + "line": 382, + "column": 29, + "stop_line": 382, + "stop_column": 56, + "path": "src/documents/tests/test_api_profile.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `User` has no attribute `socialaccount_set`", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "line": 393, + "column": 17, + "stop_line": 393, + "stop_column": 44, + "path": "src/documents/tests/test_api_profile.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `User` has no attribute `socialaccount_set`", + "concise_description": "Object of class `User` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "line": 53, + "column": 52, + "stop_line": 53, + "stop_column": 65, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 57, + "column": 52, + "stop_line": 57, + "stop_column": 65, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 235, + "column": 20, + "stop_line": 235, + "stop_column": 33, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 261, + "column": 20, + "stop_line": 261, + "stop_column": 33, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 291, + "column": 20, + "stop_line": 291, + "stop_column": 33, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 317, + "column": 20, + "stop_line": 317, + "stop_column": 33, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 355, + "column": 20, + "stop_line": 355, + "stop_column": 33, + "path": "src/documents/tests/test_api_tasks.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 73, + "column": 23, + "stop_line": 73, + "stop_column": 49, + "path": "src/documents/tests/test_api_uisettings.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `User` has no attribute `ui_settings`", + "concise_description": "Object of class `User` has no attribute `ui_settings`", + "severity": "error" + }, + { + "line": 99, + "column": 13, + "stop_line": 99, + "stop_column": 48, + "path": "src/documents/tests/test_api_workflows.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": 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": 29, + "column": 12, + "stop_line": 29, + "stop_column": 20, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "missing-import", + "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/.local/share/uv/python/cpython-3.13.4-linux-x86_64-gnu/lib/python3.13\", \"/home/trenton/.local/share/uv/python/cpython-3.13.4-linux-x86_64-gnu/lib/python3.13/lib-dynload\", \"/home/trenton/projects/paperless-ngx/.venv/lib/python3.13/site-packages\"]", + "concise_description": "Cannot find module `zxingcpp`", + "severity": "error" + }, + { + "line": 42, + "column": 13, + "stop_line": 42, + "stop_column": 54, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "severity": "error" + }, + { + "line": 43, + "column": 13, + "stop_line": 43, + "stop_column": 22, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `GetReaderPluginMixin` has no attribute `dirs`", + "concise_description": "Object of class `GetReaderPluginMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "line": 597, + "column": 9, + "stop_line": 597, + "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": 598, + "column": 9, + "stop_line": 598, + "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": 599, + "column": 9, + "stop_line": 599, + "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": 631, + "column": 21, + "stop_line": 631, + "stop_column": 42, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 667, + "column": 5, + "stop_line": 667, + "stop_column": 20, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `(self: Self@TestAsnBarcode, filepath: Path) -> BarcodePlugin` is not assignable to parameter `func` with type `(self: Self@TestAsnBarcode, filepath: Path) -> Iterator[@_]` in function `contextlib.contextmanager`\n Protocol `Iterator` requires attribute `__next__`", + "concise_description": "Argument `(self: Self@TestAsnBarcode, filepath: Path) -> BarcodePlugin` is not assignable to parameter `func` with type `(self: Self@TestAsnBarcode, filepath: Path) -> Iterator[@_]` in function `contextlib.contextmanager`", + "severity": "error" + }, + { + "line": 668, + "column": 45, + "stop_line": 668, + "stop_column": 58, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-return", + "description": "Generator function should return `Generator`", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "line": 672, + "column": 13, + "stop_line": 672, + "stop_column": 54, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "severity": "error" + }, + { + "line": 673, + "column": 13, + "stop_line": 673, + "stop_column": 34, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 785, + "column": 30, + "stop_line": 785, + "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": 848, + "column": 5, + "stop_line": 848, + "stop_column": 20, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `(self: Self@TestTagBarcode, filepath: Path) -> BarcodePlugin` is not assignable to parameter `func` with type `(self: Self@TestTagBarcode, filepath: Path) -> Iterator[@_]` in function `contextlib.contextmanager`\n Protocol `Iterator` requires attribute `__next__`", + "concise_description": "Argument `(self: Self@TestTagBarcode, filepath: Path) -> BarcodePlugin` is not assignable to parameter `func` with type `(self: Self@TestTagBarcode, filepath: Path) -> Iterator[@_]` in function `contextlib.contextmanager`", + "severity": "error" + }, + { + "line": 849, + "column": 45, + "stop_line": 849, + "stop_column": 58, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-return", + "description": "Generator function should return `Generator`", + "concise_description": "Generator function should return `Generator`", + "severity": "error" + }, + { + "line": 853, + "column": 13, + "stop_line": 853, + "stop_column": 54, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "concise_description": "Argument `DummyProgressManager` is not assignable to parameter `status_mgr` with type `ProgressManager` in function `documents.barcodes.BarcodePlugin.__init__`", + "severity": "error" + }, + { + "line": 854, + "column": 13, + "stop_line": 854, + "stop_column": 34, + "path": "src/documents/tests/test_barcodes.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1094, + "column": 30, + "stop_line": 1094, + "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": 1098, + "column": 30, + "stop_line": 1098, + "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": 74, + "column": 13, + "stop_line": 74, + "stop_column": 23, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "concise_description": "Argument `int` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "severity": "error" + }, + { + "line": 83, + "column": 81, + "stop_line": 83, + "stop_column": 85, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "concise_description": "Argument `None` is not assignable to parameter `correspondent` with type `Correspondent` in function `documents.bulk_edit.set_correspondent`", + "severity": "error" + }, + { + "line": 93, + "column": 13, + "stop_line": 93, + "stop_column": 24, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "concise_description": "Argument `int` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "severity": "error" + }, + { + "line": 102, + "column": 81, + "stop_line": 102, + "stop_column": 85, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "concise_description": "Argument `None` is not assignable to parameter `document_type` with type `DocumentType` in function `documents.bulk_edit.set_document_type`", + "severity": "error" + }, + { + "line": 121, + "column": 13, + "stop_line": 121, + "stop_column": 24, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "severity": "error" + }, + { + "line": 145, + "column": 13, + "stop_line": 145, + "stop_column": 24, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "concise_description": "Argument `int` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "severity": "error" + }, + { + "line": 152, + "column": 13, + "stop_line": 152, + "stop_column": 17, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "concise_description": "Argument `None` is not assignable to parameter `storage_path` with type `StoragePath` in function `documents.bulk_edit.set_storage_path`", + "severity": "error" + }, + { + "line": 243, + "column": 13, + "stop_line": 243, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 247, + "column": 13, + "stop_line": 247, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 303, + "column": 13, + "stop_line": 303, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 307, + "column": 13, + "stop_line": 307, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 311, + "column": 13, + "stop_line": 311, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 315, + "column": 13, + "stop_line": 315, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 319, + "column": 13, + "stop_line": 319, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 324, + "column": 13, + "stop_line": 324, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 340, + "column": 13, + "stop_line": 340, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 344, + "column": 13, + "stop_line": 344, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 368, + "column": 13, + "stop_line": 368, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 372, + "column": 13, + "stop_line": 372, + "stop_column": 36, + "path": "src/documents/tests/test_bulk_edit.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": 416, + "column": 48, + "stop_line": 416, + "stop_column": 50, + "path": "src/documents/tests/test_bulk_edit.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": 422, + "column": 26, + "stop_line": 422, + "stop_column": 49, + "path": "src/documents/tests/test_bulk_edit.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": 460, + "column": 48, + "stop_line": 460, + "stop_column": 50, + "path": "src/documents/tests/test_bulk_edit.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": 466, + "column": 26, + "stop_line": 466, + "stop_column": 49, + "path": "src/documents/tests/test_bulk_edit.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": 481, + "column": 19, + "stop_line": 481, + "stop_column": 40, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 490, + "column": 27, + "stop_line": 490, + "stop_column": 48, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 499, + "column": 19, + "stop_line": 499, + "stop_column": 40, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 508, + "column": 27, + "stop_line": 508, + "stop_column": 48, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 517, + "column": 19, + "stop_line": 517, + "stop_column": 40, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 550, + "column": 19, + "stop_line": 550, + "stop_column": 40, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 555, + "column": 27, + "stop_line": 555, + "stop_column": 48, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 895, + "column": 31, + "stop_line": 895, + "stop_column": 62, + "path": "src/documents/tests/test_bulk_edit.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.__rsub__`", + "concise_description": "`-` is not supported between `None` and `int`", + "severity": "error" + }, + { + "line": 1125, + "column": 20, + "stop_line": 1125, + "stop_column": 41, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1183, + "column": 20, + "stop_line": 1183, + "stop_column": 41, + "path": "src/documents/tests/test_bulk_edit.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 38, + "column": 25, + "stop_line": 38, + "stop_column": 29, + "path": "src/documents/tests/test_checks.py", + "code": -2, + "name": "unexpected-keyword", + "description": "Unexpected keyword argument `hint` in function `BaseException.__init__`", + "concise_description": "Unexpected keyword argument `hint` in function `BaseException.__init__`", + "severity": "error" + }, + { + "line": 206, + "column": 18, + "stop_line": 206, + "stop_column": 67, + "path": "src/documents/tests/test_classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `classes_`", + "concise_description": "Object of class `NoneType` has no attribute `classes_`", + "severity": "error" + }, + { + "line": 210, + "column": 18, + "stop_line": 210, + "stop_column": 57, + "path": "src/documents/tests/test_classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `classes_`", + "concise_description": "Object of class `NoneType` has no attribute `classes_`", + "severity": "error" + }, + { + "line": 230, + "column": 23, + "stop_line": 230, + "stop_column": 64, + "path": "src/documents/tests/test_classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `transform`", + "concise_description": "Object of class `NoneType` has no attribute `transform`", + "severity": "error" + }, + { + "line": 691, + "column": 13, + "stop_line": 691, + "stop_column": 34, + "path": "src/documents/tests/test_classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 694, + "column": 24, + "stop_line": 694, + "stop_column": 45, + "path": "src/documents/tests/test_classifier.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 38, + "column": 9, + "stop_line": 38, + "stop_column": 21, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `_BaseTestParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner\n `_BaseTestParser.get_settings` has type `BoundMethod[_BaseTestParser, (self: _BaseTestParser) -> None]`, which is not assignable to `BoundMethod[_BaseTestParser, (self: _BaseTestParser) -> Never]`, the type of `DocumentParser.get_settings`", + "concise_description": "Class member `_BaseTestParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 51, + "column": 9, + "stop_line": 51, + "stop_column": 22, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DummyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner\n `DummyParser.get_thumbnail` has type `BoundMethod[DummyParser, (self: DummyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> str]`, which is not assignable to `BoundMethod[DummyParser, (self: DummyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.get_thumbnail`", + "concise_description": "Class member `DummyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 54, + "column": 9, + "stop_line": 54, + "stop_column": 14, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DummyParser.parse` overrides parent class `_BaseTestParser` in an inconsistent manner\n `DummyParser.parse` has type `BoundMethod[DummyParser, (self: DummyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> None]`, which is not assignable to `BoundMethod[DummyParser, (self: DummyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.parse`", + "concise_description": "Class member `DummyParser.parse` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 59, + "column": 9, + "stop_line": 59, + "stop_column": 22, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `CopyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner\n `CopyParser.get_thumbnail` has type `BoundMethod[CopyParser, (self: CopyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> str]`, which is not assignable to `BoundMethod[CopyParser, (self: CopyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.get_thumbnail`", + "concise_description": "Class member `CopyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 66, + "column": 9, + "stop_line": 66, + "stop_column": 14, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `CopyParser.parse` overrides parent class `_BaseTestParser` in an inconsistent manner\n `CopyParser.parse` has type `BoundMethod[CopyParser, (self: CopyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> None]`, which is not assignable to `BoundMethod[CopyParser, (self: CopyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.parse`", + "concise_description": "Class member `CopyParser.parse` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 77, + "column": 9, + "stop_line": 77, + "stop_column": 22, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `FaultyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner\n `FaultyParser.get_thumbnail` has type `BoundMethod[FaultyParser, (self: FaultyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> str]`, which is not assignable to `BoundMethod[FaultyParser, (self: FaultyParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.get_thumbnail`", + "concise_description": "Class member `FaultyParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 89, + "column": 9, + "stop_line": 89, + "stop_column": 22, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "bad-override", + "description": "Class member `FaultyGenericExceptionParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner\n `FaultyGenericExceptionParser.get_thumbnail` has type `BoundMethod[FaultyGenericExceptionParser, (self: FaultyGenericExceptionParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> str]`, which is not assignable to `BoundMethod[FaultyGenericExceptionParser, (self: FaultyGenericExceptionParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `_BaseTestParser.get_thumbnail`", + "concise_description": "Class member `FaultyGenericExceptionParser.get_thumbnail` overrides parent class `_BaseTestParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 147, + "column": 13, + "stop_line": 147, + "stop_column": 34, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 152, + "column": 44, + "stop_line": 152, + "stop_column": 65, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 159, + "column": 60, + "stop_line": 159, + "stop_column": 81, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 186, + "column": 15, + "stop_line": 186, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 198, + "column": 15, + "stop_line": 198, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 206, + "column": 15, + "stop_line": 206, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 239, + "column": 27, + "stop_line": 239, + "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`", + "severity": "error" + }, + { + "line": 257, + "column": 28, + "stop_line": 257, + "stop_column": 49, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 320, + "column": 26, + "stop_line": 320, + "stop_column": 51, + "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": 334, + "column": 26, + "stop_line": 334, + "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": 348, + "column": 26, + "stop_line": 348, + "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": 364, + "column": 27, + "stop_line": 364, + "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": 365, + "column": 30, + "stop_line": 365, + "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": 366, + "column": 27, + "stop_line": 366, + "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": 391, + "column": 56, + "stop_line": 391, + "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": 396, + "column": 26, + "stop_line": 396, + "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": 398, + "column": 13, + "stop_line": 398, + "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": 412, + "column": 26, + "stop_line": 412, + "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": 440, + "column": 26, + "stop_line": 440, + "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": 454, + "column": 26, + "stop_line": 454, + "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": 473, + "column": 64, + "stop_line": 473, + "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": 475, + "column": 65, + "stop_line": 475, + "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": 543, + "column": 13, + "stop_line": 543, + "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": 639, + "column": 26, + "stop_line": 639, + "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": 640, + "column": 26, + "stop_line": 640, + "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": 641, + "column": 26, + "stop_line": 641, + "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`", + "severity": "error" + }, + { + "line": 667, + "column": 26, + "stop_line": 667, + "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": 669, + "column": 27, + "stop_line": 669, + "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": 670, + "column": 27, + "stop_line": 670, + "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`", + "severity": "error" + }, + { + "line": 697, + "column": 26, + "stop_line": 697, + "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": 698, + "column": 26, + "stop_line": 698, + "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": 699, + "column": 27, + "stop_line": 699, + "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": 700, + "column": 30, + "stop_line": 700, + "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": 743, + "column": 9, + "stop_line": 743, + "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": 750, + "column": 37, + "stop_line": 750, + "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": 750, + "column": 56, + "stop_line": 750, + "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": 828, + "column": 26, + "stop_line": 828, + "stop_column": 39, + "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": 829, + "column": 26, + "stop_line": 829, + "stop_column": 47, + "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`", + "severity": "error" + }, + { + "line": 831, + "column": 26, + "stop_line": 831, + "stop_column": 39, + "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": 832, + "column": 26, + "stop_line": 832, + "stop_column": 47, + "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`", + "severity": "error" + }, + { + "line": 834, + "column": 26, + "stop_line": 834, + "stop_column": 39, + "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": 835, + "column": 26, + "stop_line": 835, + "stop_column": 47, + "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`", + "severity": "error" + }, + { + "line": 934, + "column": 15, + "stop_line": 934, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 943, + "column": 13, + "stop_line": 943, + "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": 964, + "column": 15, + "stop_line": 964, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 973, + "column": 13, + "stop_line": 973, + "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": 994, + "column": 15, + "stop_line": 994, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1003, + "column": 13, + "stop_line": 1003, + "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": 1026, + "column": 15, + "stop_line": 1026, + "stop_column": 36, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1035, + "column": 13, + "stop_line": 1035, + "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": 1050, + "column": 26, + "stop_line": 1050, + "stop_column": 47, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1161, + "column": 26, + "stop_line": 1161, + "stop_column": 47, + "path": "src/documents/tests/test_consumer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 32, + "column": 38, + "stop_line": 32, + "stop_column": 63, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 33, + "column": 9, + "stop_line": 33, + "stop_column": 35, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `double_sided_dir`", + "concise_description": "Class `dirs` has no class attribute `double_sided_dir`", + "severity": "error" + }, + { + "line": 34, + "column": 29, + "stop_line": 34, + "stop_column": 50, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 42, + "column": 15, + "stop_line": 42, + "stop_column": 41, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `double_sided_dir`", + "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": 106, + "column": 18, + "stop_line": 106, + "stop_column": 43, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 240, + "column": 21, + "stop_line": 240, + "stop_column": 46, + "path": "src/documents/tests/test_double_sided.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 505, + "column": 18, + "stop_line": 505, + "stop_column": 34, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 588, + "column": 27, + "stop_line": 588, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 608, + "column": 27, + "stop_line": 608, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 635, + "column": 30, + "stop_line": 635, + "stop_column": 46, + "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`", + "severity": "error" + }, + { + "line": 658, + "column": 27, + "stop_line": 658, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 682, + "column": 27, + "stop_line": 682, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 704, + "column": 27, + "stop_line": 704, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 735, + "column": 27, + "stop_line": 735, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 755, + "column": 27, + "stop_line": 755, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 786, + "column": 27, + "stop_line": 786, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 806, + "column": 27, + "stop_line": 806, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 814, + "column": 30, + "stop_line": 814, + "stop_column": 46, + "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`", + "severity": "error" + }, + { + "line": 841, + "column": 27, + "stop_line": 841, + "stop_column": 44, + "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`", + "severity": "error" + }, + { + "line": 848, + "column": 27, + "stop_line": 848, + "stop_column": 44, + "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`", + "severity": "error" + }, + { + "line": 874, + "column": 27, + "stop_line": 874, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 1657, + "column": 31, + "stop_line": 1657, + "stop_column": 48, + "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__`", + "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 1680, + "column": 31, + "stop_line": 1680, + "stop_column": 48, + "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__`", + "concise_description": "Argument `Any | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 166, + "column": 27, + "stop_line": 166, + "stop_column": 40, + "path": "src/documents/tests/test_filters.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal[1698330605] | dict[Any, Any] | list[object] | None` is not assignable to parameter `value` with type `date | datetime | str` in function `documents.templating.filters.localize_date`", + "concise_description": "Argument `Literal[1698330605] | dict[Any, Any] | list[object] | None` is not assignable to parameter `value` with type `date | datetime | str` in function `documents.templating.filters.localize_date`", + "severity": "error" + }, + { + "line": 34, + "column": 39, + "stop_line": 34, + "stop_column": 62, + "path": "src/documents/tests/test_management.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 40, + "column": 39, + "stop_line": 40, + "stop_column": 62, + "path": "src/documents/tests/test_management.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 48, + "column": 27, + "stop_line": 48, + "stop_column": 43, + "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`", + "severity": "error" + }, + { + "line": 84, + "column": 39, + "stop_line": 84, + "stop_column": 62, + "path": "src/documents/tests/test_management.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 85, + "column": 39, + "stop_line": 85, + "stop_column": 62, + "path": "src/documents/tests/test_management.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 118, + "column": 14, + "stop_line": 118, + "stop_column": 30, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 128, + "column": 30, + "stop_line": 128, + "stop_column": 46, + "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`", + "severity": "error" + }, + { + "line": 130, + "column": 27, + "stop_line": 130, + "stop_column": 44, + "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`", + "severity": "error" + }, + { + "line": 56, + "column": 24, + "stop_line": 56, + "stop_column": 52, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", + "concise_description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", + "severity": "error" + }, + { + "line": 56, + "column": 24, + "stop_line": 56, + "stop_column": 52, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", + "concise_description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", + "severity": "error" + }, + { + "line": 182, + "column": 22, + "stop_line": 182, + "stop_column": 27, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "line": 190, + "column": 28, + "stop_line": 190, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 193, + "column": 18, + "stop_line": 193, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 292, + "column": 28, + "stop_line": 292, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 295, + "column": 18, + "stop_line": 295, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 304, + "column": 28, + "stop_line": 304, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 307, + "column": 18, + "stop_line": 307, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 343, + "column": 28, + "stop_line": 343, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 346, + "column": 18, + "stop_line": 346, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 373, + "column": 28, + "stop_line": 373, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 376, + "column": 18, + "stop_line": 376, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 408, + "column": 28, + "stop_line": 408, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 411, + "column": 18, + "stop_line": 411, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 433, + "column": 24, + "stop_line": 433, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", + "concise_description": "Missing argument `ignore_errors` in function `unittest.case.TestCase.addCleanup`", + "severity": "error" + }, + { + "line": 433, + "column": 24, + "stop_line": 433, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", + "concise_description": "Missing argument `onerror` in function `unittest.case.TestCase.addCleanup`", + "severity": "error" + }, + { + "line": 453, + "column": 28, + "stop_line": 453, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 456, + "column": 18, + "stop_line": 456, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 461, + "column": 22, + "stop_line": 461, + "stop_column": 27, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "line": 486, + "column": 28, + "stop_line": 486, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 489, + "column": 18, + "stop_line": 489, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 497, + "column": 26, + "stop_line": 497, + "stop_column": 31, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "line": 526, + "column": 28, + "stop_line": 526, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 529, + "column": 18, + "stop_line": 529, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 543, + "column": 22, + "stop_line": 543, + "stop_column": 27, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "concise_description": "Argument `Path | str` is not assignable to parameter `command_name` with type `BaseCommand | str` in function `django.core.management.call_command`", + "severity": "error" + }, + { + "line": 624, + "column": 28, + "stop_line": 624, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 627, + "column": 18, + "stop_line": 627, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 665, + "column": 28, + "stop_line": 665, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 668, + "column": 18, + "stop_line": 668, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 708, + "column": 28, + "stop_line": 708, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 711, + "column": 18, + "stop_line": 711, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 739, + "column": 28, + "stop_line": 739, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 742, + "column": 18, + "stop_line": 742, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 764, + "column": 28, + "stop_line": 764, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 767, + "column": 18, + "stop_line": 767, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 799, + "column": 28, + "stop_line": 799, + "stop_column": 47, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 802, + "column": 18, + "stop_line": 802, + "stop_column": 37, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 823, + "column": 23, + "stop_line": 823, + "stop_column": 42, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 826, + "column": 13, + "stop_line": 826, + "stop_column": 32, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 836, + "column": 23, + "stop_line": 836, + "stop_column": 42, + "path": "src/documents/tests/test_management_exporter.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 41, + "column": 21, + "stop_line": 41, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 59, + "column": 25, + "stop_line": 59, + "stop_column": 46, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 67, + "column": 21, + "stop_line": 67, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 85, + "column": 25, + "stop_line": 85, + "stop_column": 46, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 96, + "column": 21, + "stop_line": 96, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 200, + "column": 10, + "stop_line": 200, + "stop_column": 33, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 202, + "column": 10, + "stop_line": 202, + "stop_column": 33, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 210, + "column": 21, + "stop_line": 210, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 238, + "column": 21, + "stop_line": 238, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 274, + "column": 21, + "stop_line": 274, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 294, + "column": 10, + "stop_line": 294, + "stop_column": 31, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 301, + "column": 21, + "stop_line": 301, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 320, + "column": 10, + "stop_line": 320, + "stop_column": 31, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 321, + "column": 10, + "stop_line": 321, + "stop_column": 31, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 330, + "column": 21, + "stop_line": 330, + "stop_column": 42, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 350, + "column": 20, + "stop_line": 350, + "stop_column": 41, + "path": "src/documents/tests/test_management_importer.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 25, + "column": 30, + "stop_line": 25, + "stop_column": 74, + "path": "src/documents/tests/test_models.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": 30, + "column": 27, + "stop_line": 30, + "stop_column": 71, + "path": "src/documents/tests/test_models.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": 154, + "column": 17, + "stop_line": 154, + "stop_column": 58, + "path": "src/documents/tests/test_parsers.py", + "code": -2, + "name": "not-callable", + "description": "Expected a callable, got `None`", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "line": 178, + "column": 17, + "stop_line": 178, + "stop_column": 58, + "path": "src/documents/tests/test_parsers.py", + "code": -2, + "name": "not-callable", + "description": "Expected a callable, got `None`", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "line": 211, + "column": 17, + "stop_line": 211, + "stop_column": 58, + "path": "src/documents/tests/test_parsers.py", + "code": -2, + "name": "not-callable", + "description": "Expected a callable, got `None`", + "concise_description": "Expected a callable, got `None`", + "severity": "error" + }, + { + "line": 27, + "column": 22, + "stop_line": 27, + "stop_column": 45, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 37, + "column": 22, + "stop_line": 37, + "stop_column": 43, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 47, + "column": 22, + "stop_line": 47, + "stop_column": 45, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `thumbnail_dir`", + "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", + "severity": "error" + }, + { + "line": 123, + "column": 14, + "stop_line": 123, + "stop_column": 30, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 128, + "column": 14, + "stop_line": 128, + "stop_column": 30, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 130, + "column": 14, + "stop_line": 130, + "stop_column": 30, + "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__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `*args` with type `PathLike[str] | str` in function `pathlib.Path.__new__`", + "severity": "error" + }, + { + "line": 153, + "column": 14, + "stop_line": 153, + "stop_column": 37, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 157, + "column": 32, + "stop_line": 157, + "stop_column": 36, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `dict[int, list[dict[Unknown, Unknown]]]`\n Argument `None` is not assignable to parameter `key` with type `int` in function `dict.__getitem__`", + "concise_description": "Cannot index into `dict[int, list[dict[Unknown, Unknown]]]`", + "severity": "error" + }, + { + "line": 166, + "column": 25, + "stop_line": 166, + "stop_column": 44, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 168, + "column": 14, + "stop_line": 168, + "stop_column": 33, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 174, + "column": 14, + "stop_line": 174, + "stop_column": 33, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 175, + "column": 14, + "stop_line": 175, + "stop_column": 33, + "path": "src/documents/tests/test_sanity_check.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 125, + "column": 28, + "stop_line": 125, + "stop_column": 47, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 139, + "column": 28, + "stop_line": 139, + "stop_column": 54, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", + "concise_description": "Object of class `_MonkeyPatchedResponse` has no attribute `streaming_content`", + "severity": "error" + }, + { + "line": 200, + "column": 29, + "stop_line": 200, + "stop_column": 48, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 204, + "column": 28, + "stop_line": 204, + "stop_column": 47, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 434, + "column": 30, + "stop_line": 434, + "stop_column": 49, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 437, + "column": 26, + "stop_line": 437, + "stop_column": 59, + "path": "src/documents/tests/test_share_link_bundles.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `resolve`", + "concise_description": "Object of class `NoneType` has no attribute `resolve`", + "severity": "error" + }, + { + "line": 94, + "column": 23, + "stop_line": 94, + "stop_column": 35, + "path": "src/documents/tests/test_tag_hierarchy.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "line": 107, + "column": 23, + "stop_line": 107, + "stop_column": 35, + "path": "src/documents/tests/test_tag_hierarchy.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "line": 54, + "column": 35, + "stop_line": 54, + "stop_column": 59, + "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__`", + "severity": "error" + }, + { + "line": 77, + "column": 26, + "stop_line": 77, + "stop_column": 39, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 98, + "column": 35, + "stop_line": 98, + "stop_column": 58, + "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__`", + "severity": "error" + }, + { + "line": 117, + "column": 26, + "stop_line": 117, + "stop_column": 39, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 137, + "column": 35, + "stop_line": 137, + "stop_column": 57, + "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__`", + "severity": "error" + }, + { + "line": 154, + "column": 19, + "stop_line": 154, + "stop_column": 32, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 159, + "column": 26, + "stop_line": 159, + "stop_column": 39, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 179, + "column": 35, + "stop_line": 179, + "stop_column": 57, + "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__`", + "severity": "error" + }, + { + "line": 200, + "column": 26, + "stop_line": 200, + "stop_column": 39, + "path": "src/documents/tests/test_task_signals.py", + "code": -2, + "name": "implicit-import", + "description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "concise_description": "Module `celery.states` exists, but was not imported explicitly. You are relying on other modules to load it.", + "severity": "error" + }, + { + "line": 216, + "column": 19, + "stop_line": 216, + "stop_column": 40, + "path": "src/documents/tests/test_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 225, + "column": 27, + "stop_line": 225, + "stop_column": 48, + "path": "src/documents/tests/test_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 257, + "column": 19, + "stop_line": 257, + "stop_column": 40, + "path": "src/documents/tests/test_tasks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 335, + "column": 55, + "stop_line": 335, + "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[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 41, + "column": 26, + "stop_line": 41, + "stop_column": 38, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "line": 66, + "column": 17, + "stop_line": 66, + "stop_column": 53, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 70, + "column": 17, + "stop_line": 70, + "stop_column": 52, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 74, + "column": 17, + "stop_line": 74, + "stop_column": 52, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 78, + "column": 17, + "stop_line": 78, + "stop_column": 54, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 82, + "column": 17, + "stop_line": 82, + "stop_column": 49, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 97, + "column": 9, + "stop_line": 97, + "stop_column": 24, + "path": "src/documents/tests/test_views.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": 98, + "column": 9, + "stop_line": 98, + "stop_column": 20, + "path": "src/documents/tests/test_views.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": 26, + "stop_line": 103, + "stop_column": 41, + "path": "src/documents/tests/test_views.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": 120, + "column": 44, + "stop_line": 120, + "stop_column": 67, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 159, + "column": 9, + "stop_line": 159, + "stop_column": 24, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "severity": "error" + }, + { + "line": 168, + "column": 9, + "stop_line": 168, + "stop_column": 24, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `render`", + "severity": "error" + }, + { + "line": 369, + "column": 13, + "stop_line": 372, + "stop_column": 26, + "path": "src/documents/tests/test_views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `suggestions`", + "concise_description": "Object of class `NoneType` has no attribute `suggestions`", + "severity": "error" + }, + { + "line": 136, + "column": 30, + "stop_line": 136, + "stop_column": 51, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 172, + "column": 13, + "stop_line": 172, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 186, + "column": 34, + "stop_line": 186, + "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": 187, + "column": 34, + "stop_line": 187, + "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": 188, + "column": 39, + "stop_line": 188, + "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": 189, + "column": 34, + "stop_line": 189, + "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": 190, + "column": 34, + "stop_line": 190, + "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": 194, + "column": 29, + "stop_line": 194, + "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": 201, + "column": 25, + "stop_line": 205, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 203, + "column": 29, + "stop_line": 203, + "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": 211, + "column": 29, + "stop_line": 211, + "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": 218, + "column": 25, + "stop_line": 222, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 220, + "column": 29, + "stop_line": 220, + "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": 226, + "column": 21, + "stop_line": 226, + "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": 230, + "column": 26, + "stop_line": 230, + "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`", + "severity": "error" + }, + { + "line": 234, + "column": 21, + "stop_line": 234, + "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`", + "severity": "error" + }, + { + "line": 283, + "column": 13, + "stop_line": 283, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 297, + "column": 34, + "stop_line": 297, + "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": 298, + "column": 34, + "stop_line": 298, + "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": 299, + "column": 39, + "stop_line": 299, + "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": 300, + "column": 34, + "stop_line": 300, + "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": 301, + "column": 34, + "stop_line": 301, + "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": 305, + "column": 29, + "stop_line": 305, + "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": 312, + "column": 25, + "stop_line": 316, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 314, + "column": 29, + "stop_line": 314, + "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": 322, + "column": 29, + "stop_line": 322, + "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": 329, + "column": 25, + "stop_line": 333, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 331, + "column": 29, + "stop_line": 331, + "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": 337, + "column": 21, + "stop_line": 337, + "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": 357, + "column": 30, + "stop_line": 357, + "stop_column": 51, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 401, + "column": 13, + "stop_line": 401, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 415, + "column": 34, + "stop_line": 415, + "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": 417, + "column": 34, + "stop_line": 417, + "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": 418, + "column": 34, + "stop_line": 418, + "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": 421, + "column": 26, + "stop_line": 421, + "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": 427, + "column": 29, + "stop_line": 427, + "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": 452, + "column": 29, + "stop_line": 452, + "stop_column": 50, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 469, + "column": 13, + "stop_line": 469, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 482, + "column": 34, + "stop_line": 482, + "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": 521, + "column": 13, + "stop_line": 521, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 534, + "column": 35, + "stop_line": 534, + "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": 535, + "column": 35, + "stop_line": 535, + "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": 536, + "column": 34, + "stop_line": 536, + "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": 537, + "column": 35, + "stop_line": 537, + "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": 538, + "column": 35, + "stop_line": 538, + "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": 541, + "column": 25, + "stop_line": 541, + "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": 543, + "column": 28, + "stop_line": 543, + "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": 546, + "column": 34, + "stop_line": 546, + "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": 546, + "column": 56, + "stop_line": 546, + "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": 549, + "column": 25, + "stop_line": 549, + "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": 551, + "column": 28, + "stop_line": 551, + "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": 554, + "column": 34, + "stop_line": 554, + "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": 554, + "column": 56, + "stop_line": 554, + "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": 555, + "column": 34, + "stop_line": 555, + "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": 559, + "column": 45, + "stop_line": 559, + "stop_column": 59, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `str` has no attribute `name`", + "concise_description": "Object of class `str` has no attribute `name`", + "severity": "error" + }, + { + "line": 595, + "column": 13, + "stop_line": 595, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 608, + "column": 35, + "stop_line": 608, + "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": 609, + "column": 35, + "stop_line": 609, + "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": 610, + "column": 34, + "stop_line": 610, + "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": 611, + "column": 35, + "stop_line": 611, + "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": 612, + "column": 35, + "stop_line": 612, + "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": 615, + "column": 25, + "stop_line": 615, + "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": 617, + "column": 28, + "stop_line": 617, + "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": 621, + "column": 21, + "stop_line": 623, + "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": 622, + "column": 25, + "stop_line": 622, + "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": 628, + "column": 25, + "stop_line": 628, + "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": 630, + "column": 28, + "stop_line": 630, + "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": 634, + "column": 21, + "stop_line": 636, + "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": 635, + "column": 25, + "stop_line": 635, + "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": 639, + "column": 34, + "stop_line": 639, + "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": 679, + "column": 13, + "stop_line": 679, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 693, + "column": 35, + "stop_line": 693, + "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": 694, + "column": 35, + "stop_line": 694, + "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": 695, + "column": 34, + "stop_line": 695, + "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": 696, + "column": 35, + "stop_line": 696, + "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": 697, + "column": 35, + "stop_line": 697, + "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": 700, + "column": 25, + "stop_line": 700, + "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": 702, + "column": 28, + "stop_line": 702, + "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": 706, + "column": 21, + "stop_line": 708, + "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": 707, + "column": 25, + "stop_line": 707, + "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": 713, + "column": 25, + "stop_line": 713, + "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": 715, + "column": 28, + "stop_line": 715, + "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": 719, + "column": 21, + "stop_line": 721, + "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": 720, + "column": 25, + "stop_line": 720, + "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": 724, + "column": 34, + "stop_line": 724, + "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": 764, + "column": 13, + "stop_line": 764, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 777, + "column": 35, + "stop_line": 777, + "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": 778, + "column": 35, + "stop_line": 778, + "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": 779, + "column": 34, + "stop_line": 779, + "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": 780, + "column": 35, + "stop_line": 780, + "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": 781, + "column": 35, + "stop_line": 781, + "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": 784, + "column": 25, + "stop_line": 784, + "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": 786, + "column": 28, + "stop_line": 786, + "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": 790, + "column": 21, + "stop_line": 792, + "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": 791, + "column": 25, + "stop_line": 791, + "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": 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_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": 799, + "column": 28, + "stop_line": 799, + "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": 803, + "column": 21, + "stop_line": 805, + "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": 804, + "column": 25, + "stop_line": 804, + "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": 808, + "column": 34, + "stop_line": 808, + "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": 882, + "column": 13, + "stop_line": 882, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 896, + "column": 26, + "stop_line": 896, + "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`", + "severity": "error" + }, + { + "line": 1314, + "column": 40, + "stop_line": 1314, + "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[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 1330, + "column": 35, + "stop_line": 1330, + "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[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 1349, + "column": 39, + "stop_line": 1349, + "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[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 1772, + "column": 26, + "stop_line": 1772, + "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`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1797, + "column": 13, + "stop_line": 1797, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 1809, + "column": 17, + "stop_line": 1809, + "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": 1855, + "column": 26, + "stop_line": 1855, + "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`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 1904, + "column": 38, + "stop_line": 1907, + "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, Unknown]`", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 1908, + "column": 40, + "stop_line": 1911, + "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, Unknown]`", + "concise_description": "`list[str] | Any` is not assignable to `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 1919, + "column": 33, + "stop_line": 1919, + "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, Unknown]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 2598, + "column": 26, + "stop_line": 2598, + "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`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 2601, + "column": 33, + "stop_line": 2601, + "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, Unknown]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 2669, + "column": 26, + "stop_line": 2669, + "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`", + "concise_description": "Object of class `Document` has no attribute `custom_fields`", + "severity": "error" + }, + { + "line": 2672, + "column": 33, + "stop_line": 2672, + "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, Unknown]`", + "concise_description": "`Group | dict[Unknown, Unknown]` is not assignable to `QuerySet[Unknown, Unknown]`", + "severity": "error" + }, + { + "line": 2736, + "column": 13, + "stop_line": 2736, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 2751, + "column": 35, + "stop_line": 2751, + "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": 2752, + "column": 35, + "stop_line": 2752, + "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": 2754, + "column": 26, + "stop_line": 2754, + "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": 2757, + "column": 35, + "stop_line": 2757, + "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": 2758, + "column": 35, + "stop_line": 2758, + "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": 2762, + "column": 29, + "stop_line": 2762, + "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": 2769, + "column": 25, + "stop_line": 2773, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 2771, + "column": 29, + "stop_line": 2771, + "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": 2779, + "column": 29, + "stop_line": 2779, + "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": 2786, + "column": 25, + "stop_line": 2790, + "stop_column": 22, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])\n Possible overloads:\n () -> None\n (iterable: Iterable[_T], /) -> None [closest match]", + "concise_description": "No matching overload found for function `list.__init__` called with arguments: (Group | dict[Unknown, Unknown])", + "severity": "error" + }, + { + "line": 2788, + "column": 29, + "stop_line": 2788, + "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": 2794, + "column": 21, + "stop_line": 2794, + "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": 2798, + "column": 26, + "stop_line": 2798, + "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`", + "severity": "error" + }, + { + "line": 2859, + "column": 13, + "stop_line": 2859, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 2872, + "column": 35, + "stop_line": 2872, + "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": 2873, + "column": 35, + "stop_line": 2873, + "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": 2874, + "column": 34, + "stop_line": 2874, + "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": 2876, + "column": 35, + "stop_line": 2876, + "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": 2877, + "column": 35, + "stop_line": 2877, + "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": 2880, + "column": 25, + "stop_line": 2880, + "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": 2882, + "column": 28, + "stop_line": 2882, + "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": 2886, + "column": 21, + "stop_line": 2888, + "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": 2887, + "column": 25, + "stop_line": 2887, + "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": 2893, + "column": 25, + "stop_line": 2893, + "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": 2895, + "column": 28, + "stop_line": 2895, + "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": 2899, + "column": 21, + "stop_line": 2901, + "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": 2900, + "column": 25, + "stop_line": 2900, + "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": 2905, + "column": 21, + "stop_line": 2905, + "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`", + "severity": "error" + }, + { + "line": 3014, + "column": 13, + "stop_line": 3014, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3026, + "column": 27, + "stop_line": 3026, + "stop_column": 44, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "concise_description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "line": 3114, + "column": 13, + "stop_line": 3114, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3152, + "column": 13, + "stop_line": 3152, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3372, + "column": 13, + "stop_line": 3372, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3492, + "column": 13, + "stop_line": 3492, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3621, + "column": 23, + "stop_line": 3621, + "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": 3639, + "column": 23, + "stop_line": 3639, + "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": 3664, + "column": 27, + "stop_line": 3664, + "stop_column": 31, + "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": 3712, + "column": 13, + "stop_line": 3712, + "stop_column": 34, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 3761, + "column": 23, + "stop_line": 3761, + "stop_column": 35, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "line": 3810, + "column": 23, + "stop_line": 3810, + "stop_column": 35, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "line": 3842, + "column": 23, + "stop_line": 3842, + "stop_column": 35, + "path": "src/documents/tests/test_workflows.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "concise_description": "Argument `int` is not assignable to parameter `trigger_type` with type `WorkflowTrigger.WorkflowTriggerType` in function `documents.signals.handlers.run_workflows`", + "severity": "error" + }, + { + "line": 3939, + "column": 19, + "stop_line": 3939, + "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": 3942, + "column": 16, + "stop_line": 3942, + "stop_column": 48, + "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": 3952, + "column": 19, + "stop_line": 3952, + "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": 3955, + "column": 16, + "stop_line": 3955, + "stop_column": 48, + "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": 3988, + "column": 23, + "stop_line": 3988, + "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": 3997, + "column": 23, + "stop_line": 3997, + "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": 4016, + "column": 23, + "stop_line": 4016, + "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": 4043, + "column": 23, + "stop_line": 4043, + "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": 4067, + "column": 19, + "stop_line": 4067, + "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": 4072, + "column": 16, + "stop_line": 4072, + "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": 4073, + "column": 16, + "stop_line": 4073, + "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": 4097, + "column": 23, + "stop_line": 4097, + "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": 4123, + "column": 19, + "stop_line": 4123, + "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": 4128, + "column": 16, + "stop_line": 4128, + "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": 4129, + "column": 35, + "stop_line": 4129, + "stop_column": 46, + "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": 4364, + "column": 20, + "stop_line": 4364, + "stop_column": 34, + "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\"", + "severity": "error" + }, + { + "line": 41, + "column": 22, + "stop_line": 41, + "stop_column": 35, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 42, + "column": 26, + "stop_line": 42, + "stop_column": 40, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 43, + "column": 26, + "stop_line": 43, + "stop_column": 40, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 44, + "column": 24, + "stop_line": 44, + "stop_column": 38, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 45, + "column": 24, + "stop_line": 45, + "stop_column": 37, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 47, + "column": 5, + "stop_line": 47, + "stop_column": 19, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `index_dir`", + "concise_description": "Class `dirs` has no class attribute `index_dir`", + "severity": "error" + }, + { + "line": 48, + "column": 5, + "stop_line": 48, + "stop_column": 23, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 49, + "column": 5, + "stop_line": 49, + "stop_column": 23, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `thumbnail_dir`", + "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", + "severity": "error" + }, + { + "line": 50, + "column": 5, + "stop_line": 50, + "stop_column": 21, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 51, + "column": 5, + "stop_line": 51, + "stop_column": 21, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `logging_dir`", + "concise_description": "Class `dirs` has no class attribute `logging_dir`", + "severity": "error" + }, + { + "line": 54, + "column": 18, + "stop_line": 54, + "stop_column": 31, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 55, + "column": 21, + "stop_line": 55, + "stop_column": 37, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `scratch_dir`", + "concise_description": "Class `dirs` has no class attribute `scratch_dir`", + "severity": "error" + }, + { + "line": 56, + "column": 20, + "stop_line": 56, + "stop_column": 34, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 57, + "column": 23, + "stop_line": 57, + "stop_column": 41, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `originals_dir`", + "concise_description": "Class `dirs` has no class attribute `originals_dir`", + "severity": "error" + }, + { + "line": 58, + "column": 23, + "stop_line": 58, + "stop_column": 41, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `thumbnail_dir`", + "concise_description": "Class `dirs` has no class attribute `thumbnail_dir`", + "severity": "error" + }, + { + "line": 59, + "column": 21, + "stop_line": 59, + "stop_column": 37, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `archive_dir`", + "concise_description": "Class `dirs` has no class attribute `archive_dir`", + "severity": "error" + }, + { + "line": 60, + "column": 25, + "stop_line": 60, + "stop_column": 45, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 61, + "column": 21, + "stop_line": 61, + "stop_column": 37, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `logging_dir`", + "concise_description": "Class `dirs` has no class attribute `logging_dir`", + "severity": "error" + }, + { + "line": 62, + "column": 19, + "stop_line": 62, + "stop_column": 33, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `index_dir`", + "concise_description": "Class `dirs` has no class attribute `index_dir`", + "severity": "error" + }, + { + "line": 63, + "column": 21, + "stop_line": 63, + "stop_column": 36, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `static_dir`", + "concise_description": "Class `dirs` has no class attribute `static_dir`", + "severity": "error" + }, + { + "line": 64, + "column": 20, + "stop_line": 64, + "stop_column": 33, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 65, + "column": 20, + "stop_line": 65, + "stop_column": 34, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 67, + "column": 5, + "stop_line": 67, + "stop_column": 27, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `settings_override`", + "concise_description": "Class `dirs` has no class attribute `settings_override`", + "severity": "error" + }, + { + "line": 88, + "column": 12, + "stop_line": 88, + "stop_column": 16, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "redundant-condition", + "description": "Class name `dirs` used as condition. It's equivalent to `True`", + "concise_description": "Class name `dirs` used as condition. It's equivalent to `True`", + "severity": "error" + }, + { + "line": 161, + "column": 9, + "stop_line": 161, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `setUp`", + "concise_description": "Object of class `object` has no attribute `setUp`", + "severity": "error" + }, + { + "line": 164, + "column": 9, + "stop_line": 164, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `tearDown`", + "concise_description": "Object of class `object` has no attribute `tearDown`", + "severity": "error" + }, + { + "line": 174, + "column": 9, + "stop_line": 174, + "stop_column": 24, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "severity": "error" + }, + { + "line": 177, + "column": 9, + "stop_line": 177, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", + "severity": "error" + }, + { + "line": 180, + "column": 9, + "stop_line": 180, + "stop_column": 24, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "severity": "error" + }, + { + "line": 183, + "column": 9, + "stop_line": 183, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertFalse`", + "severity": "error" + }, + { + "line": 197, + "column": 9, + "stop_line": 197, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", + "severity": "error" + }, + { + "line": 201, + "column": 9, + "stop_line": 201, + "stop_column": 24, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertTrue`", + "severity": "error" + }, + { + "line": 203, + "column": 9, + "stop_line": 203, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", + "concise_description": "Object of class `FileSystemAssertsMixin` has no attribute `assertEqual`", + "severity": "error" + }, + { + "line": 221, + "column": 9, + "stop_line": 221, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `setUp`", + "concise_description": "Object of class `object` has no attribute `setUp`", + "severity": "error" + }, + { + "line": 224, + "column": 9, + "stop_line": 224, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `tearDown`", + "concise_description": "Object of class `object` has no attribute `tearDown`", + "severity": "error" + }, + { + "line": 237, + "column": 9, + "stop_line": 237, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `setUp`", + "concise_description": "Object of class `object` has no attribute `setUp`", + "severity": "error" + }, + { + "line": 240, + "column": 9, + "stop_line": 240, + "stop_column": 25, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `tearDown`", + "concise_description": "Object of class `object` has no attribute `tearDown`", + "severity": "error" + }, + { + "line": 290, + "column": 16, + "stop_line": 290, + "stop_column": 74, + "path": "src/documents/tests/utils.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": 371, + "column": 13, + "stop_line": 371, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "line": 379, + "column": 13, + "stop_line": 379, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "line": 387, + "column": 13, + "stop_line": 387, + "stop_column": 22, + "path": "src/documents/tests/utils.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "concise_description": "Object of class `GetConsumerMixin` has no attribute `dirs`", + "severity": "error" + }, + { + "line": 72, + "column": 34, + "stop_line": 72, + "stop_column": 45, + "path": "src/documents/utils.py", + "code": -2, + "name": "bad-assignment", + "description": "`float | int | None` is not assignable to attribute `MAX_IMAGE_PIXELS` with type `int | None`", + "concise_description": "`float | int | None` is not assignable to attribute `MAX_IMAGE_PIXELS` with type `int | None`", + "severity": "error" + }, + { + "line": 251, + "column": 31, + "stop_line": 251, + "stop_column": 57, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `username`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `username`", + "severity": "error" + }, + { + "line": 252, + "column": 32, + "stop_line": 252, + "stop_column": 63, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `get_full_name`\nObject of class `AnonymousUser` has no attribute `get_full_name`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `get_full_name`\nObject of class `AnonymousUser` has no attribute `get_full_name`", + "severity": "error" + }, + { + "line": 302, + "column": 17, + "stop_line": 302, + "stop_column": 30, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "severity": "error" + }, + { + "line": 334, + "column": 19, + "stop_line": 334, + "stop_column": 49, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `get_serializer_context`", + "concise_description": "Object of class `object` has no attribute `get_serializer_context`", + "severity": "error" + }, + { + "line": 337, + "column": 21, + "stop_line": 337, + "stop_column": 33, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BulkPermissionMixin` has no attribute `request`", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `request`", + "severity": "error" + }, + { + "line": 352, + "column": 24, + "stop_line": 352, + "stop_column": 44, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BulkPermissionMixin` has no attribute `filter_queryset`", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `filter_queryset`", + "severity": "error" + }, + { + "line": 352, + "column": 45, + "stop_line": 352, + "stop_column": 62, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BulkPermissionMixin` has no attribute `get_queryset`", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `get_queryset`", + "severity": "error" + }, + { + "line": 354, + "column": 22, + "stop_line": 354, + "stop_column": 35, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "concise_description": "Object of class `BulkPermissionMixin` has no attribute `queryset`", + "severity": "error" + }, + { + "line": 429, + "column": 29, + "stop_line": 429, + "stop_column": 51, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `annotate`", + "concise_description": "Object of class `NoneType` has no attribute `annotate`", + "severity": "error" + }, + { + "line": 435, + "column": 25, + "stop_line": 435, + "stop_column": 47, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `annotate`", + "concise_description": "Object of class `NoneType` has no attribute `annotate`", + "severity": "error" + }, + { + "line": 450, + "column": 15, + "stop_line": 450, + "stop_column": 37, + "path": "src/documents/views.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)\n Possible overloads:\n (cls: type[int], x: ConvertibleToInt = 0, /) -> int [closest match]\n (cls: type[int], x: bytearray | bytes | str, /, base: SupportsIndex) -> int", + "concise_description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)", + "severity": "error" + }, + { + "line": 498, + "column": 13, + "stop_line": 498, + "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": 819, + "column": 9, + "stop_line": 819, + "stop_column": 16, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DocumentViewSet.destroy` overrides parent class `DestroyModelMixin` in an inconsistent manner\n `DocumentViewSet.destroy` has type `BoundMethod[DocumentViewSet, (self: DocumentViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response]`, which is not assignable to `BoundMethod[DocumentViewSet, (self: DocumentViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `DestroyModelMixin.destroy`", + "concise_description": "Class member `DocumentViewSet.destroy` overrides parent class `DestroyModelMixin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 916, + "column": 37, + "stop_line": 916, + "stop_column": 54, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Unknown] | None` is not assignable to parameter `original_metadata` with type `list[Unknown]` in function `documents.caching.set_metadata_cache`", + "concise_description": "Argument `list[Unknown] | None` is not assignable to parameter `original_metadata` with type `list[Unknown]` in function `documents.caching.set_metadata_cache`", + "severity": "error" + }, + { + "line": 1027, + "column": 45, + "stop_line": 1027, + "stop_column": 57, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Any | None` is not assignable to parameter `filename` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", + "concise_description": "Argument `Any | None` is not assignable to parameter `filename` with type `str` in function `documents.plugins.date_parsing.base.DateParserPluginBase.parse`", + "severity": "error" + }, + { + "line": 1040, + "column": 61, + "stop_line": 1040, + "stop_column": 71, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_correspondents`", + "severity": "error" + }, + { + "line": 1042, + "column": 56, + "stop_line": 1042, + "stop_column": 66, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_tags`", + "severity": "error" + }, + { + "line": 1044, + "column": 63, + "stop_line": 1044, + "stop_column": 73, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_document_types`", + "severity": "error" + }, + { + "line": 1047, + "column": 62, + "stop_line": 1047, + "stop_column": 72, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "concise_description": "Argument `DocumentClassifier | None` is not assignable to parameter `classifier` with type `DocumentClassifier` in function `documents.matching.match_storage_paths`", + "severity": "error" + }, + { + "line": 1151, + "column": 21, + "stop_line": 1151, + "stop_column": 48, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `log_create`", + "concise_description": "Object of class `Manager` has no attribute `log_create`", + "severity": "error" + }, + { + "line": 1186, + "column": 17, + "stop_line": 1186, + "stop_column": 44, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `log_create`", + "concise_description": "Object of class `Manager` has no attribute `log_create`", + "severity": "error" + }, + { + "line": 1213, + "column": 5, + "stop_line": 1213, + "stop_column": 62, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-specialization", + "description": "`(self: Self@DocumentViewSet, request: Unknown, pk: Unknown | None = None) -> HttpResponseForbidden | Response | None` is not assignable to upper bound `(...) -> HttpResponseBase` of type variable `_View`", + "concise_description": "`(self: Self@DocumentViewSet, request: Unknown, pk: Unknown | None = None) -> HttpResponseForbidden | Response | None` is not assignable to upper bound `(...) -> HttpResponseBase` of type variable `_View`", + "severity": "error" + }, + { + "line": 1270, + "column": 26, + "stop_line": 1270, + "stop_column": 57, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `get_for_object`", + "concise_description": "Object of class `Manager` has no attribute `get_for_object`", + "severity": "error" + }, + { + "line": 1276, + "column": 22, + "stop_line": 1276, + "stop_column": 54, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `get_for_objects`", + "concise_description": "Object of class `Manager` has no attribute `get_for_objects`", + "severity": "error" + }, + { + "line": 1277, + "column": 13, + "stop_line": 1277, + "stop_column": 30, + "path": "src/documents/views.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": 1311, + "column": 36, + "stop_line": 1311, + "stop_column": 64, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-argument", + "description": "Missing argument `request` in function `DocumentViewSet.email_documents`", + "concise_description": "Missing argument `request` in function `DocumentViewSet.email_documents`", + "severity": "error" + }, + { + "line": 1351, + "column": 30, + "stop_line": 1351, + "stop_column": 45, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.mail.EmailAttachment.__init__`", + "concise_description": "Argument `Path | None` is not assignable to parameter `path` with type `Path` in function `documents.mail.EmailAttachment.__init__`", + "severity": "error" + }, + { + "line": 1424, + "column": 70, + "stop_line": 1424, + "stop_column": 79, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `QuerySet[Unknown, 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, Unknown] | list[Document]` is not assignable to parameter `documents` with type `list[Document]` in function `paperless_ai.chat.stream_chat_with_documents`", + "severity": "error" + }, + { + "line": 1480, + "column": 9, + "stop_line": 1480, + "stop_column": 24, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `UnifiedSearchViewSet.filter_queryset` overrides parent class `DocumentViewSet` in an inconsistent manner\n `UnifiedSearchViewSet.filter_queryset` has type `BoundMethod[UnifiedSearchViewSet, (self: UnifiedSearchViewSet, queryset: Unknown) -> DelayedFullTextQuery | DelayedMoreLikeThisQuery | QuerySet[Unknown, Unknown]]`, which is not assignable to `BoundMethod[UnifiedSearchViewSet, (self: UnifiedSearchViewSet, queryset: QuerySet[Unknown, Unknown]) -> QuerySet[Unknown, Unknown]]`, the type of `DocumentViewSet.filter_queryset`", + "concise_description": "Class member `UnifiedSearchViewSet.filter_queryset` overrides parent class `DocumentViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 1494, + "column": 17, + "stop_line": 1494, + "stop_column": 30, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `searcher` with type `Searcher` in function `documents.index.DelayedQuery.__init__`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `searcher` with type `Searcher` in function `documents.index.DelayedQuery.__init__`", + "severity": "error" + }, + { + "line": 1496, + "column": 17, + "stop_line": 1496, + "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": 1502, + "column": 9, + "stop_line": 1502, + "stop_column": 13, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `UnifiedSearchViewSet.list` overrides parent class `DocumentViewSet` in an inconsistent manner\n `UnifiedSearchViewSet.list` has type `BoundMethod[UnifiedSearchViewSet, (self: UnifiedSearchViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response]`, which is not assignable to `BoundMethod[UnifiedSearchViewSet, (self: UnifiedSearchViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `DocumentViewSet.list`", + "concise_description": "Class member `UnifiedSearchViewSet.list` overrides parent class `DocumentViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 1510, + "column": 51, + "stop_line": 1510, + "stop_column": 59, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `DelayedFullTextQuery | DelayedMoreLikeThisQuery | QuerySet[Unknown, Unknown]` is not assignable to parameter `queryset` with type `QuerySet[Unknown, Unknown] | Sequence[Any]` in function `rest_framework.generics.GenericAPIView.paginate_queryset`", + "concise_description": "Argument `DelayedFullTextQuery | DelayedMoreLikeThisQuery | QuerySet[Unknown, Unknown]` is not assignable to parameter `queryset` with type `QuerySet[Unknown, Unknown] | Sequence[Any]` in function `rest_framework.generics.GenericAPIView.paginate_queryset`", + "severity": "error" + }, + { + "line": 1539, + "column": 25, + "stop_line": 1539, + "stop_column": 36, + "path": "src/documents/views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`+` is not supported between `None` and `Literal[1]`\n Argument `None` is not assignable to parameter `value` with type `int` in function `int.__radd__`", + "concise_description": "`+` is not supported between `None` and `Literal[1]`", + "severity": "error" + }, + { + "line": 1704, + "column": 16, + "stop_line": 1704, + "stop_column": 33, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "line": 1713, + "column": 25, + "stop_line": 1713, + "stop_column": 38, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "severity": "error" + }, + { + "line": 1750, + "column": 25, + "stop_line": 1750, + "stop_column": 38, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "severity": "error" + }, + { + "line": 1764, + "column": 25, + "stop_line": 1764, + "stop_column": 38, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "severity": "error" + }, + { + "line": 1793, + "column": 33, + "stop_line": 1793, + "stop_column": 46, + "path": "src/documents/views.py", + "code": -2, + "name": "unbound-name", + "description": "`old_documents` may be uninitialized", + "concise_description": "`old_documents` may be uninitialized", + "severity": "error" + }, + { + "line": 1803, + "column": 21, + "stop_line": 1803, + "stop_column": 48, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Manager` has no attribute `log_create`", + "concise_description": "Object of class `Manager` has no attribute `log_create`", + "severity": "error" + }, + { + "line": 2009, + "column": 52, + "stop_line": 2009, + "stop_column": 68, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Correspondent` has no attribute `document_count`", + "concise_description": "Object of class `Correspondent` has no attribute `document_count`", + "severity": "error" + }, + { + "line": 2013, + "column": 52, + "stop_line": 2013, + "stop_column": 68, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Tag` has no attribute `document_count`", + "concise_description": "Object of class `Tag` has no attribute `document_count`", + "severity": "error" + }, + { + "line": 2016, + "column": 52, + "stop_line": 2016, + "stop_column": 68, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `DocumentType` has no attribute `document_count`", + "concise_description": "Object of class `DocumentType` has no attribute `document_count`", + "severity": "error" + }, + { + "line": 2019, + "column": 52, + "stop_line": 2019, + "stop_column": 68, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `StoragePath` has no attribute `document_count`", + "concise_description": "Object of class `StoragePath` has no attribute `document_count`", + "severity": "error" + }, + { + "line": 2023, + "column": 52, + "stop_line": 2023, + "stop_column": 68, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `CustomField` has no attribute `document_count`", + "concise_description": "Object of class `CustomField` has no attribute `document_count`", + "severity": "error" + }, + { + "line": 2083, + "column": 17, + "stop_line": 2083, + "stop_column": 21, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `AbstractBaseUser | AnonymousUser | None` is not assignable to parameter `user` with type `User | None` in function `documents.index.autocomplete`", + "concise_description": "Argument `AbstractBaseUser | AnonymousUser | None` is not assignable to parameter `user` with type `User | None` in function `documents.index.autocomplete`", + "severity": "error" + }, + { + "line": 3051, + "column": 24, + "stop_line": 3051, + "stop_column": 51, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BaseSerializer` has no attribute `get_object_class`", + "concise_description": "Object of class `BaseSerializer` has no attribute `get_object_class`", + "severity": "error" + }, + { + "line": 3056, + "column": 16, + "stop_line": 3056, + "stop_column": 33, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "line": 3063, + "column": 25, + "stop_line": 3063, + "stop_column": 38, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `has_perm`", + "severity": "error" + }, + { + "line": 3118, + "column": 9, + "stop_line": 3118, + "stop_column": 23, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `WorkflowTriggerViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner\n `WorkflowTriggerViewSet.partial_update` has type `BoundMethod[WorkflowTriggerViewSet, (self: WorkflowTriggerViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response]`, which is not assignable to `BoundMethod[WorkflowTriggerViewSet, (self: WorkflowTriggerViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `ModelViewSet.partial_update`", + "concise_description": "Class member `WorkflowTriggerViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 3143, + "column": 9, + "stop_line": 3143, + "stop_column": 23, + "path": "src/documents/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `WorkflowActionViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner\n `WorkflowActionViewSet.partial_update` has type `BoundMethod[WorkflowActionViewSet, (self: WorkflowActionViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseBadRequest | Response]`, which is not assignable to `BoundMethod[WorkflowActionViewSet, (self: WorkflowActionViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `ModelViewSet.partial_update`", + "concise_description": "Class member `WorkflowActionViewSet.partial_update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 3187, + "column": 45, + "stop_line": 3187, + "stop_column": 75, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `is_superuser`", + "severity": "error" + }, + { + "line": 3343, + "column": 36, + "stop_line": 3343, + "stop_column": 52, + "path": "src/documents/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `keys`", + "concise_description": "Object of class `NoneType` has no attribute `keys`", + "severity": "error" + }, + { + "line": 3344, + "column": 33, + "stop_line": 3344, + "stop_column": 56, + "path": "src/documents/views.py", + "code": -2, + "name": "unsupported-operation", + "description": "`None` is not subscriptable", + "concise_description": "`None` is not subscriptable", + "severity": "error" + }, + { + "line": 3459, + "column": 40, + "stop_line": 3459, + "stop_column": 54, + "path": "src/documents/views.py", + "code": -2, + "name": "unbound-name", + "description": "`all_migrations` may be uninitialized", + "concise_description": "`all_migrations` may be uninitialized", + "severity": "error" + }, + { + "line": 3467, + "column": 38, + "stop_line": 3467, + "stop_column": 51, + "path": "src/documents/views.py", + "code": -2, + "name": "unbound-name", + "description": "`celery_active` may be uninitialized", + "concise_description": "`celery_active` may be uninitialized", + "severity": "error" + }, + { + "line": 3531, + "column": 16, + "stop_line": 3531, + "stop_column": 31, + "path": "src/documents/views.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": 36, + "column": 22, + "stop_line": 36, + "stop_column": 36, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `title`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `title`", + "severity": "error" + }, + { + "line": 37, + "column": 80, + "stop_line": 37, + "stop_column": 91, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `pk`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", + "severity": "error" + }, + { + "line": 38, + "column": 30, + "stop_line": 38, + "stop_column": 57, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `name`", + "concise_description": "Object of class `object` has no attribute `name`", + "severity": "error" + }, + { + "line": 39, + "column": 16, + "stop_line": 39, + "stop_column": 38, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `correspondent`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `correspondent`", + "severity": "error" + }, + { + "line": 41, + "column": 30, + "stop_line": 41, + "stop_column": 57, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `name`", + "concise_description": "Object of class `object` has no attribute `name`", + "severity": "error" + }, + { + "line": 42, + "column": 16, + "stop_line": 42, + "stop_column": 38, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `document_type`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `document_type`", + "severity": "error" + }, + { + "line": 44, + "column": 31, + "stop_line": 44, + "stop_column": 54, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `username`", + "concise_description": "Object of class `object` has no attribute `username`", + "severity": "error" + }, + { + "line": 44, + "column": 58, + "stop_line": 44, + "stop_column": 72, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `owner`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `owner`", + "severity": "error" + }, + { + "line": 45, + "column": 25, + "stop_line": 45, + "stop_column": 51, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `original_filename`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `original_filename`", + "severity": "error" + }, + { + "line": 46, + "column": 33, + "stop_line": 46, + "stop_column": 50, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `filename`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `filename`", + "severity": "error" + }, + { + "line": 47, + "column": 41, + "stop_line": 47, + "stop_column": 55, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `added`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `added`", + "severity": "error" + }, + { + "line": 48, + "column": 24, + "stop_line": 48, + "stop_column": 40, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `created`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `created`", + "severity": "error" + }, + { + "line": 49, + "column": 19, + "stop_line": 49, + "stop_column": 30, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `ConsumableDocument` has no attribute `pk`", + "concise_description": "Object of class `ConsumableDocument` has no attribute `pk`", + "severity": "error" + }, + { + "line": 68, + "column": 42, + "stop_line": 68, + "stop_column": 64, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Document` has no attribute `original_file`", + "concise_description": "Object of class `Document` has no attribute `original_file`", + "severity": "error" + }, + { + "line": 106, + "column": 13, + "stop_line": 106, + "stop_column": 33, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 118, + "column": 12, + "stop_line": 118, + "stop_column": 32, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `subject`", + "concise_description": "Object of class `NoneType` has no attribute `subject`", + "severity": "error" + }, + { + "line": 123, + "column": 13, + "stop_line": 123, + "stop_column": 30, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 135, + "column": 12, + "stop_line": 135, + "stop_column": 29, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `body`", + "concise_description": "Object of class `NoneType` has no attribute `body`", + "severity": "error" + }, + { + "line": 141, + "column": 12, + "stop_line": 141, + "stop_column": 41, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `include_document`", + "concise_description": "Object of class `NoneType` has no attribute `include_document`", + "severity": "error" + }, + { + "line": 174, + "column": 16, + "stop_line": 174, + "stop_column": 31, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `to`", + "concise_description": "Object of class `NoneType` has no attribute `to`", + "severity": "error" + }, + { + "line": 178, + "column": 59, + "stop_line": 178, + "stop_column": 74, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `to`", + "concise_description": "Object of class `NoneType` has no attribute `to`", + "severity": "error" + }, + { + "line": 197, + "column": 12, + "stop_line": 197, + "stop_column": 37, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `use_params`", + "concise_description": "Object of class `NoneType` has no attribute `use_params`", + "severity": "error" + }, + { + "line": 198, + "column": 16, + "stop_line": 198, + "stop_column": 37, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `params`", + "concise_description": "Object of class `NoneType` has no attribute `params`", + "severity": "error" + }, + { + "line": 200, + "column": 39, + "stop_line": 200, + "stop_column": 66, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `items`", + "concise_description": "Object of class `object` has no attribute `items`", + "severity": "error" + }, + { + "line": 219, + "column": 14, + "stop_line": 219, + "stop_column": 33, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `body`", + "concise_description": "Object of class `NoneType` has no attribute `body`", + "severity": "error" + }, + { + "line": 221, + "column": 17, + "stop_line": 221, + "stop_column": 36, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "concise_description": "Argument `object | str` is not assignable to parameter `text` with type `str` in function `documents.templating.workflows.parse_w_workflow_placeholders`", + "severity": "error" + }, + { + "line": 234, + "column": 12, + "stop_line": 234, + "stop_column": 34, + "path": "src/documents/workflows/actions.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": 236, + "column": 55, + "stop_line": 236, + "stop_column": 83, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `object` has no attribute `items`", + "concise_description": "Object of class `object` has no attribute `items`", + "severity": "error" + }, + { + "line": 243, + "column": 12, + "stop_line": 243, + "stop_column": 43, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `include_document`", + "concise_description": "Object of class `NoneType` has no attribute `include_document`", + "severity": "error" + }, + { + "line": 255, + "column": 17, + "stop_line": 255, + "stop_column": 35, + "path": "src/documents/workflows/actions.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": 258, + "column": 19, + "stop_line": 258, + "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": 259, + "column": 21, + "stop_line": 259, + "stop_column": 43, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `as_json`", + "concise_description": "Object of class `NoneType` has no attribute `as_json`", + "severity": "error" + }, + { + "line": 262, + "column": 27, + "stop_line": 262, + "stop_column": 45, + "path": "src/documents/workflows/actions.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": 298, + "column": 43, + "stop_line": 298, + "stop_column": 65, + "path": "src/documents/workflows/actions.py", + "code": -2, + "name": "bad-assignment", + "description": "`Unknown | None` is not assignable to `Document`", + "concise_description": "`Unknown | None` is not assignable to `Document`", + "severity": "error" + }, + { + "line": 27, + "column": 8, + "stop_line": 27, + "stop_column": 30, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "severity": "error" + }, + { + "line": 70, + "column": 13, + "stop_line": 70, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "severity": "error" + }, + { + "line": 71, + "column": 13, + "stop_line": 71, + "stop_column": 42, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "severity": "error" + }, + { + "line": 72, + "column": 13, + "stop_line": 72, + "stop_column": 43, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "severity": "error" + }, + { + "line": 73, + "column": 13, + "stop_line": 73, + "stop_column": 44, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "severity": "error" + }, + { + "line": 92, + "column": 8, + "stop_line": 92, + "stop_column": 39, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "severity": "error" + }, + { + "line": 95, + "column": 27, + "stop_line": 95, + "stop_column": 42, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "concise_description": "Argument `str` is not assignable to parameter `data_type` with type `CustomField.FieldDataType` in function `documents.models.CustomFieldInstance.get_value_field_name`", + "severity": "error" + }, + { + "line": 98, + "column": 35, + "stop_line": 98, + "stop_column": 73, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 128, + "column": 8, + "stop_line": 128, + "stop_column": 30, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_tags`", + "severity": "error" + }, + { + "line": 155, + "column": 13, + "stop_line": 155, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_users`", + "severity": "error" + }, + { + "line": 156, + "column": 13, + "stop_line": 156, + "stop_column": 42, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_view_groups`", + "severity": "error" + }, + { + "line": 157, + "column": 13, + "stop_line": 157, + "stop_column": 43, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_users`", + "severity": "error" + }, + { + "line": 158, + "column": 13, + "stop_line": 158, + "stop_column": 44, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_change_groups`", + "severity": "error" + }, + { + "line": 186, + "column": 8, + "stop_line": 186, + "stop_column": 39, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_assign_custom_fields`", + "severity": "error" + }, + { + "line": 191, + "column": 27, + "stop_line": 191, + "stop_column": 65, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 257, + "column": 13, + "stop_line": 257, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "severity": "error" + }, + { + "line": 258, + "column": 13, + "stop_line": 258, + "stop_column": 42, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "severity": "error" + }, + { + "line": 259, + "column": 13, + "stop_line": 259, + "stop_column": 43, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "severity": "error" + }, + { + "line": 260, + "column": 13, + "stop_line": 260, + "stop_column": 44, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "severity": "error" + }, + { + "line": 273, + "column": 9, + "stop_line": 273, + "stop_column": 74, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `QuerySet` has no attribute `hard_delete`", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "line": 274, + "column": 10, + "stop_line": 274, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "severity": "error" + }, + { + "line": 275, + "column": 9, + "stop_line": 278, + "stop_column": 22, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `QuerySet` has no attribute `hard_delete`", + "concise_description": "Object of class `QuerySet` has no attribute `hard_delete`", + "severity": "error" + }, + { + "line": 331, + "column": 13, + "stop_line": 331, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_users`", + "severity": "error" + }, + { + "line": 332, + "column": 13, + "stop_line": 332, + "stop_column": 42, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_view_groups`", + "severity": "error" + }, + { + "line": 333, + "column": 13, + "stop_line": 333, + "stop_column": 43, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_users`", + "severity": "error" + }, + { + "line": 334, + "column": 13, + "stop_line": 334, + "stop_column": 44, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_change_groups`", + "severity": "error" + }, + { + "line": 356, + "column": 10, + "stop_line": 356, + "stop_column": 41, + "path": "src/documents/workflows/mutations.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "concise_description": "Object of class `WorkflowAction` has no attribute `has_remove_custom_fields`", + "severity": "error" + }, + { + "line": 53, + "column": 48, + "stop_line": 53, + "stop_column": 54, + "path": "src/documents/workflows/webhooks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int | str` is not assignable to parameter `ip` with type `str` in function `WebhookTransport._format_ip_for_url`", + "concise_description": "Argument `int | str` is not assignable to parameter `ip` with type `str` in function `WebhookTransport._format_ip_for_url`", + "severity": "error" + }, + { + "line": 102, + "column": 20, + "stop_line": 102, + "stop_column": 51, + "path": "src/documents/workflows/webhooks.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `int | str | None` is not assignable to declared return type `str | None`", + "concise_description": "Returned type `int | str | None` is not assignable to declared return type `str | None`", + "severity": "error" + }, + { + "line": 23, + "column": 9, + "stop_line": 23, + "stop_column": 27, + "path": "src/paperless/adapter.py", + "code": -2, + "name": "bad-override", + "description": "Class member `CustomAccountAdapter.is_open_for_signup` overrides parent class `DefaultAccountAdapter` in an inconsistent manner\n `CustomAccountAdapter.is_open_for_signup` has type `BoundMethod[CustomAccountAdapter, (self: CustomAccountAdapter, request: Unknown) -> bool | Any]`, which is not assignable to `BoundMethod[CustomAccountAdapter, (self: CustomAccountAdapter, request: Unknown) -> Literal[True]]`, the type of `DefaultAccountAdapter.is_open_for_signup`", + "concise_description": "Class member `CustomAccountAdapter.is_open_for_signup` overrides parent class `DefaultAccountAdapter` in an inconsistent manner", + "severity": "error" + }, + { + "line": 58, + "column": 26, + "stop_line": 58, + "stop_column": 50, + "path": "src/paperless/adapter.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get_host`", + "concise_description": "Object of class `NoneType` has no attribute `get_host`", + "severity": "error" + }, + { + "line": 63, + "column": 31, + "stop_line": 63, + "stop_column": 55, + "path": "src/paperless/adapter.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get_host`", + "concise_description": "Object of class `NoneType` has no attribute `get_host`", + "severity": "error" + }, + { + "line": 109, + "column": 9, + "stop_line": 109, + "stop_column": 27, + "path": "src/paperless/adapter.py", + "code": -2, + "name": "bad-override", + "description": "Class member `CustomSocialAccountAdapter.is_open_for_signup` overrides parent class `DefaultSocialAccountAdapter` in an inconsistent manner\n `CustomSocialAccountAdapter.is_open_for_signup` has type `BoundMethod[CustomSocialAccountAdapter, (self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> bool | Any]`, which is not assignable to `BoundMethod[CustomSocialAccountAdapter, (self: CustomSocialAccountAdapter, request: Unknown, sociallogin: Unknown) -> Literal[True]]`, the type of `DefaultSocialAccountAdapter.is_open_for_signup`", + "concise_description": "Class member `CustomSocialAccountAdapter.is_open_for_signup` overrides parent class `DefaultSocialAccountAdapter` in an inconsistent manner", + "severity": "error" + }, + { + "line": 30, + "column": 24, + "stop_line": 30, + "stop_column": 40, + "path": "src/paperless/admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 33, + "column": 17, + "stop_line": 33, + "stop_column": 29, + "path": "src/paperless/admin.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PaperlessUserForm` has no attribute `request`", + "concise_description": "Object of class `PaperlessUserForm` has no attribute `request`", + "severity": "error" + }, + { + "line": 46, + "column": 9, + "stop_line": 46, + "stop_column": 17, + "path": "src/paperless/admin.py", + "code": -2, + "name": "bad-override", + "description": "Class member `PaperlessUserAdmin.get_form` overrides parent class `UserAdmin` in an inconsistent manner\n `PaperlessUserAdmin.get_form` has type `BoundMethod[PaperlessUserAdmin, (self: PaperlessUserAdmin, request: Unknown, obj: Unknown | None = None, **kwargs: Unknown) -> type[ModelForm[Unknown]]]`, which is not assignable to `BoundMethod[PaperlessUserAdmin, (self: PaperlessUserAdmin, request: HttpRequest, obj: Unknown | None = ..., change: bool = ..., **kwargs: Any) -> type[ModelForm[Unknown]]]`, the type of `UserAdmin.get_form`", + "concise_description": "Class member `PaperlessUserAdmin.get_form` overrides parent class `UserAdmin` in an inconsistent manner", + "severity": "error" + }, + { + "line": 65, + "column": 20, + "stop_line": 65, + "stop_column": 46, + "path": "src/paperless/auth.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "severity": "error" + }, + { + "line": 66, + "column": 16, + "stop_line": 66, + "stop_column": 41, + "path": "src/paperless/auth.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "concise_description": "Returned type `Awaitable[HttpResponseBase] | HttpResponseBase` is not assignable to declared return type `None`", + "severity": "error" + }, + { + "line": 88, + "column": 35, + "stop_line": 88, + "stop_column": 70, + "path": "src/paperless/checks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "concise_description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "severity": "error" + }, + { + "line": 93, + "column": 1, + "stop_line": 93, + "stop_column": 12, + "path": "src/paperless/checks.py", + "code": -2, + "name": "bad-specialization", + "description": "`(app_configs: Unknown, **kwargs: Unknown) -> list[django.core.checks.messages.Warning | builtins.Warning] | list[Unknown]` is not assignable to upper bound `_CheckCallable` of type variable `_C`", + "concise_description": "`(app_configs: Unknown, **kwargs: Unknown) -> list[django.core.checks.messages.Warning | builtins.Warning] | list[Unknown]` is not assignable to upper bound `_CheckCallable` of type variable `_C`", + "severity": "error" + }, + { + "line": 138, + "column": 17, + "stop_line": 142, + "stop_column": 18, + "path": "src/paperless/checks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `Error` in function `list.append`", + "concise_description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `Error` in function `list.append`", + "severity": "error" + }, + { + "line": 211, + "column": 13, + "stop_line": 213, + "stop_column": 14, + "path": "src/paperless/checks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "concise_description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "severity": "error" + }, + { + "line": 22, + "column": 16, + "stop_line": 22, + "stop_column": 26, + "path": "src/paperless/config.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `ApplicationConfiguration | None` is not assignable to declared return type `ApplicationConfiguration`", + "concise_description": "Returned type `ApplicationConfiguration | None` is not assignable to declared return type `ApplicationConfiguration`", + "severity": "error" + }, + { + "line": 174, + "column": 26, + "stop_line": 174, + "stop_column": 54, + "path": "src/paperless/config.py", + "code": -2, + "name": "bad-assignment", + "description": "`str | None` is not assignable to attribute `app_title` with type `str`", + "concise_description": "`str | None` is not assignable to attribute `app_title` with type `str`", + "severity": "error" + }, + { + "line": 175, + "column": 25, + "stop_line": 175, + "stop_column": 81, + "path": "src/paperless/config.py", + "code": -2, + "name": "bad-assignment", + "description": "`Unknown | None` is not assignable to attribute `app_logo` with type `str`", + "concise_description": "`Unknown | None` is not assignable to attribute `app_logo` with type `str`", + "severity": "error" + }, + { + "line": 11, + "column": 41, + "stop_line": 11, + "stop_column": 76, + "path": "src/paperless/consumers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `is_authenticated`", + "concise_description": "Object of class `NoneType` has no attribute `is_authenticated`", + "severity": "error" + }, + { + "line": 19, + "column": 13, + "stop_line": 19, + "stop_column": 30, + "path": "src/paperless/consumers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `is_superuser`", + "concise_description": "Object of class `NoneType` has no attribute `is_superuser`", + "severity": "error" + }, + { + "line": 20, + "column": 16, + "stop_line": 20, + "stop_column": 23, + "path": "src/paperless/consumers.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": 23, + "column": 17, + "stop_line": 23, + "stop_column": 28, + "path": "src/paperless/consumers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `groups`", + "concise_description": "Object of class `NoneType` has no attribute `groups`", + "severity": "error" + }, + { + "line": 37, + "column": 9, + "stop_line": 37, + "stop_column": 19, + "path": "src/paperless/consumers.py", + "code": -2, + "name": "bad-param-name-override", + "description": "Class member `StatusConsumer.disconnect` overrides parent class `WebsocketConsumer` in an inconsistent manner\n Got parameter name `close_code`, expected `code`", + "concise_description": "Class member `StatusConsumer.disconnect` overrides parent class `WebsocketConsumer` in an inconsistent manner", + "severity": "error" + }, + { + "line": 33, + "column": 16, + "stop_line": 33, + "stop_column": 29, + "path": "src/paperless/serialisers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `PasswordValidationMixin` has no attribute `instance`", + "concise_description": "Object of class `PasswordValidationMixin` has no attribute `instance`", + "severity": "error" + }, + { + "line": 86, + "column": 11, + "stop_line": 86, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 146, + "column": 11, + "stop_line": 146, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 158, + "column": 11, + "stop_line": 158, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 192, + "column": 11, + "stop_line": 192, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 214, + "column": 9, + "stop_line": 214, + "stop_column": 23, + "path": "src/paperless/serialisers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `ApplicationConfigurationSerializer.run_validation` overrides parent class `ModelSerializer` in an inconsistent manner\n `ApplicationConfigurationSerializer.run_validation` has type `BoundMethod[ApplicationConfigurationSerializer, (self: ApplicationConfigurationSerializer, data: Unknown) -> Any]`, which is not assignable to `BoundMethod[ApplicationConfigurationSerializer, (self: ApplicationConfigurationSerializer, data: Any = ...) -> Any]`, the type of `ModelSerializer.run_validation`", + "concise_description": "Class member `ApplicationConfigurationSerializer.run_validation` overrides parent class `ModelSerializer` in an inconsistent manner", + "severity": "error" + }, + { + "line": 239, + "column": 11, + "stop_line": 239, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 301, + "column": 39, + "stop_line": 301, + "stop_column": 77, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `default` with type `PathLike[Unknown] | str` in function `__get_path`", + "concise_description": "Argument `str | None` is not assignable to parameter `default` with type `PathLike[Unknown] | str` in function `__get_path`", + "severity": "error" + }, + { + "line": 434, + "column": 12, + "stop_line": 434, + "stop_column": 85, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `tuple[str | None, str, str, str, str]` is not assignable to declared return type `tuple[str, str, str, str, str]`", + "concise_description": "Returned type `tuple[str | None, str, str, str, str]` is not assignable to declared return type `tuple[str, str, str, str, str]`", + "severity": "error" + }, + { + "line": 665, + "column": 30, + "stop_line": 665, + "stop_column": 52, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.append`", + "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.append`", + "severity": "error" + }, + { + "line": 739, + "column": 21, + "stop_line": 739, + "stop_column": 50, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "`str | None` is not assignable to TypedDict key with type `Path | dict[Unknown, Unknown] | str`", + "concise_description": "`str | None` is not assignable to TypedDict key with type `Path | dict[Unknown, Unknown] | str`", + "severity": "error" + }, + { + "line": 740, + "column": 21, + "stop_line": 740, + "stop_column": 63, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "`str` is not assignable to TypedDict key `NAME` with type `Path`", + "concise_description": "`str` is not assignable to TypedDict key `NAME` with type `Path`", + "severity": "error" + }, + { + "line": 746, + "column": 44, + "stop_line": 746, + "stop_column": 73, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "`str | None` is not assignable to TypedDict key `PORT` with type `Path | dict[Unknown, Unknown] | str`", + "concise_description": "`str | None` is not assignable to TypedDict key `PORT` with type `Path | dict[Unknown, Unknown] | str`", + "severity": "error" + }, + { + "line": 774, + "column": 31, + "stop_line": 781, + "stop_column": 18, + "path": "src/paperless/settings.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `typing.MutableMapping.update` called with arguments: (dict[str, dict[str, int]])\n Possible overloads:\n (m: SupportsKeysAndGetItem[str, str | None], /) -> None [closest match]\n (m: SupportsKeysAndGetItem[str, str | None], /, **kwargs: str | None) -> None\n (m: Iterable[tuple[str, str | None]], /) -> None\n (m: Iterable[tuple[str, str | None]], /, **kwargs: str | None) -> None\n (**kwargs: str | None) -> None", + "concise_description": "No matching overload found for function `typing.MutableMapping.update` called with arguments: (dict[str, dict[str, int]])", + "severity": "error" + }, + { + "line": 778, + "column": 44, + "stop_line": 778, + "stop_column": 80, + "path": "src/paperless/settings.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)\n Possible overloads:\n (cls: type[int], x: ConvertibleToInt = 0, /) -> int [closest match]\n (cls: type[int], x: bytearray | bytes | str, /, base: SupportsIndex) -> int", + "concise_description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)", + "severity": "error" + }, + { + "line": 789, + "column": 32, + "stop_line": 789, + "stop_column": 67, + "path": "src/paperless/settings.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)\n Possible overloads:\n (cls: type[int], x: ConvertibleToInt = 0, /) -> int [closest match]\n (cls: type[int], x: bytearray | bytes | str, /, base: SupportsIndex) -> int", + "concise_description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)", + "severity": "error" + }, + { + "line": 793, + "column": 40, + "stop_line": 793, + "stop_column": 75, + "path": "src/paperless/settings.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)\n Possible overloads:\n (cls: type[int], x: ConvertibleToInt = 0, /) -> int [closest match]\n (cls: type[int], x: bytearray | bytes | str, /, base: SupportsIndex) -> int", + "concise_description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)", + "severity": "error" + }, + { + "line": 796, + "column": 32, + "stop_line": 796, + "stop_column": 67, + "path": "src/paperless/settings.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)\n Possible overloads:\n (cls: type[int], x: ConvertibleToInt = 0, /) -> int [closest match]\n (cls: type[int], x: bytearray | bytes | str, /, base: SupportsIndex) -> int", + "concise_description": "No matching overload found for function `int.__new__` called with arguments: (type[int], str | None)", + "severity": "error" + }, + { + "line": 1328, + "column": 12, + "stop_line": 1328, + "stop_column": 25, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `set[date]` is not assignable to declared return type `set[datetime]`", + "concise_description": "Returned type `set[date]` is not assignable to declared return type `set[datetime]`", + "severity": "error" + }, + { + "line": 1335, + "column": 20, + "stop_line": 1335, + "stop_column": 76, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-assignment", + "description": "`set[datetime]` is not assignable to variable `IGNORE_DATES` with type `set[date]`", + "concise_description": "`set[datetime]` is not assignable to variable `IGNORE_DATES` with type `set[date]`", + "severity": "error" + }, + { + "line": 1335, + "column": 40, + "stop_line": 1335, + "stop_column": 75, + "path": "src/paperless/settings.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `env_ignore` with type `str` in function `_parse_ignore_dates`", + "concise_description": "Argument `str | None` is not assignable to parameter `env_ignore` with type `str` in function `_parse_ignore_dates`", + "severity": "error" + }, + { + "line": 41, + "column": 14, + "stop_line": 41, + "stop_column": 32, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 42, + "column": 14, + "stop_line": 42, + "stop_column": 33, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 43, + "column": 14, + "stop_line": 43, + "stop_column": 39, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 45, + "column": 35, + "stop_line": 45, + "stop_column": 53, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `data_dir`", + "concise_description": "Class `dirs` has no class attribute `data_dir`", + "severity": "error" + }, + { + "line": 46, + "column": 35, + "stop_line": 46, + "stop_column": 54, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `media_dir`", + "concise_description": "Class `dirs` has no class attribute `media_dir`", + "severity": "error" + }, + { + "line": 47, + "column": 35, + "stop_line": 47, + "stop_column": 60, + "path": "src/paperless/tests/test_checks.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `dirs` has no class attribute `consumption_dir`", + "concise_description": "Class `dirs` has no class attribute `consumption_dir`", + "severity": "error" + }, + { + "line": 294, + "column": 23, + "stop_line": 294, + "stop_column": 47, + "path": "src/paperless/tests/test_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 301, + "column": 23, + "stop_line": 301, + "stop_column": 47, + "path": "src/paperless/tests/test_signals.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `get`", + "concise_description": "Object of class `NoneType` has no attribute `get`", + "severity": "error" + }, + { + "line": 42, + "column": 15, + "stop_line": 42, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 53, + "column": 15, + "stop_line": 53, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 82, + "column": 15, + "stop_line": 82, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 96, + "column": 28, + "stop_line": 96, + "stop_column": 34, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "concise_description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "severity": "error" + }, + { + "line": 97, + "column": 28, + "stop_line": 97, + "stop_column": 34, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "concise_description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "severity": "error" + }, + { + "line": 98, + "column": 28, + "stop_line": 98, + "stop_column": 34, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "concise_description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "severity": "error" + }, + { + "line": 99, + "column": 28, + "stop_line": 99, + "stop_column": 34, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "concise_description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "severity": "error" + }, + { + "line": 107, + "column": 15, + "stop_line": 107, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 115, + "column": 28, + "stop_line": 115, + "stop_column": 34, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "bad-typed-dict-key", + "description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "concise_description": "TypedDict `_WebsocketTestScope` does not have key `user`", + "severity": "error" + }, + { + "line": 121, + "column": 15, + "stop_line": 121, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 131, + "column": 15, + "stop_line": 131, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 150, + "column": 15, + "stop_line": 150, + "stop_column": 39, + "path": "src/paperless/tests/test_websockets.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `group_send`", + "concise_description": "Object of class `NoneType` has no attribute `group_send`", + "severity": "error" + }, + { + "line": 371, + "column": 9, + "stop_line": 371, + "stop_column": 49, + "path": "src/paperless/urls.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `django.urls.conf.path` called with arguments: (Literal['ws/status/'], _ASGIApplicationProtocol)\n Possible overloads:\n (route: _StrOrPromise, view: (...) -> HttpResponseBase, kwargs: dict[str, Any] = ..., name: str = ...) -> URLPattern [closest match]\n (route: _StrOrPromise, view: (...) -> Coroutine[Any, Any, HttpResponseBase], kwargs: dict[str, Any] = ..., name: str = ...) -> URLPattern\n (route: _StrOrPromise, view: tuple[Sequence[URLPattern | URLResolver], str | None, str | None], kwargs: dict[str, Any] = ..., name: str = ...) -> URLResolver\n (route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] = ..., name: str = ...) -> URLResolver", + "concise_description": "No matching overload found for function `django.urls.conf.path` called with arguments: (Literal['ws/status/'], _ASGIApplicationProtocol)", + "severity": "error" + }, + { + "line": 195, + "column": 20, + "stop_line": 195, + "stop_column": 60, + "path": "src/paperless/validators.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `EllipsisType` has no attribute `lower`", + "concise_description": "Object of class `EllipsisType` has no attribute `lower`", + "severity": "error" + }, + { + "line": 195, + "column": 32, + "stop_line": 195, + "stop_column": 43, + "path": "src/paperless/validators.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Ellipsis | Unknown` is not assignable to parameter `text_or_uri_element` with type `_Element | bytes | str | None` in function `lxml.etree.QName.__init__`", + "concise_description": "Argument `Ellipsis | Unknown` is not assignable to parameter `text_or_uri_element` with type `_Element | bytes | str | None` in function `lxml.etree.QName.__init__`", + "severity": "error" + }, + { + "line": 201, + "column": 38, + "stop_line": 201, + "stop_column": 58, + "path": "src/paperless/validators.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `str.join` called with arguments: (Iterator[_AnyStr] | Unknown)\n Possible overloads:\n (iterable: Iterable[LiteralString], /) -> LiteralString [closest match]\n (iterable: Iterable[str], /) -> str", + "concise_description": "No matching overload found for function `str.join` called with arguments: (Iterator[_AnyStr] | Unknown)", + "severity": "error" + }, + { + "line": 210, + "column": 38, + "stop_line": 210, + "stop_column": 58, + "path": "src/paperless/validators.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `EllipsisType` has no attribute `items`", + "concise_description": "Object of class `EllipsisType` has no attribute `items`", + "severity": "error" + }, + { + "line": 63, + "column": 31, + "stop_line": 63, + "stop_column": 50, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `paginator`", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "line": 73, + "column": 17, + "stop_line": 73, + "stop_column": 36, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `paginator`", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "line": 80, + "column": 36, + "stop_line": 80, + "stop_column": 70, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `results`", + "concise_description": "Object of class `NoneType` has no attribute `results`", + "severity": "error" + }, + { + "line": 85, + "column": 19, + "stop_line": 85, + "stop_column": 38, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `paginator`", + "concise_description": "Object of class `NoneType` has no attribute `paginator`", + "severity": "error" + }, + { + "line": 86, + "column": 16, + "stop_line": 86, + "stop_column": 19, + "path": "src/paperless/views.py", + "code": -2, + "name": "unbound-name", + "description": "`ids` may be uninitialized", + "concise_description": "`ids` may be uninitialized", + "severity": "error" + }, + { + "line": 121, + "column": 9, + "stop_line": 121, + "stop_column": 15, + "path": "src/paperless/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `UserViewSet.create` overrides parent class `ModelViewSet` in an inconsistent manner\n `UserViewSet.create` has type `BoundMethod[UserViewSet, (self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response]`, which is not assignable to `BoundMethod[UserViewSet, (self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `ModelViewSet.create`", + "concise_description": "Class member `UserViewSet.create` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 128, + "column": 9, + "stop_line": 128, + "stop_column": 15, + "path": "src/paperless/views.py", + "code": -2, + "name": "bad-override", + "description": "Class member `UserViewSet.update` overrides parent class `ModelViewSet` in an inconsistent manner\n `UserViewSet.update` has type `BoundMethod[UserViewSet, (self: UserViewSet, request: Unknown, *args: Unknown, **kwargs: Unknown) -> HttpResponseForbidden | Response]`, which is not assignable to `BoundMethod[UserViewSet, (self: UserViewSet, request: Request, *args: Any, **kwargs: Any) -> Response]`, the type of `ModelViewSet.update`", + "concise_description": "Class member `UserViewSet.update` overrides parent class `ModelViewSet` in an inconsistent manner", + "severity": "error" + }, + { + "line": 204, + "column": 13, + "stop_line": 204, + "stop_column": 30, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `set_password`", + "concise_description": "Object of class `NoneType` has no attribute `set_password`", + "severity": "error" + }, + { + "line": 205, + "column": 13, + "stop_line": 205, + "stop_column": 22, + "path": "src/paperless/views.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": 209, + "column": 9, + "stop_line": 209, + "stop_column": 18, + "path": "src/paperless/views.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": 286, + "column": 38, + "stop_line": 286, + "stop_column": 75, + "path": "src/paperless/views.py", + "code": -2, + "name": "bad-assignment", + "description": "`Authenticator | None` is not assignable to `Authenticator`", + "concise_description": "`Authenticator | None` is not assignable to `Authenticator`", + "severity": "error" + }, + { + "line": 288, + "column": 34, + "stop_line": 288, + "stop_column": 65, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `TOTP` has no attribute `get_unused_codes`\nObject of class `WebAuthn` has no attribute `get_unused_codes`", + "concise_description": "Object of class `TOTP` has no attribute `get_unused_codes`\nObject of class `WebAuthn` has no attribute `get_unused_codes`", + "severity": "error" + }, + { + "line": 366, + "column": 13, + "stop_line": 366, + "stop_column": 36, + "path": "src/paperless/views.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": 366, + "column": 41, + "stop_line": 366, + "stop_column": 75, + "path": "src/paperless/views.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": 416, + "column": 23, + "stop_line": 416, + "stop_column": 45, + "path": "src/paperless/views.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `AbstractBaseUser` has no attribute `socialaccount_set`\nObject of class `AnonymousUser` has no attribute `socialaccount_set`", + "concise_description": "Object of class `AbstractBaseUser` has no attribute `socialaccount_set`\nObject of class `AnonymousUser` has no attribute `socialaccount_set`", + "severity": "error" + }, + { + "line": 102, + "column": 30, + "stop_line": 102, + "stop_column": 36, + "path": "src/paperless_ai/ai_classifier.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", + "concise_description": "Argument `str` is not assignable to parameter `raw` with type `dict[Unknown, Unknown]` in function `parse_ai_response`", + "severity": "error" + }, + { + "line": 103, + "column": 18, + "stop_line": 103, + "stop_column": 46, + "path": "src/paperless_ai/chat.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Response` has no attribute `response_gen`", + "concise_description": "Object of class `Response` has no attribute `response_gen`", + "severity": "error" + }, + { + "line": 59, + "column": 16, + "stop_line": 59, + "stop_column": 35, + "path": "src/paperless_ai/client.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `dict[str, Any]` is not assignable to declared return type `str`", + "concise_description": "Returned type `dict[str, Any]` is not assignable to declared return type `str`", + "severity": "error" + }, + { + "line": 86, + "column": 21, + "stop_line": 86, + "stop_column": 38, + "path": "src/paperless_ai/embedding.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": 241, + "column": 46, + "stop_line": 241, + "stop_column": 51, + "path": "src/paperless_ai/indexing.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", + "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", + "severity": "error" + }, + { + "line": 254, + "column": 46, + "stop_line": 254, + "stop_column": 51, + "path": "src/paperless_ai/indexing.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", + "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `remove_document_docstore_nodes`", + "severity": "error" + }, + { + "line": 305, + "column": 15, + "stop_line": 305, + "stop_column": 20, + "path": "src/paperless_ai/indexing.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `llama_index.core.indices.vector_store.retrievers.retriever.VectorIndexRetriever.__init__`", + "concise_description": "Argument `BaseIndex[Unknown] | VectorStoreIndex` is not assignable to parameter `index` with type `VectorStoreIndex` in function `llama_index.core.indices.vector_store.retrievers.retriever.VectorIndexRetriever.__init__`", + "severity": "error" + }, + { + "line": 49, + "column": 9, + "stop_line": 49, + "stop_column": 30, + "path": "src/paperless_ai/tests/test_ai_indexing.py", + "code": -2, + "name": "bad-override", + "description": "Class member `FakeEmbedding._aget_query_embedding` overrides parent class `BaseEmbedding` in an inconsistent manner\n `FakeEmbedding._aget_query_embedding` has type `BoundMethod[FakeEmbedding, (self: FakeEmbedding, query: str) -> list[float]]`, which is not assignable to `BoundMethod[FakeEmbedding, (self: FakeEmbedding, query: str) -> Coroutine[Unknown, Unknown, list[float]]]`, the type of `BaseEmbedding._aget_query_embedding`", + "concise_description": "Class member `FakeEmbedding._aget_query_embedding` overrides parent class `BaseEmbedding` in an inconsistent manner", + "severity": "error" + }, + { + "line": 95, + "column": 12, + "stop_line": 95, + "stop_column": 27, + "path": "src/paperless_ai/tests/test_client.py", + "code": -2, + "name": "bad-index", + "description": "Cannot index into `str`\n No matching overload found for function `str.__getitem__` called with arguments: (Literal['title'])\n Possible overloads:\n (key: SupportsIndex | slice[Any, Any, Any], /) -> LiteralString\n (key: SupportsIndex | slice[Any, Any, Any], /) -> str [closest match]", + "concise_description": "Cannot index into `str`", + "severity": "error" + }, + { + "line": 38, + "column": 49, + "stop_line": 38, + "stop_column": 53, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "severity": "error" + }, + { + "line": 46, + "column": 59, + "stop_line": 46, + "stop_column": 63, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_correspondents_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_correspondents_by_name`", + "severity": "error" + }, + { + "line": 54, + "column": 59, + "stop_line": 54, + "stop_column": 63, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_document_types_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_document_types_by_name`", + "severity": "error" + }, + { + "line": 62, + "column": 58, + "stop_line": 62, + "stop_column": 62, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_storage_paths_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_storage_paths_by_name`", + "severity": "error" + }, + { + "line": 76, + "column": 37, + "stop_line": 76, + "stop_column": 42, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[str | None]` is not assignable to parameter `names` with type `list[str]` in function `paperless_ai.matching.match_tags_by_name`", + "concise_description": "Argument `list[str | None]` is not assignable to parameter `names` with type `list[str]` in function `paperless_ai.matching.match_tags_by_name`", + "severity": "error" + }, + { + "line": 76, + "column": 49, + "stop_line": 76, + "stop_column": 53, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "severity": "error" + }, + { + "line": 83, + "column": 49, + "stop_line": 83, + "stop_column": 53, + "path": "src/paperless_ai/tests/test_matching.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "concise_description": "Argument `None` is not assignable to parameter `user` with type `User` in function `paperless_ai.matching.match_tags_by_name`", + "severity": "error" + }, + { + "line": 110, + "column": 9, + "stop_line": 110, + "stop_column": 21, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-override", + "description": "Class member `DeleteMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner\n `DeleteMailAction.post_consume` has type `BoundMethod[DeleteMailAction, (self: DeleteMailAction, M: MailBox, message_uid: str, parameter: str) -> None]`, which is not assignable to `BoundMethod[DeleteMailAction, (self: DeleteMailAction, M: MailBox, message_uid: str, parameter: str) -> Never]`, the type of `BaseMailAction.post_consume`", + "concise_description": "Class member `DeleteMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner", + "severity": "error" + }, + { + "line": 122, + "column": 9, + "stop_line": 122, + "stop_column": 21, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-override", + "description": "Class member `MarkReadMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner\n `MarkReadMailAction.post_consume` has type `BoundMethod[MarkReadMailAction, (self: MarkReadMailAction, M: MailBox, message_uid: str, parameter: str) -> None]`, which is not assignable to `BoundMethod[MarkReadMailAction, (self: MarkReadMailAction, M: MailBox, message_uid: str, parameter: str) -> Never]`, the type of `BaseMailAction.post_consume`", + "concise_description": "Class member `MarkReadMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner", + "severity": "error" + }, + { + "line": 131, + "column": 9, + "stop_line": 131, + "stop_column": 21, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-override", + "description": "Class member `MoveMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner\n `MoveMailAction.post_consume` has type `BoundMethod[MoveMailAction, (self: MoveMailAction, M: Unknown, message_uid: Unknown, parameter: Unknown) -> None]`, which is not assignable to `BoundMethod[MoveMailAction, (self: MoveMailAction, M: MailBox, message_uid: str, parameter: str) -> Never]`, the type of `BaseMailAction.post_consume`", + "concise_description": "Class member `MoveMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner", + "severity": "error" + }, + { + "line": 143, + "column": 9, + "stop_line": 143, + "stop_column": 21, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-override", + "description": "Class member `FlagMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner\n `FlagMailAction.post_consume` has type `BoundMethod[FlagMailAction, (self: FlagMailAction, M: MailBox, message_uid: str, parameter: str) -> None]`, which is not assignable to `BoundMethod[FlagMailAction, (self: FlagMailAction, M: MailBox, message_uid: str, parameter: str) -> Never]`, the type of `BaseMailAction.post_consume`", + "concise_description": "Class member `FlagMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner", + "severity": "error" + }, + { + "line": 165, + "column": 26, + "stop_line": 165, + "stop_column": 30, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-assignment", + "description": "`None` is not assignable to attribute `color` with type `str`", + "concise_description": "`None` is not assignable to attribute `color` with type `str`", + "severity": "error" + }, + { + "line": 180, + "column": 9, + "stop_line": 180, + "stop_column": 21, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TagMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner\n `TagMailAction.post_consume` has type `BoundMethod[TagMailAction, (self: TagMailAction, M: MailBox, message_uid: str, parameter: str) -> None]`, which is not assignable to `BoundMethod[TagMailAction, (self: TagMailAction, M: MailBox, message_uid: str, parameter: str) -> Never]`, the type of `BaseMailAction.post_consume`", + "concise_description": "Class member `TagMailAction.post_consume` overrides parent class `BaseMailAction` in an inconsistent manner", + "severity": "error" + }, + { + "line": 182, + "column": 64, + "stop_line": 182, + "stop_column": 76, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `str` in function `imaplib.IMAP4.uid`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `*args` with type `str` in function `imaplib.IMAP4.uid`", + "severity": "error" + }, + { + "line": 194, + "column": 33, + "stop_line": 194, + "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`", + "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": 272, + "column": 53, + "stop_line": 272, + "stop_column": 74, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `BaseMailAction.post_consume`", + "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `BaseMailAction.post_consume`", + "severity": "error" + }, + { + "line": 373, + "column": 13, + "stop_line": 373, + "stop_column": 34, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `TagMailAction.__init__`", + "concise_description": "Argument `str | None` is not assignable to parameter `parameter` with type `str` in function `TagMailAction.__init__`", + "severity": "error" + }, + { + "line": 390, + "column": 30, + "stop_line": 390, + "stop_column": 46, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "line": 392, + "column": 27, + "stop_line": 392, + "stop_column": 41, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "line": 394, + "column": 32, + "stop_line": 394, + "stop_column": 51, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "line": 396, + "column": 29, + "stop_line": 396, + "stop_column": 45, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unsupported-operation", + "description": "Cannot set item in `dict[str, date]`\n Argument `str` is not assignable to parameter `value` with type `date` in function `dict.__setitem__`", + "concise_description": "Cannot set item in `dict[str, date]`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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__`", + "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": 404, + "column": 38, + "stop_line": 404, + "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 `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 404, + "column": 38, + "stop_line": 404, + "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 `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `answered` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `seen` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `flagged` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `draft` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `deleted` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `no_keyword` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `from_` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `to` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `subject` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `body` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `text` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `bcc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `cc` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_gt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `size_lt` with type `int | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `new` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `old` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `recent` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `all` with type `bool | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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__`", + "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": 408, + "column": 32, + "stop_line": 408, + "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 `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `header` with type `Header | list[Header] | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 408, + "column": 32, + "stop_line": 408, + "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 `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "concise_description": "Unpacked keyword argument `date` is not assignable to parameter `gmail_label` with type `list[str] | str | None` in function `imap_tools.query.LogicOperator.__init__`", + "severity": "error" + }, + { + "line": 427, + "column": 12, + "stop_line": 427, + "stop_column": 19, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-return", + "description": "Returned type `MailBox | MailBoxStartTls | MailBoxUnencrypted` is not assignable to declared return type `MailBox`", + "concise_description": "Returned type `MailBox | MailBoxStartTls | MailBoxUnencrypted` is not assignable to declared return type `MailBox`", + "severity": "error" + }, + { + "line": 565, + "column": 54, + "stop_line": 565, + "stop_column": 67, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccount` has no attribute `rules`", + "concise_description": "Object of class `MailAccount` has no attribute `rules`", + "severity": "error" + }, + { + "line": 568, + "column": 29, + "stop_line": 568, + "stop_column": 42, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailAccount` has no attribute `rules`", + "concise_description": "Object of class `MailAccount` has no attribute `rules`", + "severity": "error" + }, + { + "line": 607, + "column": 31, + "stop_line": 607, + "stop_column": 52, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.insert`", + "concise_description": "Argument `str | None` is not assignable to parameter `object` with type `str` in function `list.insert`", + "severity": "error" + }, + { + "line": 614, + "column": 44, + "stop_line": 614, + "stop_column": 50, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unbound-name", + "description": "`folder` is uninitialized", + "concise_description": "`folder` is uninitialized", + "severity": "error" + }, + { + "line": 626, + "column": 40, + "stop_line": 626, + "stop_column": 46, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "unbound-name", + "description": "`folder` is uninitialized", + "concise_description": "`folder` is uninitialized", + "severity": "error" + }, + { + "line": 926, + "column": 40, + "stop_line": 926, + "stop_column": 60, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 930, + "column": 32, + "stop_line": 930, + "stop_column": 52, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 931, + "column": 32, + "stop_line": 931, + "stop_column": 52, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 932, + "column": 17, + "stop_line": 932, + "stop_column": 37, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 946, + "column": 27, + "stop_line": 946, + "stop_column": 40, + "path": "src/paperless_mail/mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "concise_description": "Argument `str` is not assignable to parameter `original_file` with type `Path` in function `documents.data_models.ConsumableDocument.__init__`", + "severity": "error" + }, + { + "line": 97, + "column": 39, + "stop_line": 97, + "stop_column": 60, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "severity": "error" + }, + { + "line": 103, + "column": 39, + "stop_line": 103, + "stop_column": 60, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "concise_description": "Argument `str | None` is not assignable to parameter `refresh_token` with type `str` in function `httpx_oauth.oauth2.BaseOAuth2.refresh_token`", + "severity": "error" + }, + { + "line": 106, + "column": 35, + "stop_line": 106, + "stop_column": 41, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 108, + "column": 41, + "stop_line": 108, + "stop_column": 47, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 109, + "column": 32, + "stop_line": 109, + "stop_column": 38, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 111, + "column": 25, + "stop_line": 111, + "stop_column": 31, + "path": "src/paperless_mail/oauth.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 55, + "column": 9, + "stop_line": 55, + "stop_column": 22, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `MailDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner\n `MailDocumentParser.get_thumbnail` has type `BoundMethod[MailDocumentParser, (self: MailDocumentParser, document_path: Path, mime_type: str, file_name: Unknown | None = None) -> Path]`, which is not assignable to `BoundMethod[MailDocumentParser, (self: MailDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.get_thumbnail`", + "concise_description": "Class member `MailDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 125, + "column": 9, + "stop_line": 125, + "stop_column": 14, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `MailDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner\n `MailDocumentParser.parse` has type `BoundMethod[MailDocumentParser, (self: MailDocumentParser, document_path: Path, mime_type: str, file_name: Unknown | None = None, mailrule_id: int | None = None) -> None]`, which is not assignable to `BoundMethod[MailDocumentParser, (self: MailDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.parse`", + "concise_description": "Class member `MailDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 151, + "column": 34, + "stop_line": 151, + "stop_column": 63, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `full`", + "concise_description": "Object of class `NoneType` has no attribute `full`", + "severity": "error" + }, + { + "line": 192, + "column": 57, + "stop_line": 192, + "stop_column": 72, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `int` is not assignable to parameter `pdf_layout` with type `MailRule.PdfLayout | None` in function `MailDocumentParser.generate_pdf`", + "concise_description": "Argument `int` is not assignable to parameter `pdf_layout` with type `MailRule.PdfLayout | None` in function `MailDocumentParser.generate_pdf`", + "severity": "error" + }, + { + "line": 313, + "column": 35, + "stop_line": 313, + "stop_column": 56, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `full`", + "concise_description": "Object of class `NoneType` has no attribute `full`", + "severity": "error" + }, + { + "line": 474, + "column": 9, + "stop_line": 474, + "stop_column": 21, + "path": "src/paperless_mail/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `MailDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner\n `MailDocumentParser.get_settings` has type `BoundMethod[MailDocumentParser, (self: MailDocumentParser) -> None]`, which is not assignable to `BoundMethod[MailDocumentParser, (self: MailDocumentParser) -> Never]`, the type of `DocumentParser.get_settings`", + "concise_description": "Class member `MailDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 73, + "column": 71, + "stop_line": 73, + "stop_column": 99, + "path": "src/paperless_mail/preprocessor.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Crypt` has no attribute `stderr`", + "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "severity": "error" + }, + { + "line": 27, + "column": 11, + "stop_line": 27, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 74, + "column": 11, + "stop_line": 74, + "stop_column": 15, + "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", + "severity": "error" + }, + { + "line": 137, + "column": 11, + "stop_line": 137, + "stop_column": 15, + "path": "src/paperless_mail/serialisers.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", + "severity": "error" + }, + { + "line": 55, + "column": 44, + "stop_line": 55, + "stop_column": 48, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `None` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "concise_description": "Argument `None` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "line": 74, + "column": 37, + "stop_line": 74, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "line": 117, + "column": 37, + "stop_line": 117, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "line": 122, + "column": 37, + "stop_line": 122, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "line": 126, + "column": 37, + "stop_line": 126, + "stop_column": 42, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "concise_description": "Argument `Literal['BAD']` is not assignable to parameter `command_result` with type `tuple[Unknown, ...]` in function `imap_tools.errors.UnexpectedCommandStatusError.__init__`", + "severity": "error" + }, + { + "line": 172, + "column": 25, + "stop_line": 172, + "stop_column": 40, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailMessage` has no attribute `flagged`", + "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "severity": "error" + }, + { + "line": 174, + "column": 25, + "stop_line": 174, + "stop_column": 37, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailMessage` has no attribute `seen`", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "line": 260, + "column": 9, + "stop_line": 260, + "stop_column": 22, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailMessage` has no attribute `seen`", + "concise_description": "Object of class `MailMessage` has no attribute `seen`", + "severity": "error" + }, + { + "line": 261, + "column": 9, + "stop_line": 261, + "stop_column": 25, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `MailMessage` has no attribute `flagged`", + "concise_description": "Object of class `MailMessage` has no attribute `flagged`", + "severity": "error" + }, + { + "line": 419, + "column": 30, + "stop_line": 419, + "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": 426, + "column": 31, + "stop_line": 426, + "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": 433, + "column": 58, + "stop_line": 433, + "stop_column": 72, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Class `message2` has no class attribute `from_`", + "concise_description": "Class `message2` has no class attribute `from_`", + "severity": "error" + }, + { + "line": 442, + "column": 54, + "stop_line": 442, + "stop_column": 61, + "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`", + "severity": "error" + }, + { + "line": 448, + "column": 40, + "stop_line": 448, + "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`", + "severity": "error" + }, + { + "line": 453, + "column": 40, + "stop_line": 453, + "stop_column": 48, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_correspondent.message2]` 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.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "line": 462, + "column": 40, + "stop_line": 462, + "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`", + "severity": "error" + }, + { + "line": 465, + "column": 40, + "stop_line": 465, + "stop_column": 48, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_correspondent.message2]` 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.message2]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_correspondent`", + "severity": "error" + }, + { + "line": 474, + "column": 40, + "stop_line": 474, + "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`", + "severity": "error" + }, + { + "line": 478, + "column": 30, + "stop_line": 478, + "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": 480, + "column": 26, + "stop_line": 480, + "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": 489, + "column": 45, + "stop_line": 489, + "stop_column": 52, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 489, + "column": 54, + "stop_line": 489, + "stop_column": 57, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 494, + "column": 45, + "stop_line": 494, + "stop_column": 52, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 494, + "column": 54, + "stop_line": 494, + "stop_column": 57, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 499, + "column": 45, + "stop_line": 499, + "stop_column": 52, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.message]` is not assignable to parameter `message` with type `MailMessage` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 499, + "column": 54, + "stop_line": 499, + "stop_column": 57, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "concise_description": "Argument `type[TestMail.test_get_title.att]` is not assignable to parameter `att` with type `MailAttachment` in function `paperless_mail.mail.MailAccountHandler._get_title`", + "severity": "error" + }, + { + "line": 531, + "column": 30, + "stop_line": 531, + "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": 1168, + "column": 9, + "stop_line": 1168, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BogusFolderManager` has no attribute `list`", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "line": 1174, + "column": 9, + "stop_line": 1174, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BogusFolderManager` has no attribute `list`", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "line": 1201, + "column": 9, + "stop_line": 1201, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BogusFolderManager` has no attribute `list`", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "line": 1207, + "column": 9, + "stop_line": 1207, + "stop_column": 50, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `BogusFolderManager` has no attribute `list`", + "concise_description": "Object of class `BogusFolderManager` has no attribute `list`", + "severity": "error" + }, + { + "line": 1269, + "column": 13, + "stop_line": 1273, + "stop_column": 14, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[list[dict[str, int]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", + "concise_description": "Argument `list[list[dict[str, int]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", + "severity": "error" + }, + { + "line": 1288, + "column": 13, + "stop_line": 1292, + "stop_column": 14, + "path": "src/paperless_mail/tests/test_mail.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[list[dict[str, None]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", + "concise_description": "Argument `list[list[dict[str, None]]]` is not assignable to parameter `expected_call_args` with type `list[list[dict[str, str]]]` in function `MailMocker.assert_queue_consumption_tasks_call_args`", + "severity": "error" + }, + { + "line": 1583, + "column": 41, + "stop_line": 1583, + "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[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `str | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 1886, + "column": 26, + "stop_line": 1886, + "stop_column": 35, + "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`", + "severity": "error" + }, + { + "line": 134, + "column": 42, + "stop_line": 134, + "stop_column": 54, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "line": 145, + "column": 42, + "stop_line": 145, + "stop_column": 54, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "line": 177, + "column": 46, + "stop_line": 177, + "stop_column": 58, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "line": 187, + "column": 46, + "stop_line": 187, + "stop_column": 58, + "path": "src/paperless_mail/tests/test_mail_oauth.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "concise_description": "Object of class `_MonkeyPatchedWSGIResponse` has no attribute `url`", + "severity": "error" + }, + { + "line": 110, + "column": 45, + "stop_line": 110, + "stop_column": 49, + "path": "src/paperless_mail/tests/test_parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Literal['na']` is not assignable to parameter `document_path` with type `Path` in function `paperless_mail.parsers.MailDocumentParser.extract_metadata`", + "concise_description": "Argument `Literal['na']` is not assignable to parameter `document_path` with type `Path` in function `paperless_mail.parsers.MailDocumentParser.extract_metadata`", + "severity": "error" + }, + { + "line": 315, + "column": 47, + "stop_line": 315, + "stop_column": 75, + "path": "src/paperless_mail/tests/test_parsers.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": 669, + "column": 20, + "stop_line": 669, + "stop_column": 31, + "path": "src/paperless_mail/tests/test_parsers.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": 25, + "column": 23, + "stop_line": 36, + "stop_column": 10, + "path": "src/paperless_mail/tests/test_parsers_live.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], check=Literal[True])\n Possible overloads:\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: Literal[True], timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, *, universal_newlines: Literal[True], startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: Literal[False] | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: None = None, errors: None = None, input: Buffer | None = None, text: Literal[False] | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[bytes] [closest match]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: Buffer | str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[Any]", + "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], check=Literal[True])", + "severity": "error" + }, + { + "line": 264, + "column": 37, + "stop_line": 264, + "stop_column": 49, + "path": "src/paperless_mail/tests/test_parsers_live.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `pdf_path` with type `Path` in function `extract_text`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `pdf_path` with type `Path` in function `extract_text`", + "severity": "error" + }, + { + "line": 70, + "column": 9, + "stop_line": 70, + "stop_column": 30, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 72, + "column": 27, + "stop_line": 72, + "stop_column": 48, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Message` has no attribute `_headers`", + "concise_description": "Object of class `Message` has no attribute `_headers`", + "severity": "error" + }, + { + "line": 85, + "column": 51, + "stop_line": 85, + "stop_column": 72, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `Crypt` has no attribute `stderr`", + "concise_description": "Object of class `Crypt` has no attribute `stderr`", + "severity": "error" + }, + { + "line": 100, + "column": 36, + "stop_line": 100, + "stop_column": 66, + "path": "src/paperless_mail/tests/test_preprocessor.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `str` has no attribute `decode`\n Did you mean `encode`?", + "concise_description": "Object of class `str` has no attribute `decode`", + "severity": "error" + }, + { + "line": 114, + "column": 66, + "stop_line": 114, + "stop_column": 82, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`existing_account` may be uninitialized", + "concise_description": "`existing_account` may be uninitialized", + "severity": "error" + }, + { + "line": 116, + "column": 25, + "stop_line": 116, + "stop_column": 41, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`existing_account` may be uninitialized", + "concise_description": "`existing_account` may be uninitialized", + "severity": "error" + }, + { + "line": 117, + "column": 44, + "stop_line": 117, + "stop_column": 60, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`existing_account` may be uninitialized", + "concise_description": "`existing_account` may be uninitialized", + "severity": "error" + }, + { + "line": 242, + "column": 28, + "stop_line": 242, + "stop_column": 34, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 243, + "column": 29, + "stop_line": 243, + "stop_column": 35, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 244, + "column": 26, + "stop_line": 244, + "stop_column": 32, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`result` may be uninitialized", + "concise_description": "`result` may be uninitialized", + "severity": "error" + }, + { + "line": 248, + "column": 29, + "stop_line": 248, + "stop_column": 40, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`imap_server` may be uninitialized", + "concise_description": "`imap_server` may be uninitialized", + "severity": "error" + }, + { + "line": 251, + "column": 26, + "stop_line": 251, + "stop_column": 34, + "path": "src/paperless_mail/views.py", + "code": -2, + "name": "unbound-name", + "description": "`defaults` may be uninitialized", + "concise_description": "`defaults` may be uninitialized", + "severity": "error" + }, + { + "line": 34, + "column": 9, + "stop_line": 34, + "stop_column": 21, + "path": "src/paperless_remote/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `RemoteDocumentParser.get_settings` overrides parent class `RasterisedDocumentParser` in an inconsistent manner\n `RemoteDocumentParser.get_settings` has type `BoundMethod[RemoteDocumentParser, (self: RemoteDocumentParser) -> RemoteEngineConfig]`, which is not assignable to `BoundMethod[RemoteDocumentParser, (self: RemoteDocumentParser) -> OcrConfig]`, the type of `RasterisedDocumentParser.get_settings`", + "concise_description": "Class member `RemoteDocumentParser.get_settings` overrides parent class `RasterisedDocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 67, + "column": 17, + "stop_line": 67, + "stop_column": 34, + "path": "src/paperless_remote/tests/test_parser.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `strip`", + "concise_description": "Object of class `NoneType` has no attribute `strip`", + "severity": "error" + }, + { + "line": 11, + "column": 26, + "stop_line": 14, + "stop_column": 6, + "path": "src/paperless_tesseract/checks.py", + "code": -2, + "name": "no-matching-overload", + "description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], capture_output=Literal[True])\n Possible overloads:\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: Literal[True], timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, *, universal_newlines: Literal[True], startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[str]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: Literal[False] | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: None = None, errors: None = None, input: Buffer | None = None, text: Literal[False] | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[bytes] [closest match]\n (args: _CMD, bufsize: int = -1, executable: PathLike[bytes] | PathLike[str] | bytes | str | None = None, stdin: _FILE = None, stdout: _FILE = None, stderr: _FILE = None, preexec_fn: (() -> Any) | None = None, close_fds: bool = True, shell: bool = False, cwd: PathLike[bytes] | PathLike[str] | bytes | str | None = None, env: Mapping[bytes, StrOrBytesPath] | Mapping[str, StrOrBytesPath] | None = None, universal_newlines: bool | None = None, startupinfo: Any = None, creationflags: int = 0, restore_signals: bool = True, start_new_session: bool = False, pass_fds: Collection[int] = ..., *, capture_output: bool = False, check: bool = False, encoding: str | None = None, errors: str | None = None, input: Buffer | str | None = None, text: bool | None = None, timeout: float | None = None, user: int | str | None = None, group: int | str | None = None, extra_groups: Iterable[int | str] | None = None, umask: int = -1, pipesize: int = -1, process_group: int | None = None) -> CompletedProcess[Any]", + "concise_description": "No matching overload found for function `subprocess.run` called with arguments: (list[str | None], capture_output=Literal[True])", + "severity": "error" + }, + { + "line": 28, + "column": 13, + "stop_line": 31, + "stop_column": 14, + "path": "src/paperless_tesseract/checks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "concise_description": "Argument `django.core.checks.messages.Warning | builtins.Warning` is not assignable to parameter `object` with type `django.core.checks.messages.Warning` in function `list.append`", + "severity": "error" + }, + { + "line": 45, + "column": 21, + "stop_line": 49, + "stop_column": 22, + "path": "src/paperless_tesseract/checks.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Error` is not assignable to parameter `object` with type `Warning` in function `list.append`", + "concise_description": "Argument `Error` is not assignable to parameter `object` with type `Warning` in function `list.append`", + "severity": "error" + }, + { + "line": 37, + "column": 9, + "stop_line": 37, + "stop_column": 21, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `RasterisedDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner\n `RasterisedDocumentParser.get_settings` has type `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser) -> OcrConfig]`, which is not assignable to `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser) -> Never]`, the type of `DocumentParser.get_settings`", + "concise_description": "Class member `RasterisedDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 43, + "column": 9, + "stop_line": 43, + "stop_column": 23, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `RasterisedDocumentParser.get_page_count` overrides parent class `DocumentParser` in an inconsistent manner\n `RasterisedDocumentParser.get_page_count` has type `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Unknown, mime_type: Unknown) -> int | None]`, which is not assignable to `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Unknown, mime_type: Unknown) -> None]`, the type of `DocumentParser.get_page_count`", + "concise_description": "Class member `RasterisedDocumentParser.get_page_count` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 96, + "column": 9, + "stop_line": 96, + "stop_column": 22, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `RasterisedDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner\n `RasterisedDocumentParser.get_thumbnail` has type `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Path]`, which is not assignable to `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.get_thumbnail`", + "concise_description": "Class member `RasterisedDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 121, + "column": 13, + "stop_line": 127, + "stop_column": 14, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 128, + "column": 20, + "stop_line": 128, + "stop_column": 28, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 188, + "column": 21, + "stop_line": 196, + "stop_column": 22, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `list[Path | str]` is not assignable to parameter `arguments` with type `list[str]` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 197, + "column": 28, + "stop_line": 197, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "concise_description": "Argument `LoggerAdapter` is not assignable to parameter `logger` with type `Logger | None` in function `documents.utils.run_subprocess`", + "severity": "error" + }, + { + "line": 333, + "column": 9, + "stop_line": 333, + "stop_column": 14, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `RasterisedDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner\n `RasterisedDocumentParser.parse` has type `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Path, mime_type: Unknown, file_name: Unknown | None = None) -> None]`, which is not assignable to `BoundMethod[RasterisedDocumentParser, (self: RasterisedDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.parse`", + "concise_description": "Class member `RasterisedDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `input_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `input_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `language` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `language` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_type` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_type` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `sidecar` with type `BinaryIO | Path | bytes | str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `sidecar` with type `BinaryIO | Path | bytes | str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `title` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `title` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `author` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `author` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `subject` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `subject` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `keywords` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `keywords` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `unpaper_args` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `unpaper_args` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pages` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pages` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `tesseract_config` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `tesseract_config` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdf_renderer` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdf_renderer` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdfa_image_compression` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdfa_image_compression` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `color_conversion_strategy` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `color_conversion_strategy` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_words` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_words` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_patterns` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_patterns` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 384, + "column": 26, + "stop_line": 384, + "stop_column": 32, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `plugins` with type `Iterable[Path | str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `plugins` with type `Iterable[Path | str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `input_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `input_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_file` with type `BinaryIO | Path | bytes | str` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `language` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `language` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_type` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `output_type` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `sidecar` with type `BinaryIO | Path | bytes | str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `sidecar` with type `BinaryIO | Path | bytes | str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `title` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `title` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `author` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `author` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `subject` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `subject` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `keywords` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `keywords` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `unpaper_args` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `unpaper_args` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pages` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pages` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `tesseract_config` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `tesseract_config` with type `Iterable[str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdf_renderer` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdf_renderer` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdfa_image_compression` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `pdfa_image_compression` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `color_conversion_strategy` with type `str | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `color_conversion_strategy` with type `str | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_words` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_words` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_patterns` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `user_patterns` with type `PathLike[Unknown] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 431, + "column": 30, + "stop_line": 431, + "stop_column": 36, + "path": "src/paperless_tesseract/parsers.py", + "code": -2, + "name": "bad-argument-type", + "description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `plugins` with type `Iterable[Path | str] | None` in function `ocrmypdf.api.ocr`", + "concise_description": "Unpacked keyword argument `bool | Unknown` is not assignable to parameter `plugins` with type `Iterable[Path | str] | None` in function `ocrmypdf.api.ocr`", + "severity": "error" + }, + { + "line": 57, + "column": 36, + "stop_line": 57, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `strip`", + "concise_description": "Object of class `NoneType` has no attribute `strip`", + "severity": "error" + }, + { + "line": 147, + "column": 13, + "stop_line": 147, + "stop_column": 58, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 151, + "column": 27, + "stop_line": 151, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 159, + "column": 13, + "stop_line": 159, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 163, + "column": 27, + "stop_line": 163, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 175, + "column": 13, + "stop_line": 175, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 189, + "column": 22, + "stop_line": 189, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 205, + "column": 13, + "stop_line": 205, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 216, + "column": 13, + "stop_line": 216, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 230, + "column": 13, + "stop_line": 230, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 242, + "column": 22, + "stop_line": 242, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 244, + "column": 27, + "stop_line": 244, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 258, + "column": 26, + "stop_line": 258, + "stop_column": 40, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 260, + "column": 31, + "stop_line": 260, + "stop_column": 50, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 280, + "column": 17, + "stop_line": 280, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 290, + "column": 22, + "stop_line": 290, + "stop_column": 66, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 292, + "column": 27, + "stop_line": 292, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 295, + "column": 13, + "stop_line": 295, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 302, + "column": 13, + "stop_line": 302, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 305, + "column": 27, + "stop_line": 305, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 307, + "column": 13, + "stop_line": 307, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 315, + "column": 13, + "stop_line": 315, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 318, + "column": 27, + "stop_line": 318, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 320, + "column": 13, + "stop_line": 320, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 328, + "column": 13, + "stop_line": 328, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 331, + "column": 27, + "stop_line": 331, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 333, + "column": 13, + "stop_line": 333, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 341, + "column": 13, + "stop_line": 341, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 344, + "column": 27, + "stop_line": 344, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 346, + "column": 13, + "stop_line": 346, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 354, + "column": 13, + "stop_line": 354, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 357, + "column": 27, + "stop_line": 357, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 359, + "column": 13, + "stop_line": 359, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 378, + "column": 13, + "stop_line": 378, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 381, + "column": 27, + "stop_line": 381, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 382, + "column": 36, + "stop_line": 382, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_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": 383, + "column": 36, + "stop_line": 383, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_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": 400, + "column": 13, + "stop_line": 400, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 403, + "column": 27, + "stop_line": 403, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 404, + "column": 36, + "stop_line": 404, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_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": 405, + "column": 36, + "stop_line": 405, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_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": 406, + "column": 36, + "stop_line": 406, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_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": 422, + "column": 13, + "stop_line": 422, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 427, + "column": 13, + "stop_line": 427, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 445, + "column": 13, + "stop_line": 445, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 450, + "column": 13, + "stop_line": 450, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 470, + "column": 13, + "stop_line": 470, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 475, + "column": 13, + "stop_line": 475, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 493, + "column": 13, + "stop_line": 493, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 498, + "column": 13, + "stop_line": 498, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 516, + "column": 13, + "stop_line": 516, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 521, + "column": 13, + "stop_line": 521, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 539, + "column": 13, + "stop_line": 539, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 544, + "column": 13, + "stop_line": 544, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 562, + "column": 13, + "stop_line": 562, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 567, + "column": 13, + "stop_line": 567, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 585, + "column": 13, + "stop_line": 585, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 590, + "column": 13, + "stop_line": 590, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 608, + "column": 13, + "stop_line": 608, + "stop_column": 60, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 614, + "column": 13, + "stop_line": 614, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 639, + "column": 13, + "stop_line": 639, + "stop_column": 61, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 645, + "column": 13, + "stop_line": 645, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 676, + "column": 13, + "stop_line": 676, + "stop_column": 60, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 681, + "column": 13, + "stop_line": 681, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 688, + "column": 22, + "stop_line": 688, + "stop_column": 60, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 710, + "column": 13, + "stop_line": 710, + "stop_column": 62, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 713, + "column": 27, + "stop_line": 713, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 715, + "column": 13, + "stop_line": 715, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 734, + "column": 17, + "stop_line": 734, + "stop_column": 30, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 737, + "column": 31, + "stop_line": 737, + "stop_column": 50, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 739, + "column": 17, + "stop_line": 739, + "stop_column": 40, + "path": "src/paperless_tesseract/tests/test_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": 761, + "column": 17, + "stop_line": 761, + "stop_column": 30, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 764, + "column": 31, + "stop_line": 764, + "stop_column": 50, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 766, + "column": 17, + "stop_line": 766, + "stop_column": 40, + "path": "src/paperless_tesseract/tests/test_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": 846, + "column": 13, + "stop_line": 846, + "stop_column": 52, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 851, + "column": 40, + "stop_line": 851, + "stop_column": 57, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `container` with type `Container[Any] | Iterable[Any]` in function `unittest.case.TestCase.assertIn`", + "severity": "error" + }, + { + "line": 871, + "column": 22, + "stop_line": 871, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 872, + "column": 27, + "stop_line": 872, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 873, + "column": 50, + "stop_line": 873, + "stop_column": 73, + "path": "src/paperless_tesseract/tests/test_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": 877, + "column": 22, + "stop_line": 877, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 878, + "column": 27, + "stop_line": 878, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 879, + "column": 50, + "stop_line": 879, + "stop_column": 73, + "path": "src/paperless_tesseract/tests/test_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": 883, + "column": 22, + "stop_line": 883, + "stop_column": 60, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 884, + "column": 27, + "stop_line": 884, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 885, + "column": 32, + "stop_line": 885, + "stop_column": 55, + "path": "src/paperless_tesseract/tests/test_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": 890, + "column": 22, + "stop_line": 890, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 891, + "column": 27, + "stop_line": 891, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 892, + "column": 50, + "stop_line": 892, + "stop_column": 73, + "path": "src/paperless_tesseract/tests/test_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": 896, + "column": 22, + "stop_line": 896, + "stop_column": 59, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 897, + "column": 27, + "stop_line": 897, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 898, + "column": 50, + "stop_line": 898, + "stop_column": 73, + "path": "src/paperless_tesseract/tests/test_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": 904, + "column": 13, + "stop_line": 904, + "stop_column": 53, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "concise_description": "Argument `str` is not assignable to parameter `document_path` with type `Path` in function `paperless_tesseract.parsers.RasterisedDocumentParser.parse`", + "severity": "error" + }, + { + "line": 907, + "column": 27, + "stop_line": 907, + "stop_column": 46, + "path": "src/paperless_tesseract/tests/test_parser.py", + "code": -2, + "name": "bad-argument-type", + "description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "concise_description": "Argument `Unknown | None` is not assignable to parameter `path` with type `PathLike[Unknown] | str` in function `documents.tests.utils.FileSystemAssertsMixin.assertIsFile`", + "severity": "error" + }, + { + "line": 911, + "column": 13, + "stop_line": 911, + "stop_column": 36, + "path": "src/paperless_tesseract/tests/test_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": 42, + "column": 13, + "stop_line": 42, + "stop_column": 27, + "path": "src/paperless_tesseract/tests/test_parser_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": 43, + "column": 13, + "stop_line": 43, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 60, + "column": 13, + "stop_line": 60, + "stop_column": 30, + "path": "src/paperless_tesseract/tests/test_parser_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": 61, + "column": 13, + "stop_line": 61, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 78, + "column": 13, + "stop_line": 78, + "stop_column": 33, + "path": "src/paperless_tesseract/tests/test_parser_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": 79, + "column": 13, + "stop_line": 79, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 96, + "column": 13, + "stop_line": 96, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 97, + "column": 13, + "stop_line": 97, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 116, + "column": 13, + "stop_line": 116, + "stop_column": 35, + "path": "src/paperless_tesseract/tests/test_parser_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": 117, + "column": 13, + "stop_line": 117, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 125, + "column": 13, + "stop_line": 125, + "stop_column": 35, + "path": "src/paperless_tesseract/tests/test_parser_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": 126, + "column": 13, + "stop_line": 126, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 144, + "column": 13, + "stop_line": 144, + "stop_column": 28, + "path": "src/paperless_tesseract/tests/test_parser_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": 145, + "column": 13, + "stop_line": 145, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 162, + "column": 13, + "stop_line": 162, + "stop_column": 34, + "path": "src/paperless_tesseract/tests/test_parser_custom_settings.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `rotate_pages`", + "concise_description": "Object of class `NoneType` has no attribute `rotate_pages`", + "severity": "error" + }, + { + "line": 163, + "column": 13, + "stop_line": 163, + "stop_column": 44, + "path": "src/paperless_tesseract/tests/test_parser_custom_settings.py", + "code": -2, + "name": "missing-attribute", + "description": "Object of class `NoneType` has no attribute `rotate_pages_threshold`", + "concise_description": "Object of class `NoneType` has no attribute `rotate_pages_threshold`", + "severity": "error" + }, + { + "line": 164, + "column": 13, + "stop_line": 164, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 182, + "column": 13, + "stop_line": 182, + "stop_column": 38, + "path": "src/paperless_tesseract/tests/test_parser_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": 183, + "column": 13, + "stop_line": 183, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 200, + "column": 13, + "stop_line": 200, + "stop_column": 47, + "path": "src/paperless_tesseract/tests/test_parser_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": 201, + "column": 13, + "stop_line": 201, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 223, + "column": 13, + "stop_line": 223, + "stop_column": 31, + "path": "src/paperless_tesseract/tests/test_parser_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": 224, + "column": 13, + "stop_line": 224, + "stop_column": 26, + "path": "src/paperless_tesseract/tests/test_parser_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": 18, + "column": 9, + "stop_line": 18, + "stop_column": 22, + "path": "src/paperless_text/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TextDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner\n `TextDocumentParser.get_thumbnail` has type `BoundMethod[TextDocumentParser, (self: TextDocumentParser, document_path: Path, mime_type: Unknown, file_name: Unknown | None = None) -> Path]`, which is not assignable to `BoundMethod[TextDocumentParser, (self: TextDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.get_thumbnail`", + "concise_description": "Class member `TextDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 43, + "column": 9, + "stop_line": 43, + "stop_column": 14, + "path": "src/paperless_text/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TextDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner\n `TextDocumentParser.parse` has type `BoundMethod[TextDocumentParser, (self: TextDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> None]`, which is not assignable to `BoundMethod[TextDocumentParser, (self: TextDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.parse`", + "concise_description": "Class member `TextDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 46, + "column": 9, + "stop_line": 46, + "stop_column": 21, + "path": "src/paperless_text/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TextDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner\n `TextDocumentParser.get_settings` has type `BoundMethod[TextDocumentParser, (self: TextDocumentParser) -> None]`, which is not assignable to `BoundMethod[TextDocumentParser, (self: TextDocumentParser) -> Never]`, the type of `DocumentParser.get_settings`", + "concise_description": "Class member `TextDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 24, + "column": 9, + "stop_line": 24, + "stop_column": 22, + "path": "src/paperless_tika/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TikaDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner\n `TikaDocumentParser.get_thumbnail` has type `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Path]`, which is not assignable to `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.get_thumbnail`", + "concise_description": "Class member `TikaDocumentParser.get_thumbnail` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 56, + "column": 9, + "stop_line": 56, + "stop_column": 14, + "path": "src/paperless_tika/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TikaDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner\n `TikaDocumentParser.parse` has type `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser, document_path: Path, mime_type: str, file_name: Unknown | None = None) -> None]`, which is not assignable to `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser, document_path: Unknown, mime_type: Unknown, file_name: Unknown | None = None) -> Never]`, the type of `DocumentParser.parse`", + "concise_description": "Class member `TikaDocumentParser.parse` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + }, + { + "line": 132, + "column": 9, + "stop_line": 132, + "stop_column": 21, + "path": "src/paperless_tika/parsers.py", + "code": -2, + "name": "bad-override", + "description": "Class member `TikaDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner\n `TikaDocumentParser.get_settings` has type `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser) -> OutputTypeConfig]`, which is not assignable to `BoundMethod[TikaDocumentParser, (self: TikaDocumentParser) -> Never]`, the type of `DocumentParser.get_settings`", + "concise_description": "Class member `TikaDocumentParser.get_settings` overrides parent class `DocumentParser` in an inconsistent manner", + "severity": "error" + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20d7bfd364..9e5539b2aa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,9 @@ If you want to implement something big: ## Python -Paperless supports python 3.10 - 3.12 at this time. We format Python code with [ruff](https://docs.astral.sh/ruff/formatter/). +Paperless-ngx currently supports Python 3.11, 3.12, 3.13, and 3.14. As a policy, we aim to support at least the three most recent Python versions, and drop support for versions as they reach end-of-life. Older versions may be supported if dependencies permit, but this is not guaranteed. + +We format Python code with [ruff](https://docs.astral.sh/ruff/formatter/). ## Branches diff --git a/Dockerfile b/Dockerfile index aeab828b94..ac61431624 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,14 +5,12 @@ # Purpose: Compiles the frontend # Notes: # - Does PNPM stuff with Typescript and such -FROM --platform=$BUILDPLATFORM docker.io/node:20-bookworm-slim AS compile-frontend +FROM --platform=$BUILDPLATFORM docker.io/node:24-trixie-slim AS compile-frontend COPY ./src-ui /src/src-ui WORKDIR /src/src-ui RUN set -eux \ - && npm update -g pnpm \ - && npm install -g corepack@latest \ && corepack enable \ && pnpm install @@ -32,7 +30,7 @@ RUN set -eux \ # Purpose: Installs s6-overlay and rootfs # Comments: # - Don't leave anything extra in here either -FROM ghcr.io/astral-sh/uv:0.9.4-python3.12-bookworm-slim AS s6-overlay-base +FROM ghcr.io/astral-sh/uv:0.10.9-python3.12-trixie-slim AS s6-overlay-base WORKDIR /usr/src/s6 @@ -47,7 +45,7 @@ ENV \ ARG TARGETARCH ARG TARGETVARIANT # Lock this version -ARG S6_OVERLAY_VERSION=3.2.1.0 +ARG S6_OVERLAY_VERSION=3.2.2.0 ARG S6_BUILD_TIME_PKGS="curl \ xz-utils" @@ -102,8 +100,6 @@ ARG TARGETARCH # Can be workflow provided, defaults set for manual building ARG JBIG2ENC_VERSION=0.30 -ARG QPDF_VERSION=11.9.0 -ARG GS_VERSION=10.03.1 # Set Python environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ @@ -112,8 +108,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONWARNINGS="ignore:::django.http.response:517" \ PNGX_CONTAINERIZED=1 \ # https://docs.astral.sh/uv/reference/settings/#link-mode - UV_LINK_MODE=copy \ - UV_CACHE_DIR=/cache/uv/ + UV_LINK_MODE=copy # # Begin installation and configuration @@ -159,8 +154,6 @@ ARG RUNTIME_PACKAGES="\ libmagic1 \ media-types \ zlib1g \ - # Barcode splitter - libzbar0 \ poppler-utils" # Install basic runtime packages. @@ -170,20 +163,8 @@ RUN set -eux \ && apt-get update \ && apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} \ && echo "Installing pre-built updates" \ - && curl --fail --silent --no-progress-meter --show-error --location --remote-name-all --parallel --parallel-max 4 \ - https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/qpdf-${QPDF_VERSION}/qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - https://github.com/paperless-ngx/builder/releases/download/ghostscript-${GS_VERSION}/libgs10-common_${GS_VERSION}.dfsg-1_all.deb \ - https://github.com/paperless-ngx/builder/releases/download/jbig2enc-${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ - && echo "Installing qpdf ${QPDF_VERSION}" \ - && dpkg --install ./libqpdf29_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && dpkg --install ./qpdf_${QPDF_VERSION}-1_${TARGETARCH}.deb \ - && echo "Installing Ghostscript ${GS_VERSION}" \ - && dpkg --install ./libgs10-common_${GS_VERSION}.dfsg-1_all.deb \ - && dpkg --install ./libgs10_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ - && dpkg --install ./ghostscript_${GS_VERSION}.dfsg-1_${TARGETARCH}.deb \ + && curl --fail --silent --no-progress-meter --show-error --location --remote-name-all \ + https://github.com/paperless-ngx/builder/releases/download/jbig2enc-trixie-v${JBIG2ENC_VERSION}/jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ && echo "Installing jbig2enc" \ && dpkg --install ./jbig2enc_${JBIG2ENC_VERSION}-1_${TARGETARCH}.deb \ && echo "Configuring imagemagick" \ @@ -207,14 +188,17 @@ ARG BUILD_PACKAGES="\ pkg-config" # hadolint ignore=DL3042 -RUN --mount=type=cache,target=${UV_CACHE_DIR},id=python-cache \ - set -eux \ +RUN set -eux \ && echo "Installing build system packages" \ && apt-get update \ && apt-get install --yes --quiet --no-install-recommends ${BUILD_PACKAGES} \ && echo "Installing Python requirements" \ && uv export --quiet --no-dev --all-extras --format requirements-txt --output-file requirements.txt \ - && uv pip install --system --no-python-downloads --python-preference system --requirements requirements.txt \ + && uv pip install --no-cache --system --no-python-downloads --python-preference system \ + --index https://pypi.org/simple \ + --index https://download.pytorch.org/whl/cpu \ + --index-strategy unsafe-best-match \ + --requirements requirements.txt \ && echo "Installing NLTK data" \ && python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" snowball_data \ && python3 -W ignore::RuntimeWarning -m nltk.downloader -d "/usr/share/nltk_data" stopwords \ @@ -254,7 +238,8 @@ RUN set -eux \ && chown --from root:root --changes --recursive paperless:paperless /usr/src/paperless \ && echo "Collecting static files" \ && s6-setuidgid paperless python3 manage.py collectstatic --clear --no-input --link \ - && s6-setuidgid paperless python3 manage.py compilemessages + && s6-setuidgid paperless python3 manage.py compilemessages \ + && /usr/local/bin/deduplicate.py --verbose /usr/src/paperless/static/ VOLUME ["/usr/src/paperless/data", \ "/usr/src/paperless/media", \ diff --git a/docker/compose/docker-compose.ci-test.yml b/docker/compose/docker-compose.ci-test.yml index 701d323c7e..5cb4bcd399 100644 --- a/docker/compose/docker-compose.ci-test.yml +++ b/docker/compose/docker-compose.ci-test.yml @@ -4,7 +4,7 @@ # correct networking for the tests services: gotenberg: - image: docker.io/gotenberg/gotenberg:8.24 + image: docker.io/gotenberg/gotenberg:8.27 hostname: gotenberg container_name: gotenberg network_mode: host @@ -18,8 +18,29 @@ services: - "--log-level=warn" - "--log-format=text" tika: - image: docker.io/apache/tika:latest + image: docker.io/apache/tika:3.2.3.0 hostname: tika container_name: tika network_mode: host restart: unless-stopped + greenmail: + image: docker.io/greenmail/standalone:2.1.8 + hostname: greenmail + container_name: greenmail + environment: + # Enable only IMAP for now (SMTP available via 3025 if needed later) + GREENMAIL_OPTS: >- + -Dgreenmail.setup.test.imap -Dgreenmail.users=test@localhost:test -Dgreenmail.users.login=test@localhost -Dgreenmail.verbose + ports: + - "3143:3143" # IMAP + restart: unless-stopped + nginx: + image: docker.io/nginx:1.29.5-alpine + hostname: nginx + container_name: nginx + ports: + - "8080:8080" + restart: unless-stopped + volumes: + - ../../docs/assets:/usr/share/nginx/html/assets:ro + - ./test-nginx.conf:/etc/nginx/conf.d/default.conf:ro diff --git a/docker/compose/docker-compose.mariadb-tika.yml b/docker/compose/docker-compose.mariadb-tika.yml index c2b625188d..d56c482fc4 100644 --- a/docker/compose/docker-compose.mariadb-tika.yml +++ b/docker/compose/docker-compose.mariadb-tika.yml @@ -72,7 +72,7 @@ services: PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.24 + image: docker.io/gotenberg/gotenberg:8.27 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. diff --git a/docker/compose/docker-compose.portainer.yml b/docker/compose/docker-compose.portainer.yml index 000b7e66a8..a44b4b6925 100644 --- a/docker/compose/docker-compose.portainer.yml +++ b/docker/compose/docker-compose.portainer.yml @@ -56,6 +56,7 @@ services: environment: PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_DBHOST: db + PAPERLESS_DBENGINE: postgres env_file: - stack.env volumes: diff --git a/docker/compose/docker-compose.postgres-tika.yml b/docker/compose/docker-compose.postgres-tika.yml index 530212b51c..216c7e80b3 100644 --- a/docker/compose/docker-compose.postgres-tika.yml +++ b/docker/compose/docker-compose.postgres-tika.yml @@ -62,11 +62,12 @@ services: environment: PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_DBHOST: db + PAPERLESS_DBENGINE: postgresql PAPERLESS_TIKA_ENABLED: 1 PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.24 + image: docker.io/gotenberg/gotenberg:8.27 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. diff --git a/docker/compose/docker-compose.postgres.yml b/docker/compose/docker-compose.postgres.yml index a4b334b712..5ce15f4637 100644 --- a/docker/compose/docker-compose.postgres.yml +++ b/docker/compose/docker-compose.postgres.yml @@ -56,6 +56,7 @@ services: environment: PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_DBHOST: db + PAPERLESS_DBENGINE: postgresql volumes: data: media: diff --git a/docker/compose/docker-compose.sqlite-tika.yml b/docker/compose/docker-compose.sqlite-tika.yml index b849a8ed30..ee7b59e794 100644 --- a/docker/compose/docker-compose.sqlite-tika.yml +++ b/docker/compose/docker-compose.sqlite-tika.yml @@ -51,11 +51,12 @@ services: env_file: docker-compose.env environment: PAPERLESS_REDIS: redis://broker:6379 + PAPERLESS_DBENGINE: sqlite PAPERLESS_TIKA_ENABLED: 1 PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 gotenberg: - image: docker.io/gotenberg/gotenberg:8.24 + image: docker.io/gotenberg/gotenberg:8.27 restart: unless-stopped # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. diff --git a/docker/compose/docker-compose.sqlite.yml b/docker/compose/docker-compose.sqlite.yml index 362fbc9d91..37c7f0c465 100644 --- a/docker/compose/docker-compose.sqlite.yml +++ b/docker/compose/docker-compose.sqlite.yml @@ -42,6 +42,7 @@ services: env_file: docker-compose.env environment: PAPERLESS_REDIS: redis://broker:6379 + PAPERLESS_DBENGINE: sqlite volumes: data: media: diff --git a/docker/compose/test-nginx.conf b/docker/compose/test-nginx.conf new file mode 100644 index 0000000000..e90f3fad3a --- /dev/null +++ b/docker/compose/test-nginx.conf @@ -0,0 +1,14 @@ +server { + listen 8080; + server_name localhost; + + root /usr/share/nginx/html; + + # Enable CORS for test requests + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, HEAD, OPTIONS' always; + + location / { + try_files $uri $uri/ =404; + } +} diff --git a/docker/install_management_commands.sh b/docker/install_management_commands.sh index 17dae68a29..f7a175e9ec 100755 --- a/docker/install_management_commands.sh +++ b/docker/install_management_commands.sh @@ -4,13 +4,13 @@ set -eu -for command in decrypt_documents \ - document_archiver \ +for command in document_archiver \ document_exporter \ document_importer \ mail_fetcher \ document_create_classifier \ document_index \ + document_llmindex \ document_renamer \ document_retagger \ document_thumbnails \ diff --git a/docker/management_script.sh b/docker/management_script.sh index 1fa31c372a..6d5e845493 100755 --- a/docker/management_script.sh +++ b/docker/management_script.sh @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py management_command "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py management_command "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py management_command "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run index d2c118ddbc..2fc64e24eb 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run @@ -29,5 +29,5 @@ if find /run/s6/container_environment/*"_FILE" -maxdepth 1 > /dev/null 2>&1; the fi done else - echo "${log_prefix} No *_FILE environment found" + echo "${log_prefix} No *_FILE environment found" fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run index 5d9b457409..62d33cbe91 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run @@ -10,8 +10,10 @@ cd "${PAPERLESS_SRC_DIR}" # The whole migrate, with flock, needs to run as the right user if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py check --tag compatibility paperless || exit 1 exec s6-setlock -n "${data_dir}/migration_lock" python3 manage.py migrate --skip-checks --no-input else + s6-setuidgid paperless python3 manage.py check --tag compatibility paperless || exit 1 exec s6-setuidgid paperless \ s6-setlock -n "${data_dir}/migration_lock" \ python3 manage.py migrate --skip-checks --no-input diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run index aa617355d7..f8430aee2e 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run @@ -2,6 +2,17 @@ # shellcheck shell=bash declare -r log_prefix="[init-user]" +# When the container is started as a non-root user (e.g. via `user: 999:999` +# in Docker Compose), usermod/groupmod require root and are meaningless. +# USERMAP_* variables only apply to the root-started path. +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + if [[ -n "${USERMAP_UID}" || -n "${USERMAP_GID}" ]]; then + echo "${log_prefix} WARNING: USERMAP_UID/USERMAP_GID are set but have no effect when the container is started as a non-root user" + fi + echo "${log_prefix} Running as non-root user ($(id --user):$(id --group)), skipping UID/GID remapping" + exit 0 +fi + declare -r usermap_original_uid=$(id -u paperless) declare -r usermap_original_gid=$(id -g paperless) declare -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid} diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run index ede8a654a6..17df9bef90 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run @@ -1,70 +1,66 @@ #!/command/with-contenv /usr/bin/bash # shellcheck shell=bash +# vim: set ft=bash ts=4 sw=4 sts=4 et : -declare -r log_prefix="[init-db-wait]" +set -euo pipefail -wait_for_postgres() { - local attempt_num=1 - local -r max_attempts=5 +declare -r LOG_PREFIX="[init-db-wait]" - echo "${log_prefix} Waiting for PostgreSQL to start..." +declare -ri TIMEOUT=60 +declare -i ATTEMPT=0 +declare -i DELAY=0 +declare -i STARTED_AT=${EPOCHSECONDS:?EPOCHSECONDS var unset} - local -r host="${PAPERLESS_DBHOST:-localhost}" - local -r port="${PAPERLESS_DBPORT:-5432}" - local -r user="${PAPERLESS_DBUSER:-paperless}" +delay_next_attempt() { + local -i elapsed=$(( EPOCHSECONDS - STARTED_AT )) + local -ri remaining=$(( TIMEOUT - elapsed )) - # Disable warning, host and port can't have spaces - # shellcheck disable=SC2086 - while [ ! "$(pg_isready -h ${host} -p ${port} --username ${user})" ]; do + if (( remaining <= 0 )); then + echo "${LOG_PREFIX} Unable to connect after $elapsed seconds." + exit 1 + fi - if [ $attempt_num -eq $max_attempts ]; then - echo "${log_prefix} Unable to connect to database." - exit 1 - else - echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..." - fi + DELAY+=1 - attempt_num=$(("$attempt_num" + 1)) - sleep 5 - done - # Extra in case this is a first start - sleep 5 - echo "Connected to PostgreSQL" -} + # clamp to remaining time + if (( DELAY > remaining )); then + DELAY=$remaining + fi -wait_for_mariadb() { - echo "${log_prefix} Waiting for MariaDB to start..." + ATTEMPT+=1 + echo "${LOG_PREFIX} Attempt $ATTEMPT failed! Trying again in $DELAY seconds..." + sleep "$DELAY" +} - local -r host="${PAPERLESS_DBHOST:=localhost}" - local -r port="${PAPERLESS_DBPORT:=3306}" +wait_for_postgres() { + echo "${LOG_PREFIX} Waiting for PostgreSQL to start..." - local attempt_num=1 - local -r max_attempts=5 + local -r host="${PAPERLESS_DBHOST:-localhost}" + local -r port="${PAPERLESS_DBPORT:-5432}" + local -r user="${PAPERLESS_DBUSER:-paperless}" - # Disable warning, host and port can't have spaces - # shellcheck disable=SC2086 - while ! true > /dev/tcp/$host/$port; do + while ! pg_isready -h "${host}" -p "${port}" --username "${user}"; do + delay_next_attempt + done + echo "${LOG_PREFIX} Connected to PostgreSQL" +} - if [ $attempt_num -eq $max_attempts ]; then - echo "${log_prefix} Unable to connect to database." - exit 1 - else - echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..." +wait_for_mariadb() { + echo "${LOG_PREFIX} Waiting for MariaDB to start..." - fi + local -r host="${PAPERLESS_DBHOST:-localhost}" + local -r port="${PAPERLESS_DBPORT:-3306}" - attempt_num=$(("$attempt_num" + 1)) - sleep 5 + while ! mariadb-admin --host="${host}" --port="${port}" --skip-ssl ping --silent >/dev/null 2>&1; do + delay_next_attempt done - echo "Connected to MariaDB" + echo "${LOG_PREFIX} Connected to MariaDB" } -if [[ "${PAPERLESS_DBENGINE}" == "mariadb" ]]; then - echo "${log_prefix} Waiting for MariaDB to report ready" +if [[ "${PAPERLESS_DBENGINE:-}" == "mariadb" ]]; then wait_for_mariadb -elif [[ -n "${PAPERLESS_DBHOST}" ]]; then - echo "${log_prefix} Waiting for postgresql to report ready" +elif [[ -n "${PAPERLESS_DBHOST:-}" ]]; then wait_for_postgres fi - echo "${log_prefix} Database is ready" +echo "${LOG_PREFIX} Database is ready" diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run index 841dad204e..64b458150a 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run @@ -10,11 +10,11 @@ export GRANIAN_WORKERS=${GRANIAN_WORKERS:-${PAPERLESS_WEBSERVER_WORKERS:-1}} # Only set GRANIAN_URL_PATH_PREFIX if PAPERLESS_FORCE_SCRIPT_NAME is set if [[ -n "${PAPERLESS_FORCE_SCRIPT_NAME}" ]]; then - export GRANIAN_URL_PATH_PREFIX=${PAPERLESS_FORCE_SCRIPT_NAME} + export GRANIAN_URL_PATH_PREFIX=${PAPERLESS_FORCE_SCRIPT_NAME} fi if [[ -n "${USER_IS_NON_ROOT}" ]]; then - exec granian --interface asginl --ws --loop uvloop "paperless.asgi:application" + exec granian --interface asginl --ws --loop uvloop "paperless.asgi:application" else - exec s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application" + exec s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application" fi diff --git a/docker/rootfs/usr/local/bin/convert_mariadb_uuid b/docker/rootfs/usr/local/bin/convert_mariadb_uuid index 806a98f3b0..7adb0a1af1 100755 --- a/docker/rootfs/usr/local/bin/convert_mariadb_uuid +++ b/docker/rootfs/usr/local/bin/convert_mariadb_uuid @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py convert_mariadb_uuid "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py convert_mariadb_uuid "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py convert_mariadb_uuid "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/createsuperuser b/docker/rootfs/usr/local/bin/createsuperuser index f931952ba4..b91cee3c51 100755 --- a/docker/rootfs/usr/local/bin/createsuperuser +++ b/docker/rootfs/usr/local/bin/createsuperuser @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py createsuperuser "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py createsuperuser "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py createsuperuser "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/deduplicate.py b/docker/rootfs/usr/local/bin/deduplicate.py new file mode 100755 index 0000000000..c071cf0433 --- /dev/null +++ b/docker/rootfs/usr/local/bin/deduplicate.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +""" +File deduplication script that replaces identical files with symlinks. +Uses SHA256 hashing to identify duplicate files. +""" + +import hashlib +from collections import defaultdict +from pathlib import Path + +import click +import humanize + + +def calculate_sha256(filepath: Path) -> str | None: + sha256_hash = hashlib.sha256() + try: + with filepath.open("rb") as f: + # Read file in chunks to handle large files efficiently + while chunk := f.read(65536): # 64KB chunks + sha256_hash.update(chunk) + return sha256_hash.hexdigest() + except OSError as e: + click.echo(f"Error reading {filepath}: {e}", err=True) + return None + + +def find_duplicate_files(directory: Path) -> dict[str, list[Path]]: + """ + Recursively scan directory and group files by their SHA256 hash. + Returns a dictionary mapping hash -> list of file paths. + """ + hash_to_files: dict[str, list[Path]] = defaultdict(list) + + for filepath in directory.rglob("*"): + # Skip symlinks + if filepath.is_symlink(): + continue + + # Skip if not a regular file + if not filepath.is_file(): + continue + + file_hash = calculate_sha256(filepath) + if file_hash: + hash_to_files[file_hash].append(filepath) + + # Filter to only return hashes with duplicates + return {h: files for h, files in hash_to_files.items() if len(files) > 1} + + +def replace_with_symlinks( + duplicate_groups: dict[str, list[Path]], + *, + dry_run: bool = False, +) -> tuple[int, int]: + """ + Replace duplicate files with symlinks to the first occurrence. + Returns (number_of_files_replaced, space_saved_in_bytes). + """ + total_duplicates = 0 + space_saved = 0 + + for file_hash, file_list in duplicate_groups.items(): + # Keep the first file as the original, replace others with symlinks + original_file = file_list[0] + duplicates = file_list[1:] + + click.echo(f"Found {len(duplicates)} duplicate(s) of: {original_file}") + + for duplicate in duplicates: + try: + # Get file size before deletion + file_size = duplicate.stat().st_size + + if dry_run: + click.echo(f" [DRY RUN] Would replace: {duplicate}") + else: + # Remove the duplicate file + duplicate.unlink() + + # Create relative symlink if possible, otherwise absolute + try: + # Try to create a relative symlink + rel_path = original_file.relative_to(duplicate.parent) + duplicate.symlink_to(rel_path) + click.echo(f" Replaced: {duplicate} -> {rel_path}") + except ValueError: + # Fall back to absolute path + duplicate.symlink_to(original_file.resolve()) + click.echo(f" Replaced: {duplicate} -> {original_file}") + + space_saved += file_size + + total_duplicates += 1 + + except OSError as e: + click.echo(f" Error replacing {duplicate}: {e}", err=True) + + return total_duplicates, space_saved + + +@click.command() +@click.argument( + "directory", + type=click.Path( + exists=True, + file_okay=False, + dir_okay=True, + readable=True, + path_type=Path, + ), +) +@click.option( + "--dry-run", + is_flag=True, + help="Show what would be done without making changes", +) +@click.option("--verbose", "-v", is_flag=True, help="Show verbose output") +def deduplicate(directory: Path, *, dry_run: bool, verbose: bool) -> None: + """ + Recursively search DIRECTORY for identical files and replace them with symlinks. + + Uses SHA256 hashing to identify duplicate files. The first occurrence of each + unique file is kept, and all duplicates are replaced with symlinks pointing to it. + """ + directory = directory.resolve() + + click.echo(f"Scanning directory: {directory}") + if dry_run: + click.echo("Running in DRY RUN mode - no changes will be made") + + # Find all duplicate files + click.echo("Calculating file hashes...") + duplicate_groups = find_duplicate_files(directory) + + if not duplicate_groups: + click.echo("No duplicate files found!") + return + + total_files = sum(len(files) - 1 for files in duplicate_groups.values()) + click.echo( + f"Found {len(duplicate_groups)} group(s) of duplicates " + f"({total_files} files to deduplicate)", + ) + + if verbose: + for file_hash, files in duplicate_groups.items(): + click.echo(f"Hash: {file_hash}") + for f in files: + click.echo(f" - {f}") + + # Replace duplicates with symlinks + click.echo("Processing duplicates...") + num_replaced, space_saved = replace_with_symlinks(duplicate_groups, dry_run=dry_run) + + # Summary + click.echo( + f"{'Would replace' if dry_run else 'Replaced'} " + f"{num_replaced} duplicate file(s)", + ) + if not dry_run: + click.echo(f"Space saved: {humanize.naturalsize(space_saved, binary=True)}") + + +if __name__ == "__main__": + deduplicate() diff --git a/docker/rootfs/usr/local/bin/document_archiver b/docker/rootfs/usr/local/bin/document_archiver index 383acfcc6a..4200aa7aa4 100755 --- a/docker/rootfs/usr/local/bin/document_archiver +++ b/docker/rootfs/usr/local/bin/document_archiver @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_archiver "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_archiver "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_archiver "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_create_classifier b/docker/rootfs/usr/local/bin/document_create_classifier index 72dc33d6f0..23e3d3d82d 100755 --- a/docker/rootfs/usr/local/bin/document_create_classifier +++ b/docker/rootfs/usr/local/bin/document_create_classifier @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_create_classifier "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_create_classifier "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_create_classifier "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_exporter b/docker/rootfs/usr/local/bin/document_exporter index 7f48215d71..a82d70a16c 100755 --- a/docker/rootfs/usr/local/bin/document_exporter +++ b/docker/rootfs/usr/local/bin/document_exporter @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_exporter "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_exporter "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_exporter "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_fuzzy_match b/docker/rootfs/usr/local/bin/document_fuzzy_match index 5b95485574..b97c2a9ba2 100755 --- a/docker/rootfs/usr/local/bin/document_fuzzy_match +++ b/docker/rootfs/usr/local/bin/document_fuzzy_match @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_fuzzy_match "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_fuzzy_match "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_fuzzy_match "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_importer b/docker/rootfs/usr/local/bin/document_importer index 2286e89f71..dbfb40a57e 100755 --- a/docker/rootfs/usr/local/bin/document_importer +++ b/docker/rootfs/usr/local/bin/document_importer @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_importer "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_importer "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_importer "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_index b/docker/rootfs/usr/local/bin/document_index index 2d518b5c5c..b05f765da9 100755 --- a/docker/rootfs/usr/local/bin/document_index +++ b/docker/rootfs/usr/local/bin/document_index @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_index "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_index "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_index "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/decrypt_documents b/docker/rootfs/usr/local/bin/document_llmindex similarity index 65% rename from docker/rootfs/usr/local/bin/decrypt_documents rename to docker/rootfs/usr/local/bin/document_llmindex index 4da1549ee5..8e51245e18 100755 --- a/docker/rootfs/usr/local/bin/decrypt_documents +++ b/docker/rootfs/usr/local/bin/document_llmindex @@ -6,9 +6,9 @@ set -e cd "${PAPERLESS_SRC_DIR}" if [[ $(id -u) == 0 ]]; then - s6-setuidgid paperless python3 manage.py decrypt_documents "$@" + s6-setuidgid paperless python3 manage.py document_llmindex "$@" elif [[ $(id -un) == "paperless" ]]; then - python3 manage.py decrypt_documents "$@" + python3 manage.py document_llmindex "$@" else echo "Unknown user." fi diff --git a/docker/rootfs/usr/local/bin/document_renamer b/docker/rootfs/usr/local/bin/document_renamer index 326317a73a..720edc0d85 100755 --- a/docker/rootfs/usr/local/bin/document_renamer +++ b/docker/rootfs/usr/local/bin/document_renamer @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_renamer "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_renamer "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_renamer "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_retagger b/docker/rootfs/usr/local/bin/document_retagger index 3bab3e790d..6cbe03c198 100755 --- a/docker/rootfs/usr/local/bin/document_retagger +++ b/docker/rootfs/usr/local/bin/document_retagger @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_retagger "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_retagger "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_retagger "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_sanity_checker b/docker/rootfs/usr/local/bin/document_sanity_checker index 5c0c29ef21..8fff13a521 100755 --- a/docker/rootfs/usr/local/bin/document_sanity_checker +++ b/docker/rootfs/usr/local/bin/document_sanity_checker @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_sanity_checker "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_sanity_checker "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_sanity_checker "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/document_thumbnails b/docker/rootfs/usr/local/bin/document_thumbnails index c1000c31ad..3c0f0de4c2 100755 --- a/docker/rootfs/usr/local/bin/document_thumbnails +++ b/docker/rootfs/usr/local/bin/document_thumbnails @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py document_thumbnails "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py document_thumbnails "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py document_thumbnails "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/mail_fetcher b/docker/rootfs/usr/local/bin/mail_fetcher index 2ae1d1dfbe..762b850b9a 100755 --- a/docker/rootfs/usr/local/bin/mail_fetcher +++ b/docker/rootfs/usr/local/bin/mail_fetcher @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py mail_fetcher "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py mail_fetcher "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py mail_fetcher "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/manage_superuser b/docker/rootfs/usr/local/bin/manage_superuser index 9f7f37ecf3..8f550cd1aa 100755 --- a/docker/rootfs/usr/local/bin/manage_superuser +++ b/docker/rootfs/usr/local/bin/manage_superuser @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py manage_superuser "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py manage_superuser "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py manage_superuser "$@" else echo "Unknown user." + exit 1 fi diff --git a/docker/rootfs/usr/local/bin/prune_audit_logs b/docker/rootfs/usr/local/bin/prune_audit_logs index b9142e98e5..8a3ab32993 100755 --- a/docker/rootfs/usr/local/bin/prune_audit_logs +++ b/docker/rootfs/usr/local/bin/prune_audit_logs @@ -5,10 +5,13 @@ set -e cd "${PAPERLESS_SRC_DIR}" -if [[ $(id -u) == 0 ]]; then +if [[ -n "${USER_IS_NON_ROOT}" ]]; then + python3 manage.py prune_audit_logs "$@" +elif [[ $(id -u) == 0 ]]; then s6-setuidgid paperless python3 manage.py prune_audit_logs "$@" elif [[ $(id -un) == "paperless" ]]; then python3 manage.py prune_audit_logs "$@" else echo "Unknown user." + exit 1 fi diff --git a/docs/administration.md b/docs/administration.md index ddf51bf9a6..e55b899f55 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -10,16 +10,16 @@ consuming documents at that time. Options available to any installation of paperless: -- Use the [document exporter](#exporter). The document exporter exports all your documents, - thumbnails, metadata, and database contents to a specific folder. You may import your - documents and settings into a fresh instance of paperless again or store your - documents in another DMS with this export. +- Use the [document exporter](#exporter). The document exporter exports all your documents, + thumbnails, metadata, and database contents to a specific folder. You may import your + documents and settings into a fresh instance of paperless again or store your + documents in another DMS with this export. - The document exporter is also able to update an already existing - export. Therefore, incremental backups with `rsync` are entirely - possible. + The document exporter is also able to update an already existing + export. Therefore, incremental backups with `rsync` are entirely + possible. - The exporter does not include API tokens and they will need to be re-generated after importing. + The exporter does not include API tokens and they will need to be re-generated after importing. !!! caution @@ -29,28 +29,27 @@ Options available to any installation of paperless: Options available to docker installations: -- Backup the docker volumes. These usually reside within - `/var/lib/docker/volumes` on the host and you need to be root in - order to access them. +- Backup the docker volumes. These usually reside within + `/var/lib/docker/volumes` on the host and you need to be root in + order to access them. - Paperless uses 4 volumes: - - - `paperless_media`: This is where your documents are stored. - - `paperless_data`: This is where auxiliary data is stored. This - folder also contains the SQLite database, if you use it. - - `paperless_pgdata`: Exists only if you use PostgreSQL and - contains the database. - - `paperless_dbdata`: Exists only if you use MariaDB and contains - the database. + Paperless uses 4 volumes: + - `paperless_media`: This is where your documents are stored. + - `paperless_data`: This is where auxiliary data is stored. This + folder also contains the SQLite database, if you use it. + - `paperless_pgdata`: Exists only if you use PostgreSQL and + contains the database. + - `paperless_dbdata`: Exists only if you use MariaDB and contains + the database. Options available to bare-metal and non-docker installations: -- Backup the entire paperless folder. This ensures that if your - paperless instance crashes at some point or your disk fails, you can - simply copy the folder back into place and it works. +- Backup the entire paperless folder. This ensures that if your + paperless instance crashes at some point or your disk fails, you can + simply copy the folder back into place and it works. - When using PostgreSQL or MariaDB, you'll also have to backup the - database. + When using PostgreSQL or MariaDB, you'll also have to backup the + database. ### Restoring {#migrating-restoring} @@ -62,6 +61,10 @@ copies you created in the steps above. ## Updating Paperless {#updating} +!!! warning + + Please review the [migration instructions](migration-v3.md) before upgrading Paperless-ngx to v3.0, it includes some breaking changes that require manual intervention before upgrading. + ### Docker Route {#docker-updating} If a new release of paperless-ngx is available, upgrading depends on how @@ -505,19 +508,19 @@ collection for issues. The issues detected by the sanity checker are as follows: -- Missing original files. -- Missing archive files. -- Inaccessible original files due to improper permissions. -- Inaccessible archive files due to improper permissions. -- Corrupted original documents by comparing their checksum against - what is stored in the database. -- Corrupted archive documents by comparing their checksum against what - is stored in the database. -- Missing thumbnails. -- Inaccessible thumbnails due to improper permissions. -- Documents without any content (warning). -- Orphaned files in the media directory (warning). These are files - that are not referenced by any document in paperless. +- Missing original files. +- Missing archive files. +- Inaccessible original files due to improper permissions. +- Inaccessible archive files due to improper permissions. +- Corrupted original documents by comparing their checksum against + what is stored in the database. +- Corrupted archive documents by comparing their checksum against what + is stored in the database. +- Missing thumbnails. +- Inaccessible thumbnails due to improper permissions. +- Documents without any content (warning). +- Orphaned files in the media directory (warning). These are files + that are not referenced by any document in paperless. ``` document_sanity_checker @@ -580,39 +583,9 @@ document. documents, such as encrypted PDF documents. The archiver will skip over these documents each time it sees them. -### Managing encryption {#encryption} - -!!! warning - - Encryption was removed in [paperless-ng 0.9](changelog.md#paperless-ng-090) - because it did not really provide any additional security, the passphrase - was stored in a configuration file on the same system as the documents. - Furthermore, the entire text content of the documents is stored plain in - the database, even if your documents are encrypted. Filenames are not - encrypted as well. Finally, the web server provides transparent access to - your encrypted documents. - - Consider running paperless on an encrypted filesystem instead, which - will then at least provide security against physical hardware theft. - -#### Enabling encryption - -Enabling encryption is no longer supported. - -#### Disabling encryption - -Basic usage to disable encryption of your document store: - -(Note: If `PAPERLESS_PASSPHRASE` isn't set already, you need to specify -it here) - -``` -decrypt_documents [--passphrase SECR3TP4SSPHRA$E] -``` - ### Detecting duplicates {#fuzzy_duplicate} -Paperless already catches and prevents upload of exactly matching documents, +Paperless-ngx already catches and warns of exactly matching documents, however a new scan of an existing document may not produce an exact bit for bit duplicate. But the content should be exact or close, allowing detection. diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md index de10688646..9896040003 100644 --- a/docs/advanced_usage.md +++ b/docs/advanced_usage.md @@ -25,20 +25,20 @@ documents. The following algorithms are available: -- **None:** No matching will be performed. -- **Any:** Looks for any occurrence of any word provided in match in - the PDF. If you define the match as `Bank1 Bank2`, it will match - documents containing either of these terms. -- **All:** Requires that every word provided appears in the PDF, - albeit not in the order provided. -- **Exact:** Matches only if the match appears exactly as provided - (i.e. preserve ordering) in the PDF. -- **Regular expression:** Parses the match as a regular expression and - tries to find a match within the document. -- **Fuzzy match:** Uses a partial matching based on locating the tag text - inside the document, using a [partial ratio](https://rapidfuzz.github.io/RapidFuzz/Usage/fuzz.html#partial-ratio) -- **Auto:** Tries to automatically match new documents. This does not - require you to set a match. See the [notes below](#automatic-matching). +- **None:** No matching will be performed. +- **Any:** Looks for any occurrence of any word provided in match in + the PDF. If you define the match as `Bank1 Bank2`, it will match + documents containing either of these terms. +- **All:** Requires that every word provided appears in the PDF, + albeit not in the order provided. +- **Exact:** Matches only if the match appears exactly as provided + (i.e. preserve ordering) in the PDF. +- **Regular expression:** Parses the match as a regular expression and + tries to find a match within the document. +- **Fuzzy match:** Uses a partial matching based on locating the tag text + inside the document, using a [partial ratio](https://rapidfuzz.github.io/RapidFuzz/Usage/fuzz.html#partial-ratio) +- **Auto:** Tries to automatically match new documents. This does not + require you to set a match. See the [notes below](#automatic-matching). When using the _any_ or _all_ matching algorithms, you can search for terms that consist of multiple words by enclosing them in double quotes. @@ -69,33 +69,33 @@ Paperless tries to hide much of the involved complexity with this approach. However, there are a couple caveats you need to keep in mind when using this feature: -- Changes to your documents are not immediately reflected by the - matching algorithm. The neural network needs to be _trained_ on your - documents after changes. Paperless periodically (default: once each - hour) checks for changes and does this automatically for you. -- The Auto matching algorithm only takes documents into account which - are NOT placed in your inbox (i.e. have any inbox tags assigned to - them). This ensures that the neural network only learns from - documents which you have correctly tagged before. -- The matching algorithm can only work if there is a correlation - between the tag, correspondent, document type, or storage path and - the document itself. Your bank statements usually contain your bank - account number and the name of the bank, so this works reasonably - well, However, tags such as "TODO" cannot be automatically - assigned. -- The matching algorithm needs a reasonable number of documents to - identify when to assign tags, correspondents, storage paths, and - types. If one out of a thousand documents has the correspondent - "Very obscure web shop I bought something five years ago", it will - probably not assign this correspondent automatically if you buy - something from them again. The more documents, the better. -- Paperless also needs a reasonable amount of negative examples to - decide when not to assign a certain tag, correspondent, document - type, or storage path. This will usually be the case as you start - filling up paperless with documents. Example: If all your documents - are either from "Webshop" or "Bank", paperless will assign one - of these correspondents to ANY new document, if both are set to - automatic matching. +- Changes to your documents are not immediately reflected by the + matching algorithm. The neural network needs to be _trained_ on your + documents after changes. Paperless periodically (default: once each + hour) checks for changes and does this automatically for you. +- The Auto matching algorithm only takes documents into account which + are NOT placed in your inbox (i.e. have any inbox tags assigned to + them). This ensures that the neural network only learns from + documents which you have correctly tagged before. +- The matching algorithm can only work if there is a correlation + between the tag, correspondent, document type, or storage path and + the document itself. Your bank statements usually contain your bank + account number and the name of the bank, so this works reasonably + well, However, tags such as "TODO" cannot be automatically + assigned. +- The matching algorithm needs a reasonable number of documents to + identify when to assign tags, correspondents, storage paths, and + types. If one out of a thousand documents has the correspondent + "Very obscure web shop I bought something five years ago", it will + probably not assign this correspondent automatically if you buy + something from them again. The more documents, the better. +- Paperless also needs a reasonable amount of negative examples to + decide when not to assign a certain tag, correspondent, document + type, or storage path. This will usually be the case as you start + filling up paperless with documents. Example: If all your documents + are either from "Webshop" or "Bank", paperless will assign one + of these correspondents to ANY new document, if both are set to + automatic matching. ## Hooking into the consumption process {#consume-hooks} @@ -243,12 +243,12 @@ webserver: Troubleshooting: -- Monitor the Docker Compose log - `cd ~/paperless-ngx; docker compose logs -f` -- Check your script's permission e.g. in case of permission error - `sudo chmod 755 post-consumption-example.sh` -- Pipe your scripts's output to a log file e.g. - `echo "${DOCUMENT_ID}" | tee --append /usr/src/paperless/scripts/post-consumption-example.log` +- Monitor the Docker Compose log + `cd ~/paperless-ngx; docker compose logs -f` +- Check your script's permission e.g. in case of permission error + `sudo chmod 755 post-consumption-example.sh` +- Pipe your scripts's output to a log file e.g. + `echo "${DOCUMENT_ID}" | tee --append /usr/src/paperless/scripts/post-consumption-example.log` ## File name handling {#file-name-handling} @@ -262,6 +262,10 @@ your files differently, you can do that by adjusting the or using [storage paths (see below)](#storage-paths). Paperless adds the correct file extension e.g. `.pdf`, `.jpg` automatically. +When a document has file versions, each version uses the same naming rules and +storage path resolution as any other document file, with an added version suffix +such as `_v1`, `_v2`, etc. + This variable allows you to configure the filename (folders are allowed) using placeholders. For example, configuring this to @@ -303,35 +307,35 @@ will create a directory structure as follows: Paperless provides the following variables for use within filenames: -- `{{ asn }}`: The archive serial number of the document, or "none". -- `{{ correspondent }}`: The name of the correspondent, or "none". -- `{{ document_type }}`: The name of the document type, or "none". -- `{{ tag_list }}`: A comma separated list of all tags assigned to the - document. -- `{{ title }}`: The title of the document. -- `{{ created }}`: The full date (ISO 8601 format, e.g. `2024-03-14`) the document was created. -- `{{ created_year }}`: Year created only, formatted as the year with - century. -- `{{ created_year_short }}`: Year created only, formatted as the year - without century, zero padded. -- `{{ created_month }}`: Month created only (number 01-12). -- `{{ created_month_name }}`: Month created name, as per locale -- `{{ created_month_name_short }}`: Month created abbreviated name, as per - locale -- `{{ created_day }}`: Day created only (number 01-31). -- `{{ added }}`: The full date (ISO format) the document was added to - paperless. -- `{{ added_year }}`: Year added only. -- `{{ added_year_short }}`: Year added only, formatted as the year without - century, zero padded. -- `{{ added_month }}`: Month added only (number 01-12). -- `{{ added_month_name }}`: Month added name, as per locale -- `{{ added_month_name_short }}`: Month added abbreviated name, as per - locale -- `{{ added_day }}`: Day added only (number 01-31). -- `{{ owner_username }}`: Username of document owner, if any, or "none" -- `{{ original_name }}`: Document original filename, minus the extension, if any, or "none" -- `{{ doc_pk }}`: The paperless identifier (primary key) for the document. +- `{{ asn }}`: The archive serial number of the document, or "none". +- `{{ correspondent }}`: The name of the correspondent, or "none". +- `{{ document_type }}`: The name of the document type, or "none". +- `{{ tag_list }}`: A comma separated list of all tags assigned to the + document. +- `{{ title }}`: The title of the document. +- `{{ created }}`: The full date (ISO 8601 format, e.g. `2024-03-14`) the document was created. +- `{{ created_year }}`: Year created only, formatted as the year with + century. +- `{{ created_year_short }}`: Year created only, formatted as the year + without century, zero padded. +- `{{ created_month }}`: Month created only (number 01-12). +- `{{ created_month_name }}`: Month created name, as per locale +- `{{ created_month_name_short }}`: Month created abbreviated name, as per + locale +- `{{ created_day }}`: Day created only (number 01-31). +- `{{ added }}`: The full date (ISO format) the document was added to + paperless. +- `{{ added_year }}`: Year added only. +- `{{ added_year_short }}`: Year added only, formatted as the year without + century, zero padded. +- `{{ added_month }}`: Month added only (number 01-12). +- `{{ added_month_name }}`: Month added name, as per locale +- `{{ added_month_name_short }}`: Month added abbreviated name, as per + locale +- `{{ added_day }}`: Day added only (number 01-31). +- `{{ owner_username }}`: Username of document owner, if any, or "none" +- `{{ original_name }}`: Document original filename, minus the extension, if any, or "none" +- `{{ doc_pk }}`: The paperless identifier (primary key) for the document. !!! warning @@ -353,6 +357,8 @@ If paperless detects that two documents share the same filename, paperless will automatically append `_01`, `_02`, etc to the filename. This happens if all the placeholders in a filename evaluate to the same value. +For versioned files, this counter is appended after the version suffix +(for example `statement_v2_01.pdf`). If there are any errors in the placeholders included in `PAPERLESS_FILENAME_FORMAT`, paperless will fall back to using the default naming scheme instead. @@ -382,10 +388,10 @@ before empty placeholders are removed as well, empty directories are omitted. When a single storage layout is not sufficient for your use case, storage paths allow for more complex structure to set precisely where each document is stored in the file system. -- Each storage path is a [`PAPERLESS_FILENAME_FORMAT`](configuration.md#PAPERLESS_FILENAME_FORMAT) and - follows the rules described above -- Each document is assigned a storage path using the matching algorithms described above, but can be - overwritten at any time +- Each storage path is a [`PAPERLESS_FILENAME_FORMAT`](configuration.md#PAPERLESS_FILENAME_FORMAT) and + follows the rules described above +- Each document is assigned a storage path using the matching algorithms described above, but can be + overwritten at any time For example, you could define the following two storage paths: @@ -431,8 +437,10 @@ This allows for complex logic to be included in the format, including [logical s and [filters](https://jinja.palletsprojects.com/en/3.1.x/templates/#id11) to manipulate the [variables](#filename-format-variables) provided. The template is provided as a string, potentially multiline, and rendered into a single line. -In addition, the entire Document instance is available to be utilized in a more advanced way, as well as some variables which only make sense to be accessed -with more complex logic. +In addition, a limited `document` object is available for advanced templates. +This object includes common metadata fields such as `id`, `pk`, `title`, `content`, `page_count`, `created`, `added`, `modified`, `mime_type`, +`checksum`, `archive_checksum`, `archive_serial_number`, `filename`, `archive_filename`, and `original_filename`. +Related values are available as nested objects with limited fields, for example document.correspondent.name, etc. #### Custom Jinja2 Filters @@ -449,13 +457,13 @@ The `get_cf_value` filter retrieves a value from custom field data with optional ###### Parameters -- `custom_fields`: This _must_ be the provided custom field data -- `name` (str): Name of the custom field to retrieve -- `default` (str, optional): Default value to return if field is not found or has no value +- `custom_fields`: This _must_ be the provided custom field data +- `name` (str): Name of the custom field to retrieve +- `default` (str, optional): Default value to return if field is not found or has no value ###### Returns -- `str | None`: The field value, default value, or `None` if neither exists +- `str | None`: The field value, default value, or `None` if neither exists ###### Examples @@ -479,12 +487,12 @@ The `datetime` filter formats a datetime string or datetime object using Python' ###### Parameters -- `value` (str | datetime): Date/time value to format (strings will be parsed automatically) -- `format` (str): Python strftime format string +- `value` (str | datetime): Date/time value to format (strings will be parsed automatically) +- `format` (str): Python strftime format string ###### Returns -- `str`: Formatted datetime string +- `str`: Formatted datetime string ###### Examples @@ -501,7 +509,7 @@ The `datetime` filter formats a datetime string or datetime object using Python' See the [strftime format code documentation](https://docs.python.org/3.13/library/datetime.html#strftime-and-strptime-format-codes) for the possible codes and their meanings. -##### Date Localization +##### Date Localization {#date-localization} The `localize_date` filter formats a date or datetime object into a localized string using Babel internationalization. This takes into account the provided locale for translation. Since this must be used on a date or datetime object, @@ -517,13 +525,13 @@ An ISO string can also be provided to control the output format. ###### Parameters -- `value` (date | datetime | str): Date, datetime object or ISO string to format (datetime should be timezone-aware) -- `format` (str): Format type - either a Babel preset ('short', 'medium', 'long', 'full') or custom pattern -- `locale` (str): Locale code for localization (e.g., 'en_US', 'fr_FR', 'de_DE') +- `value` (date | datetime | str): Date, datetime object or ISO string to format (datetime should be timezone-aware) +- `format` (str): Format type - either a Babel preset ('short', 'medium', 'long', 'full') or custom pattern +- `locale` (str): Locale code for localization (e.g., 'en_US', 'fr_FR', 'de_DE') ###### Returns -- `str`: Localized, formatted date string +- `str`: Localized, formatted date string ###### Examples @@ -557,15 +565,15 @@ See the [supported format codes](https://unicode.org/reports/tr35/tr35-dates.htm ### Format Presets -- **short**: Abbreviated format (e.g., "1/15/24") -- **medium**: Medium-length format (e.g., "Jan 15, 2024") -- **long**: Long format with full month name (e.g., "January 15, 2024") -- **full**: Full format including day of week (e.g., "Monday, January 15, 2024") +- **short**: Abbreviated format (e.g., "1/15/24") +- **medium**: Medium-length format (e.g., "Jan 15, 2024") +- **long**: Long format with full month name (e.g., "January 15, 2024") +- **full**: Full format including day of week (e.g., "Monday, January 15, 2024") #### Additional Variables -- `{{ tag_name_list }}`: A list of tag names applied to the document, ordered by the tag name. Note this is a list, not a single string -- `{{ custom_fields }}`: A mapping of custom field names to their type and value. A user can access the mapping by field name or check if a field is applied by checking its existence in the variable. +- `{{ tag_name_list }}`: A list of tag names applied to the document, ordered by the tag name. Note this is a list, not a single string +- `{{ custom_fields }}`: A mapping of custom field names to their type and value. A user can access the mapping by field name or check if a field is applied by checking its existence in the variable. !!! tip @@ -667,15 +675,15 @@ installation, you can use volumes to accomplish this: ```yaml services: + # ... + webserver: + environment: + - PAPERLESS_ENABLE_FLOWER + ports: + - 5555:5555 # (2)! # ... - webserver: - environment: - - PAPERLESS_ENABLE_FLOWER - ports: - - 5555:5555 # (2)! - # ... - volumes: - - /path/to/my/flowerconfig.py:/usr/src/paperless/src/paperless/flowerconfig.py:ro # (1)! + volumes: + - /path/to/my/flowerconfig.py:/usr/src/paperless/src/paperless/flowerconfig.py:ro # (1)! ``` 1. Note the `:ro` tag means the file will be mounted as read only. @@ -706,11 +714,11 @@ For example, using Docker Compose: ```yaml services: + # ... + webserver: # ... - webserver: - # ... - volumes: - - /path/to/my/scripts:/custom-cont-init.d:ro # (1)! + volumes: + - /path/to/my/scripts:/custom-cont-init.d:ro # (1)! ``` 1. Note the `:ro` tag means the folder will be mounted as read only. This is for extra security against changes @@ -763,18 +771,17 @@ Paperless is able to utilize barcodes for automatically performing some tasks. At this time, the library utilized for detection of barcodes supports the following types: -- AN-13/UPC-A -- UPC-E -- EAN-8 -- Code 128 -- Code 93 -- Code 39 -- Codabar -- Interleaved 2 of 5 -- QR Code -- SQ Code - -You may check for updates on the [zbar library homepage](https://github.com/mchehab/zbar). +- AN-13/UPC-A +- UPC-E +- EAN-8 +- Code 128 +- Code 93 +- Code 39 +- Codabar +- Interleaved 2 of 5 +- QR Code +- SQ Code + For usage in Paperless, the type of barcode does not matter, only the contents of it. For how to enable barcode usage, see [the configuration](configuration.md#barcodes). @@ -783,9 +790,17 @@ below. ### Document Splitting {#document-splitting} -When enabled, Paperless will look for a barcode with the configured value and create a new document -starting from the next page. The page with the barcode on it will _not_ be retained. It -is expected to be a page existing only for triggering the split. +If document splitting is enabled, Paperless splits _after_ a separator barcode by default. +This means: + +- any page containing the configured separator barcode starts a new document, starting with the **next** page +- pages containing the separator barcode are discarded + +This is intended for dedicated separator sheets such as PATCH-T pages. + +If [`PAPERLESS_CONSUMER_BARCODE_RETAIN_SPLIT_PAGES`](configuration.md#PAPERLESS_CONSUMER_BARCODE_RETAIN_SPLIT_PAGES) +is enabled, the page containing the separator barcode is retained instead. In this mode, +each page containing the separator barcode becomes the **first** page of a new document. ### Archive Serial Number Assignment @@ -794,8 +809,9 @@ archive serial number, allowing quick reference back to the original, paper docu If document splitting via barcode is also enabled, documents will be split when an ASN barcode is located. However, differing from the splitting, the page with the -barcode _will_ be retained. This allows application of a barcode to any page, including -one which holds data to keep in the document. +barcode _will_ be retained. Each detected ASN barcode starts a new document _starting with +that page_. This allows placing ASN barcodes on content pages that should remain part of +the document. ### Tag Assignment @@ -805,6 +821,27 @@ See the relevant settings [`PAPERLESS_CONSUMER_ENABLE_TAG_BARCODE`](configuratio and [`PAPERLESS_CONSUMER_TAG_BARCODE_MAPPING`](configuration.md#PAPERLESS_CONSUMER_TAG_BARCODE_MAPPING) for more information. +#### Splitting on Tag Barcodes + +By default, tag barcodes only assign tags to documents without splitting them. However, +you can enable document splitting on tag barcodes by setting +[`PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT`](configuration.md#PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT) +to `true`. + +When enabled, documents will be split at pages containing tag barcodes, similar to how +ASN barcodes work. Key features: + +- The page with the tag barcode is **retained** in the resulting document +- **Each split document extracts its own tags** - only tags on pages within that document are assigned +- Multiple tag barcodes can trigger multiple splits in the same document +- Works seamlessly with ASN barcodes - each split document gets its own ASN and tags + +This is useful for batch scanning where you place tag barcode pages between different +documents to both separate and categorize them in a single operation. + +**Example:** A 6-page scan with TAG:invoice on page 3 and TAG:receipt on page 5 will create +three documents: pages 1-2 (no tags), pages 3-4 (tagged "invoice"), and pages 5-6 (tagged "receipt"). + ## Automatic collation of double-sided documents {#collate} !!! note @@ -851,8 +888,8 @@ followed by the even pages. It's important that the scan files get consumed in the correct order, and one at a time. You therefore need to make sure that Paperless is running while you upload the files into -the directory; and if you're using [polling](configuration.md#polling), make sure that -`CONSUMER_POLLING` is set to a value lower than it takes for the second scan to appear, +the directory; and if you're using polling, make sure that +`CONSUMER_POLLING_INTERVAL` is set to a value lower than it takes for the second scan to appear, like 5-10 or even lower. Another thing that might happen is that you start a double sided scan, but then forget @@ -959,9 +996,9 @@ If using docker, you'll need to add the following volume mounts to your `docker- ```yaml webserver: - volumes: - - /home/user/.gnupg/pubring.gpg:/usr/src/paperless/.gnupg/pubring.gpg - - :/usr/src/paperless/.gnupg/S.gpg-agent + volumes: + - /home/user/.gnupg/pubring.gpg:/usr/src/paperless/.gnupg/pubring.gpg + - :/usr/src/paperless/.gnupg/S.gpg-agent ``` For a 'bare-metal' installation no further configuration is necessary. If you @@ -969,9 +1006,9 @@ want to use a separate `GNUPG_HOME`, you can do so by configuring the [PAPERLESS ### Troubleshooting -- Make sure, that `gpg-agent` is running on your host machine -- Make sure, that encryption and decryption works from inside the container using the `gpg` commands from above. -- Check that all files in `/usr/src/paperless/.gnupg` have correct permissions +- Make sure, that `gpg-agent` is running on your host machine +- Make sure, that encryption and decryption works from inside the container using the `gpg` commands from above. +- Check that all files in `/usr/src/paperless/.gnupg` have correct permissions ```shell paperless@9da1865df327:~/.gnupg$ ls -al diff --git a/docs/api.md b/docs/api.md index f7e12bf67a..bd550c519e 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,4 +1,4 @@ -# The REST API +# REST API Paperless-ngx now ships with a fully-documented REST API and a browsable web interface to explore it. The API browsable interface is available at @@ -8,7 +8,7 @@ Further documentation is provided here for some endpoints and features. ## Authorization -The REST api provides four different forms of authentication. +The REST api provides five different forms of authentication. 1. Basic authentication @@ -52,16 +52,24 @@ The REST api provides four different forms of authentication. [configuration](configuration.md#PAPERLESS_ENABLE_HTTP_REMOTE_USER_API)), you can authenticate against the API using Remote User auth. +5. Headless OIDC via [`django-allauth`](https://codeberg.org/allauth/django-allauth) + + `django-allauth` exposes API endpoints under `api/auth/` which enable tools + like third-party apps to authenticate with social accounts that are + configured. See + [here](advanced_usage.md#openid-connect-and-social-authentication) for more + information on social accounts. + ## Searching for documents Full text searching is available on the `/api/documents/` endpoint. Two specific query parameters cause the API to return full text search results: -- `/api/documents/?query=your%20search%20query`: Search for a document - using a full text query. For details on the syntax, see [Basic Usage - Searching](usage.md#basic-usage_searching). -- `/api/documents/?more_like_id=1234`: Search for documents similar to - the document with id 1234. +- `/api/documents/?query=your%20search%20query`: Search for a document + using a full text query. For details on the syntax, see [Basic Usage - Searching](usage.md#basic-usage_searching). +- `/api/documents/?more_like_id=1234`: Search for documents similar to + the document with id 1234. Pagination works exactly the same as it does for normal requests on this endpoint. @@ -98,12 +106,12 @@ attribute with various information about the search results: } ``` -- `score` is an indication how well this document matches the query - relative to the other search results. -- `highlights` is an excerpt from the document content and highlights - the search terms with `` tags as shown above. -- `rank` is the index of the search results. The first result will - have rank 0. +- `score` is an indication how well this document matches the query + relative to the other search results. +- `highlights` is an excerpt from the document content and highlights + the search terms with `` tags as shown above. +- `rank` is the index of the search results. The first result will + have rank 0. ### Filtering by custom fields @@ -114,33 +122,33 @@ use cases: 1. Documents with a custom field "due" (date) between Aug 1, 2024 and Sept 1, 2024 (inclusive): - `?custom_field_query=["due", "range", ["2024-08-01", "2024-09-01"]]` + `?custom_field_query=["due", "range", ["2024-08-01", "2024-09-01"]]` 2. Documents with a custom field "customer" (text) that equals "bob" (case sensitive): - `?custom_field_query=["customer", "exact", "bob"]` + `?custom_field_query=["customer", "exact", "bob"]` 3. Documents with a custom field "answered" (boolean) set to `true`: - `?custom_field_query=["answered", "exact", true]` + `?custom_field_query=["answered", "exact", true]` 4. Documents with a custom field "favorite animal" (select) set to either "cat" or "dog": - `?custom_field_query=["favorite animal", "in", ["cat", "dog"]]` + `?custom_field_query=["favorite animal", "in", ["cat", "dog"]]` 5. Documents with a custom field "address" (text) that is empty: - `?custom_field_query=["OR", [["address", "isnull", true], ["address", "exact", ""]]]` + `?custom_field_query=["OR", [["address", "isnull", true], ["address", "exact", ""]]]` 6. Documents that don't have a field called "foo": - `?custom_field_query=["foo", "exists", false]` + `?custom_field_query=["foo", "exists", false]` 7. Documents that have document links "references" to both document 3 and 7: - `?custom_field_query=["references", "contains", [3, 7]]` + `?custom_field_query=["references", "contains", [3, 7]]` All field types support basic operations including `exact`, `in`, `isnull`, and `exists`. String, URL, and monetary fields support case-insensitive @@ -156,8 +164,8 @@ Get auto completions for a partial search term. Query parameters: -- `term`: The incomplete term. -- `limit`: Amount of results. Defaults to 10. +- `term`: The incomplete term. +- `limit`: Amount of results. Defaults to 10. Results returned by the endpoint are ordered by importance of the term in the document index. The first result is the term that has the highest @@ -181,19 +189,19 @@ from there. The endpoint supports the following optional form fields: -- `title`: Specify a title that the consumer should use for the - document. -- `created`: Specify a DateTime where the document was created (e.g. - "2016-04-19" or "2016-04-19 06:15:00+02:00"). -- `correspondent`: Specify the ID of a correspondent that the consumer - should use for the document. -- `document_type`: Similar to correspondent. -- `storage_path`: Similar to correspondent. -- `tags`: Similar to correspondent. Specify this multiple times to - have multiple tags added to the document. -- `archive_serial_number`: An optional archive serial number to set. -- `custom_fields`: Either an array of custom field ids to assign (with an empty - value) to the document or an object mapping field id -> value. +- `title`: Specify a title that the consumer should use for the + document. +- `created`: Specify a DateTime where the document was created (e.g. + "2016-04-19" or "2016-04-19 06:15:00+02:00"). +- `correspondent`: Specify the ID of a correspondent that the consumer + should use for the document. +- `document_type`: Similar to correspondent. +- `storage_path`: Similar to correspondent. +- `tags`: Similar to correspondent. Specify this multiple times to + have multiple tags added to the document. +- `archive_serial_number`: An optional archive serial number to set. +- `custom_fields`: Either an array of custom field ids to assign (with an empty + value) to the document or an object mapping field id -> value. The endpoint will immediately return HTTP 200 if the document consumption process was started successfully, with the UUID of the consumption task @@ -203,6 +211,21 @@ However, querying the tasks endpoint with the returned UUID e.g. `/api/tasks/?task_id={uuid}` will provide information on the state of the consumption including the ID of a created document if consumption succeeded. +## Document Versions + +Document versions are file-level versions linked to one root document. + +- Root document metadata (title, tags, correspondent, document type, storage path, custom fields, permissions) remains shared. +- Version-specific file data (file, mime type, checksums, archive info, extracted text content) belongs to the selected/latest version. + +Version-aware endpoints: + +- `GET /api/documents/{id}/`: returns root document data; `content` resolves to latest version content by default. Use `?version={version_id}` to resolve content for a specific version. +- `PATCH /api/documents/{id}/`: content updates target the selected version (`?version={version_id}`) or latest version by default; non-content metadata updates target the root document. +- `GET /api/documents/{id}/download/`, `GET /api/documents/{id}/preview/`, `GET /api/documents/{id}/thumb/`, `GET /api/documents/{id}/metadata/`: accept `?version={version_id}`. +- `POST /api/documents/{id}/update_version/`: uploads a new version using multipart form field `document` and optional `version_label`. +- `DELETE /api/documents/{root_id}/versions/{version_id}/`: deletes a non-root version. + ## Permissions All objects (documents, tags, etc.) allow setting object-level permissions @@ -259,67 +282,38 @@ a json payload of the format: The following methods are supported: -- `set_correspondent` - - Requires `parameters`: `{ "correspondent": CORRESPONDENT_ID }` -- `set_document_type` - - Requires `parameters`: `{ "document_type": DOCUMENT_TYPE_ID }` -- `set_storage_path` - - Requires `parameters`: `{ "storage_path": STORAGE_PATH_ID }` -- `add_tag` - - Requires `parameters`: `{ "tag": TAG_ID }` -- `remove_tag` - - Requires `parameters`: `{ "tag": TAG_ID }` -- `modify_tags` - - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and `{ "remove_tags": [LIST_OF_TAG_IDS] }` -- `delete` - - No `parameters` required -- `reprocess` - - No `parameters` required -- `set_permissions` - - Requires `parameters`: - - `"set_permissions": PERMISSIONS_OBJ` (see format [above](#permissions)) and / or - - `"owner": OWNER_ID or null` - - `"merge": true or false` (defaults to false) - - The `merge` flag determines if the supplied permissions will overwrite all existing permissions (including - removing them) or be merged with existing permissions. -- `edit_pdf` - - Requires `parameters`: - - `"doc_ids": [DOCUMENT_ID]` A list of a single document ID to edit. - - `"operations": [OPERATION, ...]` A list of operations to perform on the documents. Each operation is a dictionary - with the following keys: - - `"page": PAGE_NUMBER` The page number to edit (1-based). - - `"rotate": DEGREES` Optional rotation in degrees (90, 180, 270). - - `"doc": OUTPUT_DOCUMENT_INDEX` Optional index of the output document for split operations. - - Optional `parameters`: - - `"delete_original": true` to delete the original documents after editing. - - `"update_document": true` to update the existing document with the edited PDF. - - `"include_metadata": true` to copy metadata from the original document to the edited document. -- `merge` - - No additional `parameters` required. - - The ordering of the merged document is determined by the list of IDs. - - Optional `parameters`: - - `"metadata_document_id": DOC_ID` apply metadata (tags, correspondent, etc.) from this document to the merged document. - - `"delete_originals": true` to delete the original documents. This requires the calling user being the owner of - all documents that are merged. -- `split` - - Requires `parameters`: - - `"pages": [..]` The list should be a list of pages and/or a ranges, separated by commas e.g. `"[1,2-3,4,5-7]"` - - Optional `parameters`: - - `"delete_originals": true` to delete the original document after consumption. This requires the calling user being the owner of - the document. - - The split operation only accepts a single document. -- `rotate` - - Requires `parameters`: - - `"degrees": DEGREES`. Must be an integer i.e. 90, 180, 270 -- `delete_pages` - - Requires `parameters`: - - `"pages": [..]` The list should be a list of integers e.g. `"[2,3,4]"` - - The delete_pages operation only accepts a single document. -- `modify_custom_fields` - - Requires `parameters`: - - `"add_custom_fields": { CUSTOM_FIELD_ID: VALUE }`: JSON object consisting of custom field id:value pairs to add to the document, can also be a list of custom field IDs - to add with empty values. - - `"remove_custom_fields": [CUSTOM_FIELD_ID]`: custom field ids to remove from the document. +- `set_correspondent` + - Requires `parameters`: `{ "correspondent": CORRESPONDENT_ID }` +- `set_document_type` + - Requires `parameters`: `{ "document_type": DOCUMENT_TYPE_ID }` +- `set_storage_path` + - Requires `parameters`: `{ "storage_path": STORAGE_PATH_ID }` +- `add_tag` + - Requires `parameters`: `{ "tag": TAG_ID }` +- `remove_tag` + - Requires `parameters`: `{ "tag": TAG_ID }` +- `modify_tags` + - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and `{ "remove_tags": [LIST_OF_TAG_IDS] }` +- `delete` + - No `parameters` required +- `reprocess` + - No `parameters` required +- `set_permissions` + - Requires `parameters`: + - `"set_permissions": PERMISSIONS_OBJ` (see format [above](#permissions)) and / or + - `"owner": OWNER_ID or null` + - `"merge": true or false` (defaults to false) + - The `merge` flag determines if the supplied permissions will overwrite all existing permissions (including + removing them) or be merged with existing permissions. +- `modify_custom_fields` + - Requires `parameters`: + - `"add_custom_fields": { CUSTOM_FIELD_ID: VALUE }`: JSON object consisting of custom field id:value pairs to add to the document, can also be a list of custom field IDs + to add with empty values. + - `"remove_custom_fields": [CUSTOM_FIELD_ID]`: custom field ids to remove from the document. + +#### Document-editing operations + +Beginning with version 10+, the API supports individual endpoints for document-editing operations (`merge`, `rotate`, `edit_pdf`, etc), thus their documentation can be found in the API spec / viewer. Legacy document-editing methods via `/api/documents/bulk_edit/` are still supported for compatibility, are deprecated and clients should migrate to the individual endpoints before they are removed in a future version. ### Objects @@ -339,41 +333,38 @@ operations, using the endpoint: `/api/bulk_edit_objects/`, which requires a json ## API Versioning -The REST API is versioned since Paperless-ngx 1.3.0. +The REST API is versioned. -- Versioning ensures that changes to the API don't break older - clients. -- Clients specify the specific version of the API they wish to use - with every request and Paperless will handle the request using the - specified API version. -- Even if the underlying data model changes, older API versions will - always serve compatible data. -- If no version is specified, Paperless will serve version 1 to ensure - compatibility with older clients that do not request a specific API - version. +- Versioning ensures that changes to the API don't break older + clients. +- Clients specify the specific version of the API they wish to use + with every request and Paperless will handle the request using the + specified API version. +- Even if the underlying data model changes, supported older API + versions continue to serve compatible data. +- If no version is specified, Paperless serves the configured default + API version (currently `10`). +- Supported API versions are currently `9` and `10`. API versions are specified by submitting an additional HTTP `Accept` header with every request: ``` -Accept: application/json; version=6 +Accept: application/json; version=10 ``` -If an invalid version is specified, Paperless 1.3.0 will respond with -"406 Not Acceptable" and an error message in the body. Earlier -versions of Paperless will serve API version 1 regardless of whether a -version is specified via the `Accept` header. +If an invalid version is specified, Paperless responds with +`406 Not Acceptable` and an error message in the body. If a client wishes to verify whether it is compatible with any given server, the following procedure should be performed: -1. Perform an _authenticated_ request against any API endpoint. If the - server is on version 1.3.0 or newer, the server will add two custom - headers to the response: +1. Perform an _authenticated_ request against any API endpoint. The + server will add two custom headers to the response: ``` - X-Api-Version: 2 - X-Version: 1.3.0 + X-Api-Version: 10 + X-Version: ``` 2. Determine whether the client is compatible with this server based on @@ -393,46 +384,56 @@ Initial API version. #### Version 2 -- Added field `Tag.color`. This read/write string field contains a hex - color such as `#a6cee3`. -- Added read-only field `Tag.text_color`. This field contains the text - color to use for a specific tag, which is either black or white - depending on the brightness of `Tag.color`. -- Removed field `Tag.colour`. +- Added field `Tag.color`. This read/write string field contains a hex + color such as `#a6cee3`. +- Added read-only field `Tag.text_color`. This field contains the text + color to use for a specific tag, which is either black or white + depending on the brightness of `Tag.color`. +- Removed field `Tag.colour`. #### Version 3 -- Permissions endpoints have been added. -- The format of the `/api/ui_settings/` has changed. +- Permissions endpoints have been added. +- The format of the `/api/ui_settings/` has changed. #### Version 4 -- Consumption templates were refactored to workflows and API endpoints - changed as such. +- Consumption templates were refactored to workflows and API endpoints + changed as such. #### Version 5 -- Added bulk deletion methods for documents and objects. +- Added bulk deletion methods for documents and objects. #### Version 6 -- Moved acknowledge tasks endpoint to be under `/api/tasks/acknowledge/`. +- Moved acknowledge tasks endpoint to be under `/api/tasks/acknowledge/`. #### Version 7 -- The format of select type custom fields has changed to return the options - as an array of objects with `id` and `label` fields as opposed to a simple - list of strings. When creating or updating a custom field value of a - document for a select type custom field, the value should be the `id` of - the option whereas previously was the index of the option. +- The format of select type custom fields has changed to return the options + as an array of objects with `id` and `label` fields as opposed to a simple + list of strings. When creating or updating a custom field value of a + document for a select type custom field, the value should be the `id` of + the option whereas previously was the index of the option. #### Version 8 -- The user field of document notes now returns a simplified user object - rather than just the user ID. +- The user field of document notes now returns a simplified user object + rather than just the user ID. #### Version 9 -- The document `created` field is now a date, not a datetime. The - `created_date` field is considered deprecated and will be removed in a - future version. +- The document `created` field is now a date, not a datetime. The + `created_date` field is considered deprecated and will be removed in a + future version. + +#### Version 10 + +- The `show_on_dashboard` and `show_in_sidebar` fields of saved views have been + removed. Relevant settings are now stored in the UISettings model. Compatibility is maintained + for versions < 10 until support for API v9 is dropped. +- Document-editing operations such as `merge`, `rotate`, and `edit_pdf` have been + moved from the bulk edit endpoint to their own individual endpoints. Using these methods via + the bulk edit endpoint is still supported for compatibility with versions < 10 until support + for API v9 is dropped. diff --git a/docs/assets/extra.css b/docs/assets/extra.css index 270c1a2197..c93e467fd8 100644 --- a/docs/assets/extra.css +++ b/docs/assets/extra.css @@ -1,13 +1,31 @@ -:root > * { - --md-primary-fg-color: #17541f; - --md-primary-fg-color--dark: #17541f; - --md-primary-fg-color--light: #17541f; - --md-accent-fg-color: #2b8a38; +:root>* { + --paperless-green: #17541f; + --paperless-green-accent: #2b8a38; + --md-primary-fg-color: var(--paperless-green); + --md-primary-fg-color--dark: var(--paperless-green); + --md-primary-fg-color--light: var(--paperless-green-accent); + --md-accent-fg-color: var(--paperless-green-accent); --md-typeset-a-color: #21652a; } +.md-header, +.md-tabs { + background-color: var(--paperless-green); + color: #fff; +} + +.md-tabs__link { + color: rgba(255, 255, 255, 0.82); +} + +.md-tabs__link:hover, +.md-tabs__link--active { + color: #fff; +} + [data-md-color-scheme="slate"] { --md-hue: 222; + --md-default-bg-color: hsla(var(--md-hue), 15%, 10%, 1); } @media (min-width: 768px) { @@ -69,8 +87,8 @@ h4 code { } /* Hide config vars from sidebar, toc and move the border on mobile case their hidden */ -.md-nav.md-nav--secondary .md-nav__item .md-nav__link[href*="PAPERLESS_"], -.md-nav.md-nav--secondary .md-nav__item .md-nav__link[href*="USERMAP_"] { +.md-nav.md-nav--secondary .md-nav__item:has(> .md-nav__link[href*="PAPERLESS_"]), +.md-nav.md-nav--secondary .md-nav__item:has(> .md-nav__link[href*="USERMAP_"]) { display: none; } @@ -83,18 +101,3 @@ h4 code { border-top: .05rem solid var(--md-default-fg-color--lightest); } } - -/* Show search shortcut key */ -[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__form::after { - position: absolute; - top: .3rem; - right: .3rem; - display: block; - padding: .1rem .4rem; - color: var(--md-default-fg-color--lighter); - font-weight: bold; - font-size: .8rem; - border: .05rem solid var(--md-default-fg-color--lighter); - border-radius: .1rem; - content: "/"; - } diff --git a/docs/assets/logo_full_black.png b/docs/assets/logo_full_black.png new file mode 100644 index 0000000000..5055c20980 Binary files /dev/null and b/docs/assets/logo_full_black.png differ diff --git a/docs/assets/logo_full_white.png b/docs/assets/logo_full_white.png new file mode 100644 index 0000000000..d32a9a9961 Binary files /dev/null and b/docs/assets/logo_full_white.png differ diff --git a/docs/changelog.md b/docs/changelog.md index 296d30f7a9..569e30e29c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,172 +1,566 @@ # Changelog +## paperless-ngx 2.20.11 + +### Security + +- Resolve [GHSA-59xh-5vwx-4c4q](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-59xh-5vwx-4c4q) + +### Bug Fixes + +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) + +### All App Changes + +
+4 changes + +- Fix: correct dropdown list active color in dark mode [@shamoon](https://github.com/shamoon) ([#12328](https://github.com/paperless-ngx/paperless-ngx/pull/12328)) +- Fixhancement: clear descendant selections in dropdown when parent toggled [@shamoon](https://github.com/shamoon) ([#12326](https://github.com/paperless-ngx/paperless-ngx/pull/12326)) +- Fix: prevent wrapping with larger amounts of tags on small cards, reset moreTags setting to correct count [@shamoon](https://github.com/shamoon) ([#12302](https://github.com/paperless-ngx/paperless-ngx/pull/12302)) +- Fix: prevent stale db filename during workflow actions [@shamoon](https://github.com/shamoon) ([#12289](https://github.com/paperless-ngx/paperless-ngx/pull/12289)) +
+ +## paperless-ngx 2.20.10 + +### Bug Fixes + +- Fix: support string coercion in filepath jinja templates [@shamoon](https://github.com/shamoon) ([#12244](https://github.com/paperless-ngx/paperless-ngx/pull/12244)) +- Fix: apply ordering after annotating tag document count [@shamoon](https://github.com/shamoon) ([#12238](https://github.com/paperless-ngx/paperless-ngx/pull/12238)) +- Fix: enforce path limit for db filename fields [@shamoon](https://github.com/shamoon) ([#12235](https://github.com/paperless-ngx/paperless-ngx/pull/12235)) + +### All App Changes + +
+3 changes + +- Fix: support string coercion in filepath jinja templates [@shamoon](https://github.com/shamoon) ([#12244](https://github.com/paperless-ngx/paperless-ngx/pull/12244)) +- Fix: apply ordering after annotating tag document count [@shamoon](https://github.com/shamoon) ([#12238](https://github.com/paperless-ngx/paperless-ngx/pull/12238)) +- Fix: enforce path limit for db filename fields [@shamoon](https://github.com/shamoon) ([#12235](https://github.com/paperless-ngx/paperless-ngx/pull/12235)) +
+ +## paperless-ngx 2.20.9 + +### Security + +- Resolve [GHSA-386h-chg4-cfw9](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-386h-chg4-cfw9) + +### Bug Fixes + +- Fixhancement: config option reset [@shamoon](https://github.com/shamoon) ([#12176](https://github.com/paperless-ngx/paperless-ngx/pull/12176)) +- Fix: correct page count by separating display vs collection sizes for tags [@shamoon](https://github.com/shamoon) ([#12170](https://github.com/paperless-ngx/paperless-ngx/pull/12170)) + +### All App Changes + +
+2 changes + +- Fixhancement: config option reset [@shamoon](https://github.com/shamoon) ([#12176](https://github.com/paperless-ngx/paperless-ngx/pull/12176)) +- Fix: correct page count by separating display vs collection sizes for tags [@shamoon](https://github.com/shamoon) ([#12170](https://github.com/paperless-ngx/paperless-ngx/pull/12170)) +
+ +## paperless-ngx 2.20.8 + +### Security + +- Resolve [GHSA-7qqc-wrcw-2fj9](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-7qqc-wrcw-2fj9) + +## paperless-ngx 2.20.7 + +### Security + +- Resolve [GHSA-x395-6h48-wr8v](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-x395-6h48-wr8v) + +### Bug Fixes + +- Performance fix: use subqueries to improve object retrieval in large installs [@shamoon](https://github.com/shamoon) ([#11950](https://github.com/paperless-ngx/paperless-ngx/pull/11950)) +- Fix: correct user dropdown button icon styling [@shamoon](https://github.com/shamoon) ([#12092](https://github.com/paperless-ngx/paperless-ngx/issues/12092)) +- Fix: fix broken docker create_classifier command in 2.20.6 [@shamoon](https://github.com/shamoon) ([#11965](https://github.com/paperless-ngx/paperless-ngx/issues/11965)) + +### All App Changes + +
+3 changes + +- Performance fix: use subqueries to improve object retrieval in large installs [@shamoon](https://github.com/shamoon) ([#11950](https://github.com/paperless-ngx/paperless-ngx/pull/11950)) +- Fix: correct user dropdown button icon styling [@shamoon](https://github.com/shamoon) ([#12092](https://github.com/paperless-ngx/paperless-ngx/issues/12092)) +- Fix: fix broken docker create_classifier command in 2.20.6 [@shamoon](https://github.com/shamoon) ([#11965](https://github.com/paperless-ngx/paperless-ngx/issues/11965)) +
+ +## paperless-ngx 2.20.6 + +### Security + +- Resolve [GHSA-jqwv-hx7q-fxh3](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-jqwv-hx7q-fxh3) and [GHSA-w47q-3m69-84v8](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-w47q-3m69-84v8) + +### Bug Fixes + +- Fix: extract all ids for nested tags [@shamoon](https://github.com/shamoon) ([#11888](https://github.com/paperless-ngx/paperless-ngx/pull/11888)) +- Fixhancement: change date calculation for 'this year' to include future documents [@shamoon](https://github.com/shamoon) ([#11884](https://github.com/paperless-ngx/paperless-ngx/pull/11884)) +- Fix: Running management scripts under rootless could fail [@stumpylog](https://github.com/stumpylog) ([#11870](https://github.com/paperless-ngx/paperless-ngx/pull/11870)) +- Fix: use correct field id for overrides [@shamoon](https://github.com/shamoon) ([#11869](https://github.com/paperless-ngx/paperless-ngx/pull/11869)) + +### All App Changes + +
+3 changes + +- Fix: extract all ids for nested tags [@shamoon](https://github.com/shamoon) ([#11888](https://github.com/paperless-ngx/paperless-ngx/pull/11888)) +- Fixhancement: change date calculation for 'this year' to include future documents [@shamoon](https://github.com/shamoon) ([#11884](https://github.com/paperless-ngx/paperless-ngx/pull/11884)) +- Fix: use correct field id for overrides [@shamoon](https://github.com/shamoon) ([#11869](https://github.com/paperless-ngx/paperless-ngx/pull/11869)) +
+ +## paperless-ngx 2.20.5 + +### Bug Fixes + +- Fix: ensure horizontal scroll for long tag names in list, wrap tags without parent [@shamoon](https://github.com/shamoon) ([#11811](https://github.com/paperless-ngx/paperless-ngx/pull/11811)) +- Fix: use explicit order field for workflow actions [@shamoon](https://github.com/shamoon) [@stumpylog](https://github.com/stumpylog) ([#11781](https://github.com/paperless-ngx/paperless-ngx/pull/11781)) + +### All App Changes + +
+2 changes + +- Fix: ensure horizontal scroll for long tag names in list, wrap tags without parent [@shamoon](https://github.com/shamoon) ([#11811](https://github.com/paperless-ngx/paperless-ngx/pull/11811)) +- Fix: use explicit order field for workflow actions [@shamoon](https://github.com/shamoon) [@stumpylog](https://github.com/stumpylog) ([#11781](https://github.com/paperless-ngx/paperless-ngx/pull/11781)) +
+ +## paperless-ngx 2.20.4 + +### Security + +- Resolve [GHSA-28cf-xvcf-hw6m](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-28cf-xvcf-hw6m) + +### Bug Fixes + +- Fix: propagate metadata override created value [@shamoon](https://github.com/shamoon) ([#11659](https://github.com/paperless-ngx/paperless-ngx/pull/11659)) +- Fix: support ordering by storage path name [@shamoon](https://github.com/shamoon) ([#11661](https://github.com/paperless-ngx/paperless-ngx/pull/11661)) +- Fix: validate cf integer values within PostgreSQL range [@shamoon](https://github.com/shamoon) ([#11666](https://github.com/paperless-ngx/paperless-ngx/pull/11666)) +- Fixhancement: add error handling and retry when opening index [@shamoon](https://github.com/shamoon) ([#11731](https://github.com/paperless-ngx/paperless-ngx/pull/11731)) +- Fix: fix recurring workflow to respect latest run time [@shamoon](https://github.com/shamoon) ([#11735](https://github.com/paperless-ngx/paperless-ngx/pull/11735)) + +### All App Changes + +
+5 changes + +- Fix: propagate metadata override created value [@shamoon](https://github.com/shamoon) ([#11659](https://github.com/paperless-ngx/paperless-ngx/pull/11659)) +- Fix: support ordering by storage path name [@shamoon](https://github.com/shamoon) ([#11661](https://github.com/paperless-ngx/paperless-ngx/pull/11661)) +- Fix: validate cf integer values within PostgreSQL range [@shamoon](https://github.com/shamoon) ([#11666](https://github.com/paperless-ngx/paperless-ngx/pull/11666)) +- Fixhancement: add error handling and retry when opening index [@shamoon](https://github.com/shamoon) ([#11731](https://github.com/paperless-ngx/paperless-ngx/pull/11731)) +- Fix: fix recurring workflow to respect latest run time [@shamoon](https://github.com/shamoon) ([#11735](https://github.com/paperless-ngx/paperless-ngx/pull/11735)) +
+ +## paperless-ngx 2.20.3 + +### Security + +- Resolve [GHSA-7cq3-mhxq-w946](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-7cq3-mhxq-w946) + +## paperless-ngx 2.20.2 + +### Security + +- Resolve [GHSA-6653-vcx4-69mc](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-6653-vcx4-69mc) +- Resolve [GHSA-24x5-wp64-9fcc](https://github.com/paperless-ngx/paperless-ngx/security/advisories/GHSA-24x5-wp64-9fcc) + +### Features / Enhancements + +- Tweakhancement: dim inactive users in users-groups list [@shamoon](https://github.com/shamoon) ([#11537](https://github.com/paperless-ngx/paperless-ngx/pull/11537)) + +### Bug Fixes + +- Fix: Expanded SVG validation whitelist and additional checks [@stumpylog](https://github.com/stumpylog) ([#11590](https://github.com/paperless-ngx/paperless-ngx/pull/11590)) +- Fix: normalize allowed SVG tag and attribute names, add version [@shamoon](https://github.com/shamoon) ([#11586](https://github.com/paperless-ngx/paperless-ngx/pull/11586)) +- Fix: pass additional arguments to TagSerializer for permissions [@shamoon](https://github.com/shamoon) ([#11576](https://github.com/paperless-ngx/paperless-ngx/pull/11576)) + +### Maintenance + +- Chore(deps): Bump actions/checkout from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#11515](https://github.com/paperless-ngx/paperless-ngx/pull/11515)) + +### Dependencies + +
+6 changes + +- Chore: update Angular dependencies to 20.3.15 [@shamoon](https://github.com/shamoon) ([#11568](https://github.com/paperless-ngx/paperless-ngx/pull/11568)) +- Chore(deps): Bump actions/checkout from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#11515](https://github.com/paperless-ngx/paperless-ngx/pull/11515)) +- Chore(deps-dev): Bump webpack from 5.102.1 to 5.103.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11513](https://github.com/paperless-ngx/paperless-ngx/pull/11513)) +- Chore(deps-dev): Bump @playwright/test from 1.56.1 to 1.57.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11514](https://github.com/paperless-ngx/paperless-ngx/pull/11514)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11512](https://github.com/paperless-ngx/paperless-ngx/pull/11512)) +- docker(deps): bump astral-sh/uv from 0.9.14-python3.12-trixie-slim to 0.9.15-python3.12-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11533](https://github.com/paperless-ngx/paperless-ngx/pull/11533)) +
+ +### All App Changes + +
+12 changes + +- Fix: Expanded SVG validation whitelist and additional checks [@stumpylog](https://github.com/stumpylog) ([#11590](https://github.com/paperless-ngx/paperless-ngx/pull/11590)) +- Fixhancement: pass ordering to tag children [@shamoon](https://github.com/shamoon) ([#11556](https://github.com/paperless-ngx/paperless-ngx/pull/11556)) +- Performance: avoid unnecessary filename operations on bulk custom field updates [@shamoon](https://github.com/shamoon) ([#11558](https://github.com/paperless-ngx/paperless-ngx/pull/11558)) +- Fix: normalize allowed SVG tag and attribute names, add version [@shamoon](https://github.com/shamoon) ([#11586](https://github.com/paperless-ngx/paperless-ngx/pull/11586)) +- Chore: refactor workflows code [@shamoon](https://github.com/shamoon) ([#11563](https://github.com/paperless-ngx/paperless-ngx/pull/11563)) +- Fix: pass additional arguments to TagSerializer for permissions [@shamoon](https://github.com/shamoon) ([#11576](https://github.com/paperless-ngx/paperless-ngx/pull/11576)) +- Chore: update Angular dependencies to 20.3.15 [@shamoon](https://github.com/shamoon) ([#11568](https://github.com/paperless-ngx/paperless-ngx/pull/11568)) +- Chore(deps-dev): Bump webpack from 5.102.1 to 5.103.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11513](https://github.com/paperless-ngx/paperless-ngx/pull/11513)) +- Chore(deps-dev): Bump @playwright/test from 1.56.1 to 1.57.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11514](https://github.com/paperless-ngx/paperless-ngx/pull/11514)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11512](https://github.com/paperless-ngx/paperless-ngx/pull/11512)) +- Tweakhancement: dim inactive users in users-groups list [@shamoon](https://github.com/shamoon) ([#11537](https://github.com/paperless-ngx/paperless-ngx/pull/11537)) +- Chore: add some output of social login errors [@shamoon](https://github.com/shamoon) ([#11527](https://github.com/paperless-ngx/paperless-ngx/pull/11527)) +
+ +## paperless-ngx 2.20.1 + +### Bug Fixes + +- Fix: set search term when using advanced search from global search [@shamoon](https://github.com/shamoon) ([#11503](https://github.com/paperless-ngx/paperless-ngx/pull/11503)) +- Fix: change async handling of select custom field updates [@shamoon](https://github.com/shamoon) ([#11490](https://github.com/paperless-ngx/paperless-ngx/pull/11490)) +- Fix: skip SSL for MariaDB ping in init script [@danielrheinbay](https://github.com/danielrheinbay) ([#11491](https://github.com/paperless-ngx/paperless-ngx/pull/11491)) +- Fix: handle allauth groups location breaking change [@shamoon](https://github.com/shamoon) ([#11471](https://github.com/paperless-ngx/paperless-ngx/pull/11471)) + +### Dependencies + +- docker(deps): Bump astral-sh/uv from 0.9.10-python3.12-trixie-slim to 0.9.11-python3.12-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11450](https://github.com/paperless-ngx/paperless-ngx/pull/11450)) +- Chore(deps): Bump @angular/common from 20.3.12 to 20.3.14 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11481](https://github.com/paperless-ngx/paperless-ngx/pull/11481)) + +### All App Changes + +
+4 changes + +- Fix: set search term when using advanced search from global search [@shamoon](https://github.com/shamoon) ([#11503](https://github.com/paperless-ngx/paperless-ngx/pull/11503)) +- Fix: change async handling of select custom field updates [@shamoon](https://github.com/shamoon) ([#11490](https://github.com/paperless-ngx/paperless-ngx/pull/11490)) +- Chore(deps): Bump @angular/common from 20.3.12 to 20.3.14 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11481](https://github.com/paperless-ngx/paperless-ngx/pull/11481)) +- Fix: handle allauth groups location breaking change [@shamoon](https://github.com/shamoon) ([#11471](https://github.com/paperless-ngx/paperless-ngx/pull/11471)) +
+ +## paperless-ngx 2.20.0 + +### Notable Changes + +- Feature: Upgrade underlying Docker image to Trixie [@stumpylog](https://github.com/stumpylog) ([#10562](https://github.com/paperless-ngx/paperless-ngx/pull/10562)) + +### Features / Enhancements + +- Feature: Upgrade underlying Docker image to Trixie [@stumpylog](https://github.com/stumpylog) ([#10562](https://github.com/paperless-ngx/paperless-ngx/pull/10562)) +- Fixhancement: more log viewer improvements [@shamoon](https://github.com/shamoon) ([#11426](https://github.com/paperless-ngx/paperless-ngx/pull/11426)) +- Performance: Replace duplicated static files with symlinks [@stumpylog](https://github.com/stumpylog) ([#11418](https://github.com/paperless-ngx/paperless-ngx/pull/11418)) +- Enhancement: add more relative dates, support modified [@shamoon](https://github.com/shamoon) ([#11411](https://github.com/paperless-ngx/paperless-ngx/pull/11411)) +- Performance: make move files after select custom field change async [@shamoon](https://github.com/shamoon) ([#11391](https://github.com/paperless-ngx/paperless-ngx/pull/11391)) +- Enhancement: Use a better check for the MariaDB server to be ready [@stumpylog](https://github.com/stumpylog) ([#11396](https://github.com/paperless-ngx/paperless-ngx/pull/11396)) +- Enhancement: speed-up docker container startup [@flrgh](https://github.com/flrgh) ([#11134](https://github.com/paperless-ngx/paperless-ngx/pull/11134)) + +### Bug Fixes + +- Fix: prevent focus loss from change detection in cf query dropdown [@shamoon](https://github.com/shamoon) ([#11409](https://github.com/paperless-ngx/paperless-ngx/pull/11409)) +- Fix: sort editing filterable dropdowns sooner [@shamoon](https://github.com/shamoon) ([#11404](https://github.com/paperless-ngx/paperless-ngx/pull/11404)) +- Fix: support for custom field ordering w advanced search [@shamoon](https://github.com/shamoon) ([#11383](https://github.com/paperless-ngx/paperless-ngx/pull/11383)) + +### Maintenance + +- Chore(deps): Bump the actions group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11259](https://github.com/paperless-ngx/paperless-ngx/pull/11259)) + +### Dependencies + +
+16 changes + +- Chore: Upgrades psycopg to 3.2.12 [@stumpylog](https://github.com/stumpylog) ([#11420](https://github.com/paperless-ngx/paperless-ngx/pull/11420)) +- Chore(deps-dev): Bump glob from 10.4.1 to 10.5.0 in /src/paperless_mail/templates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11413](https://github.com/paperless-ngx/paperless-ngx/pull/11413)) +- docker-compose(deps): bump gotenberg/gotenberg from 8.24 to 8.25 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#11393](https://github.com/paperless-ngx/paperless-ngx/pull/11393)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11260](https://github.com/paperless-ngx/paperless-ngx/pull/11260)) +- Chore(deps-dev): Bump @playwright/test from 1.55.1 to 1.56.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11263](https://github.com/paperless-ngx/paperless-ngx/pull/11263)) +- Chore(deps-dev): Bump webpack from 5.102.0 to 5.102.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11264](https://github.com/paperless-ngx/paperless-ngx/pull/11264)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11262](https://github.com/paperless-ngx/paperless-ngx/pull/11262)) +- Chore(deps-dev): Bump jest-preset-angular from 15.0.2 to 15.0.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#11261](https://github.com/paperless-ngx/paperless-ngx/pull/11261)) +- Chore(deps-dev): Bump @types/node from 24.6.1 to 24.9.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11265](https://github.com/paperless-ngx/paperless-ngx/pull/11265)) +- Chore(deps): Bump the small-changes group across 1 directory with 11 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11337](https://github.com/paperless-ngx/paperless-ngx/pull/11337)) +- Chore(deps): Bump django-auditlog from 3.2.1 to 3.3.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11021](https://github.com/paperless-ngx/paperless-ngx/pull/11021)) +- Chore(deps): Bump the actions group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11259](https://github.com/paperless-ngx/paperless-ngx/pull/11259)) +- Chore(deps): Bump drf-spectacular-sidecar from 2025.9.1 to 2025.10.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11019](https://github.com/paperless-ngx/paperless-ngx/pull/11019)) +- Chore(deps): Bump django-filter from 25.1 to 25.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11020](https://github.com/paperless-ngx/paperless-ngx/pull/11020)) +- Chore(deps): Update django-allauth[mfa,socialaccount] requirement from ~=65.4.0 to ~=65.12.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11198](https://github.com/paperless-ngx/paperless-ngx/pull/11198)) +- docker(deps): bump astral-sh/uv from 0.9.9-python3.12-bookworm-slim to 0.9.10-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11394](https://github.com/paperless-ngx/paperless-ngx/pull/11394)) +
+ +### All App Changes + +
+19 changes + +- Fixhancement: more log viewer improvements [@shamoon](https://github.com/shamoon) ([#11426](https://github.com/paperless-ngx/paperless-ngx/pull/11426)) +- Chore: Upgrades psycopg to 3.2.12 [@stumpylog](https://github.com/stumpylog) ([#11420](https://github.com/paperless-ngx/paperless-ngx/pull/11420)) +- Enhancement: add more relative dates, support modified [@shamoon](https://github.com/shamoon) ([#11411](https://github.com/paperless-ngx/paperless-ngx/pull/11411)) +- Chore(deps-dev): Bump glob from 10.4.1 to 10.5.0 in /src/paperless_mail/templates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11413](https://github.com/paperless-ngx/paperless-ngx/pull/11413)) +- Performance: make move files after select custom field change async [@shamoon](https://github.com/shamoon) ([#11391](https://github.com/paperless-ngx/paperless-ngx/pull/11391)) +- Fix: prevent focus loss from change detection in cf query dropdown [@shamoon](https://github.com/shamoon) ([#11409](https://github.com/paperless-ngx/paperless-ngx/pull/11409)) +- Fix: sort editing filterable dropdowns sooner [@shamoon](https://github.com/shamoon) ([#11404](https://github.com/paperless-ngx/paperless-ngx/pull/11404)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11260](https://github.com/paperless-ngx/paperless-ngx/pull/11260)) +- Chore(deps-dev): Bump @playwright/test from 1.55.1 to 1.56.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11263](https://github.com/paperless-ngx/paperless-ngx/pull/11263)) +- Chore(deps-dev): Bump webpack from 5.102.0 to 5.102.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11264](https://github.com/paperless-ngx/paperless-ngx/pull/11264)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11262](https://github.com/paperless-ngx/paperless-ngx/pull/11262)) +- Chore(deps-dev): Bump jest-preset-angular from 15.0.2 to 15.0.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#11261](https://github.com/paperless-ngx/paperless-ngx/pull/11261)) +- Chore(deps-dev): Bump @types/node from 24.6.1 to 24.9.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#11265](https://github.com/paperless-ngx/paperless-ngx/pull/11265)) +- Chore(deps): Bump the small-changes group across 1 directory with 11 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11337](https://github.com/paperless-ngx/paperless-ngx/pull/11337)) +- Chore(deps): Bump django-auditlog from 3.2.1 to 3.3.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11021](https://github.com/paperless-ngx/paperless-ngx/pull/11021)) +- Chore(deps): Bump drf-spectacular-sidecar from 2025.9.1 to 2025.10.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11019](https://github.com/paperless-ngx/paperless-ngx/pull/11019)) +- Chore(deps): Bump django-filter from 25.1 to 25.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11020](https://github.com/paperless-ngx/paperless-ngx/pull/11020)) +- Chore(deps): Update django-allauth[mfa,socialaccount] requirement from ~=65.4.0 to ~=65.12.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11198](https://github.com/paperless-ngx/paperless-ngx/pull/11198)) +- Fix: support for custom field ordering w advanced search [@shamoon](https://github.com/shamoon) ([#11383](https://github.com/paperless-ngx/paperless-ngx/pull/11383)) +
+ +## paperless-ngx 2.19.6 + +### Bug Fixes + +- Chore: include password validation on user edit [@shamoon](https://github.com/shamoon) ([#11308](https://github.com/paperless-ngx/paperless-ngx/pull/11308)) +- Fix: include BASE_URL when constructing for workflows [@ebardsley](https://github.com/ebardsley) ([#11360](https://github.com/paperless-ngx/paperless-ngx/pull/11360)) +- Fixhancement: refactor email attachment logic [@shamoon](https://github.com/shamoon) ([#11336](https://github.com/paperless-ngx/paperless-ngx/pull/11336)) +- Fixhancement: trim whitespace for some text searches [@shamoon](https://github.com/shamoon) ([#11357](https://github.com/paperless-ngx/paperless-ngx/pull/11357)) +- Fix: update Outlook refresh token when refreshed [@shamoon](https://github.com/shamoon) ([#11341](https://github.com/paperless-ngx/paperless-ngx/pull/11341)) +- Fix: only cache remote version data for version checking [@shamoon](https://github.com/shamoon) ([#11320](https://github.com/paperless-ngx/paperless-ngx/pull/11320)) +- Fix: include replace none logic in storage path preview, improve jinja conditionals for empty metadata [@shamoon](https://github.com/shamoon) ([#11315](https://github.com/paperless-ngx/paperless-ngx/pull/11315)) + +### Dependencies + +- docker(deps): bump astral-sh/uv from 0.9.7-python3.12-bookworm-slim to 0.9.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11338](https://github.com/paperless-ngx/paperless-ngx/pull/11338)) + +### All App Changes + +
+7 changes + +- Fix: include BASE_URL when constructing for workflows [@ebardsley](https://github.com/ebardsley) ([#11360](https://github.com/paperless-ngx/paperless-ngx/pull/11360)) +- Fixhancement: refactor email attachment logic [@shamoon](https://github.com/shamoon) ([#11336](https://github.com/paperless-ngx/paperless-ngx/pull/11336)) +- Fixhancement: trim whitespace for some text searches [@shamoon](https://github.com/shamoon) ([#11357](https://github.com/paperless-ngx/paperless-ngx/pull/11357)) +- Fix: update Outlook refresh token when refreshed [@shamoon](https://github.com/shamoon) ([#11341](https://github.com/paperless-ngx/paperless-ngx/pull/11341)) +- Fix: only cache remote version data for version checking [@shamoon](https://github.com/shamoon) ([#11320](https://github.com/paperless-ngx/paperless-ngx/pull/11320)) +- Fix: include replace none logic in storage path preview, improve jinja conditionals for empty metadata [@shamoon](https://github.com/shamoon) ([#11315](https://github.com/paperless-ngx/paperless-ngx/pull/11315)) +- Chore: include password validation on user edit [@shamoon](https://github.com/shamoon) ([#11308](https://github.com/paperless-ngx/paperless-ngx/pull/11308)) +
+ +## paperless-ngx 2.19.5 + +### Bug Fixes + +- Fix: ensure custom field query propagation, change detection [@shamoon](https://github.com/shamoon) ([#11291](https://github.com/paperless-ngx/paperless-ngx/pull/11291)) + +### Dependencies + +- docker(deps): Bump astral-sh/uv from 0.9.4-python3.12-bookworm-slim to 0.9.7-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11283](https://github.com/paperless-ngx/paperless-ngx/pull/11283)) + +### All App Changes + +- Fix: ensure custom field query propagation, change detection [@shamoon](https://github.com/shamoon) ([#11291](https://github.com/paperless-ngx/paperless-ngx/pull/11291)) + +## paperless-ngx 2.19.4 + +### Bug Fixes + +- Fix: use original_file when attaching docs to workflow emails with added trigger [@shamoon](https://github.com/shamoon) ([#11266](https://github.com/paperless-ngx/paperless-ngx/pull/11266)) +- Fix: mark 'Select' button in doc list for translation [@shamoon](https://github.com/shamoon) ([#11278](https://github.com/paperless-ngx/paperless-ngx/pull/11278)) +- Fix: respect fields parameter for created field [@shamoon](https://github.com/shamoon) ([#11251](https://github.com/paperless-ngx/paperless-ngx/pull/11251)) +- Fix: improve legibility of processed mail error popover in light mode [@shamoon](https://github.com/shamoon) ([#11258](https://github.com/paperless-ngx/paperless-ngx/pull/11258)) +- Fixhancement: truncate large logs, improve auto-scroll [@shamoon](https://github.com/shamoon) ([#11239](https://github.com/paperless-ngx/paperless-ngx/pull/11239)) +- Chore: add max-height and overflow to processedmail error popover [@shamoon](https://github.com/shamoon) ([#11252](https://github.com/paperless-ngx/paperless-ngx/pull/11252)) +- Fix: delay iframe DOM removal, handle onafterprint error for print in FF [@shamoon](https://github.com/shamoon) ([#11237](https://github.com/paperless-ngx/paperless-ngx/pull/11237)) +- Fix: de-deduplicate children in tag list when filtering [@shamoon](https://github.com/shamoon) ([#11229](https://github.com/paperless-ngx/paperless-ngx/pull/11229)) + +### Performance + +- Performance: re-enable virtual scroll, bump ng-select [@shamoon](https://github.com/shamoon) ([#11279](https://github.com/paperless-ngx/paperless-ngx/pull/11279)) +- Performance: use virtual scroll container and log level parsing for logs view [@MickLesk](https://github.com/MickLesk) ([#11233](https://github.com/paperless-ngx/paperless-ngx/pull/11233)) + +### All App Changes + +
+11 changes + +- Performance: re-enable virtual scroll, bump ng-select [@shamoon](https://github.com/shamoon) ([#11279](https://github.com/paperless-ngx/paperless-ngx/pull/11279)) +- Fix: use original_file when attaching docs to workflow emails with added trigger [@shamoon](https://github.com/shamoon) ([#11266](https://github.com/paperless-ngx/paperless-ngx/pull/11266)) +- Fix: mark 'Select' button in doc list for translation [@shamoon](https://github.com/shamoon) ([#11278](https://github.com/paperless-ngx/paperless-ngx/pull/11278)) +- Fix: respect fields parameter for created field [@shamoon](https://github.com/shamoon) ([#11251](https://github.com/paperless-ngx/paperless-ngx/pull/11251)) +- Fix: improve legibility of processed mail error popover in light mode [@shamoon](https://github.com/shamoon) ([#11258](https://github.com/paperless-ngx/paperless-ngx/pull/11258)) +- Fixhancement: truncate large logs, improve auto-scroll [@shamoon](https://github.com/shamoon) ([#11239](https://github.com/paperless-ngx/paperless-ngx/pull/11239)) +- Chore: add max-height and overflow to processedmail error popover [@shamoon](https://github.com/shamoon) ([#11252](https://github.com/paperless-ngx/paperless-ngx/pull/11252)) +- Fix: delay iframe DOM removal, handle onafterprint error for print in FF [@shamoon](https://github.com/shamoon) ([#11237](https://github.com/paperless-ngx/paperless-ngx/pull/11237)) +- Performance: use virtual scroll container and log level parsing for logs view [@MickLesk](https://github.com/MickLesk) ([#11233](https://github.com/paperless-ngx/paperless-ngx/pull/11233)) +- Chore: cache Github version check for 15 minutes [@shamoon](https://github.com/shamoon) ([#11235](https://github.com/paperless-ngx/paperless-ngx/pull/11235)) +- Fix: de-deduplicate children in tag list when filtering [@shamoon](https://github.com/shamoon) ([#11229](https://github.com/paperless-ngx/paperless-ngx/pull/11229)) +
+ ## paperless-ngx 2.19.3 ### Bug Fixes -- Fix: remove unnecessary permission requirements for new email endpoint [@shamoon](https://github.com/shamoon) ([#11215](https://github.com/paperless-ngx/paperless-ngx/pull/11215)) -- Fix: refactor nested sorting in filterable dropdowns [@shamoon](https://github.com/shamoon) ([#11214](https://github.com/paperless-ngx/paperless-ngx/pull/11214)) -- Fix: add root tag filtering for tag list page consistency, fix toggle all [@shamoon](https://github.com/shamoon) ([#11208](https://github.com/paperless-ngx/paperless-ngx/pull/11208)) -- Fix: support ConsumableDocument in email attachments [@shamoon](https://github.com/shamoon) ([#11196](https://github.com/paperless-ngx/paperless-ngx/pull/11196)) -- Fix: add missing import for ConfirmButtonComponent in user-edit-dialog [@shamoon](https://github.com/shamoon) ([#11167](https://github.com/paperless-ngx/paperless-ngx/pull/11167)) -- Fix: resolve migration warning in 2.19.2 [@shamoon](https://github.com/shamoon) ([#11157](https://github.com/paperless-ngx/paperless-ngx/pull/11157)) +- Fix: remove unnecessary permission requirements for new email endpoint [@shamoon](https://github.com/shamoon) ([#11215](https://github.com/paperless-ngx/paperless-ngx/pull/11215)) +- Fix: refactor nested sorting in filterable dropdowns [@shamoon](https://github.com/shamoon) ([#11214](https://github.com/paperless-ngx/paperless-ngx/pull/11214)) +- Fix: add root tag filtering for tag list page consistency, fix toggle all [@shamoon](https://github.com/shamoon) ([#11208](https://github.com/paperless-ngx/paperless-ngx/pull/11208)) +- Fix: support ConsumableDocument in email attachments [@shamoon](https://github.com/shamoon) ([#11196](https://github.com/paperless-ngx/paperless-ngx/pull/11196)) +- Fix: add missing import for ConfirmButtonComponent in user-edit-dialog [@shamoon](https://github.com/shamoon) ([#11167](https://github.com/paperless-ngx/paperless-ngx/pull/11167)) +- Fix: resolve migration warning in 2.19.2 [@shamoon](https://github.com/shamoon) ([#11157](https://github.com/paperless-ngx/paperless-ngx/pull/11157)) ### Changes -- Change: make workflow action only title draggable [@shamoon](https://github.com/shamoon) ([#11209](https://github.com/paperless-ngx/paperless-ngx/pull/11209)) -- Change: change workflowrun to softdeletemodel [@shamoon](https://github.com/shamoon) ([#11194](https://github.com/paperless-ngx/paperless-ngx/pull/11194)) +- Change: make workflow action only title draggable [@shamoon](https://github.com/shamoon) ([#11209](https://github.com/paperless-ngx/paperless-ngx/pull/11209)) +- Change: change workflowrun to softdeletemodel [@shamoon](https://github.com/shamoon) ([#11194](https://github.com/paperless-ngx/paperless-ngx/pull/11194)) ### Dependencies -- Chore(deps): Bump django from 5.2.6 to 5.2.7 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11200](https://github.com/paperless-ngx/paperless-ngx/pull/11200)) +- Chore(deps): Bump django from 5.2.6 to 5.2.7 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11200](https://github.com/paperless-ngx/paperless-ngx/pull/11200)) ### All App Changes
9 changes -- Chore(deps): Bump django from 5.2.6 to 5.2.7 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11200](https://github.com/paperless-ngx/paperless-ngx/pull/11200)) -- Fix: remove unnecessary permission requirements for new email endpoint [@shamoon](https://github.com/shamoon) ([#11215](https://github.com/paperless-ngx/paperless-ngx/pull/11215)) -- Fix: refactor nested sorting in filterable dropdowns [@shamoon](https://github.com/shamoon) ([#11214](https://github.com/paperless-ngx/paperless-ngx/pull/11214)) -- Fix: add root tag filtering for tag list page consistency, fix toggle all [@shamoon](https://github.com/shamoon) ([#11208](https://github.com/paperless-ngx/paperless-ngx/pull/11208)) -- Change: make workflow action only title draggable [@shamoon](https://github.com/shamoon) ([#11209](https://github.com/paperless-ngx/paperless-ngx/pull/11209)) -- Change: change workflowrun to softdeletemodel [@shamoon](https://github.com/shamoon) ([#11194](https://github.com/paperless-ngx/paperless-ngx/pull/11194)) -- Chore: Minor migration optimization for workflow titles [@stumpylog](https://github.com/stumpylog) ([#11197](https://github.com/paperless-ngx/paperless-ngx/pull/11197)) -- Fix: support ConsumableDocument in email attachments [@shamoon](https://github.com/shamoon) ([#11196](https://github.com/paperless-ngx/paperless-ngx/pull/11196)) -- Fix: add missing import for ConfirmButtonComponent in user-edit-dialog [@shamoon](https://github.com/shamoon) ([#11167](https://github.com/paperless-ngx/paperless-ngx/pull/11167)) -- Fix: resolve migration warning in 2.19.2 [@shamoon](https://github.com/shamoon) ([#11157](https://github.com/paperless-ngx/paperless-ngx/pull/11157)) +- Chore(deps): Bump django from 5.2.6 to 5.2.7 @[dependabot[bot]](https://github.com/apps/dependabot) ([#11200](https://github.com/paperless-ngx/paperless-ngx/pull/11200)) +- Fix: remove unnecessary permission requirements for new email endpoint [@shamoon](https://github.com/shamoon) ([#11215](https://github.com/paperless-ngx/paperless-ngx/pull/11215)) +- Fix: refactor nested sorting in filterable dropdowns [@shamoon](https://github.com/shamoon) ([#11214](https://github.com/paperless-ngx/paperless-ngx/pull/11214)) +- Fix: add root tag filtering for tag list page consistency, fix toggle all [@shamoon](https://github.com/shamoon) ([#11208](https://github.com/paperless-ngx/paperless-ngx/pull/11208)) +- Change: make workflow action only title draggable [@shamoon](https://github.com/shamoon) ([#11209](https://github.com/paperless-ngx/paperless-ngx/pull/11209)) +- Change: change workflowrun to softdeletemodel [@shamoon](https://github.com/shamoon) ([#11194](https://github.com/paperless-ngx/paperless-ngx/pull/11194)) +- Chore: Minor migration optimization for workflow titles [@stumpylog](https://github.com/stumpylog) ([#11197](https://github.com/paperless-ngx/paperless-ngx/pull/11197)) +- Fix: support ConsumableDocument in email attachments [@shamoon](https://github.com/shamoon) ([#11196](https://github.com/paperless-ngx/paperless-ngx/pull/11196)) +- Fix: add missing import for ConfirmButtonComponent in user-edit-dialog [@shamoon](https://github.com/shamoon) ([#11167](https://github.com/paperless-ngx/paperless-ngx/pull/11167)) +- Fix: resolve migration warning in 2.19.2 [@shamoon](https://github.com/shamoon) ([#11157](https://github.com/paperless-ngx/paperless-ngx/pull/11157))
## paperless-ngx 2.19.2 ### Features / Enhancements -- Fixhancement: display loading status for tags instead of 'Private' [@shamoon](https://github.com/shamoon) ([#11140](https://github.com/paperless-ngx/paperless-ngx/pull/11140)) +- Fixhancement: display loading status for tags instead of 'Private' [@shamoon](https://github.com/shamoon) ([#11140](https://github.com/paperless-ngx/paperless-ngx/pull/11140)) ### Bug Fixes -- Fix: Remove edit requirement for bulk email, show based on setting [@shamoon](https://github.com/shamoon) ([#11149](https://github.com/paperless-ngx/paperless-ngx/pull/11149)) -- Fix: handle undefined IDs in getOriginalObject [@shamoon](https://github.com/shamoon) ([#11147](https://github.com/paperless-ngx/paperless-ngx/pull/11147)) +- Fix: Remove edit requirement for bulk email, show based on setting [@shamoon](https://github.com/shamoon) ([#11149](https://github.com/paperless-ngx/paperless-ngx/pull/11149)) +- Fix: handle undefined IDs in getOriginalObject [@shamoon](https://github.com/shamoon) ([#11147](https://github.com/paperless-ngx/paperless-ngx/pull/11147)) ### All App Changes
3 changes -- Fix: Remove edit requirement for bulk email, show based on setting [@shamoon](https://github.com/shamoon) ([#11149](https://github.com/paperless-ngx/paperless-ngx/pull/11149)) -- Fix: handle undefined IDs in getOriginalObject [@shamoon](https://github.com/shamoon) ([#11147](https://github.com/paperless-ngx/paperless-ngx/pull/11147)) -- Fixhancement: display loading status for tags instead of 'Private' [@shamoon](https://github.com/shamoon) ([#11140](https://github.com/paperless-ngx/paperless-ngx/pull/11140)) +- Fix: Remove edit requirement for bulk email, show based on setting [@shamoon](https://github.com/shamoon) ([#11149](https://github.com/paperless-ngx/paperless-ngx/pull/11149)) +- Fix: handle undefined IDs in getOriginalObject [@shamoon](https://github.com/shamoon) ([#11147](https://github.com/paperless-ngx/paperless-ngx/pull/11147)) +- Fixhancement: display loading status for tags instead of 'Private' [@shamoon](https://github.com/shamoon) ([#11140](https://github.com/paperless-ngx/paperless-ngx/pull/11140))
## paperless-ngx 2.19.1 ### Bug Fixes -- Fix: skip workflow title migration for empty titles [@shamoon](https://github.com/shamoon) ([#11136](https://github.com/paperless-ngx/paperless-ngx/pull/11136)) -- Fix: restore workflow title migration [@shamoon](https://github.com/shamoon) ([#11131](https://github.com/paperless-ngx/paperless-ngx/pull/11131)) -- Fix: retrieve document_count for tag children [@shamoon](https://github.com/shamoon) ([#11125](https://github.com/paperless-ngx/paperless-ngx/pull/11125)) -- Fix: move hierarchical order logic in dropdown sorting [@shamoon](https://github.com/shamoon) ([#11128](https://github.com/paperless-ngx/paperless-ngx/pull/11128)) -- Fix: use original object for children in tag list [@shamoon](https://github.com/shamoon) ([#11127](https://github.com/paperless-ngx/paperless-ngx/pull/11127)) -- Fix: dont display or fetch users or groups with insufficient perms [@shamoon](https://github.com/shamoon) ([#11111](https://github.com/paperless-ngx/paperless-ngx/pull/11111)) +- Fix: skip workflow title migration for empty titles [@shamoon](https://github.com/shamoon) ([#11136](https://github.com/paperless-ngx/paperless-ngx/pull/11136)) +- Fix: restore workflow title migration [@shamoon](https://github.com/shamoon) ([#11131](https://github.com/paperless-ngx/paperless-ngx/pull/11131)) +- Fix: retrieve document_count for tag children [@shamoon](https://github.com/shamoon) ([#11125](https://github.com/paperless-ngx/paperless-ngx/pull/11125)) +- Fix: move hierarchical order logic in dropdown sorting [@shamoon](https://github.com/shamoon) ([#11128](https://github.com/paperless-ngx/paperless-ngx/pull/11128)) +- Fix: use original object for children in tag list [@shamoon](https://github.com/shamoon) ([#11127](https://github.com/paperless-ngx/paperless-ngx/pull/11127)) +- Fix: dont display or fetch users or groups with insufficient perms [@shamoon](https://github.com/shamoon) ([#11111](https://github.com/paperless-ngx/paperless-ngx/pull/11111)) ### All App Changes
6 changes -- Fix: skip workflow title migration for empty titles [@shamoon](https://github.com/shamoon) ([#11136](https://github.com/paperless-ngx/paperless-ngx/pull/11136)) -- Fix: restore workflow title migration [@shamoon](https://github.com/shamoon) ([#11131](https://github.com/paperless-ngx/paperless-ngx/pull/11131)) -- Fix: retrieve document_count for tag children [@shamoon](https://github.com/shamoon) ([#11125](https://github.com/paperless-ngx/paperless-ngx/pull/11125)) -- Fix: move hierarchical order logic in dropdown sorting [@shamoon](https://github.com/shamoon) ([#11128](https://github.com/paperless-ngx/paperless-ngx/pull/11128)) -- Fix: use original object for children in tag list [@shamoon](https://github.com/shamoon) ([#11127](https://github.com/paperless-ngx/paperless-ngx/pull/11127)) -- Fix: dont display or fetch users or groups with insufficient perms [@shamoon](https://github.com/shamoon) ([#11111](https://github.com/paperless-ngx/paperless-ngx/pull/11111)) +- Fix: skip workflow title migration for empty titles [@shamoon](https://github.com/shamoon) ([#11136](https://github.com/paperless-ngx/paperless-ngx/pull/11136)) +- Fix: restore workflow title migration [@shamoon](https://github.com/shamoon) ([#11131](https://github.com/paperless-ngx/paperless-ngx/pull/11131)) +- Fix: retrieve document_count for tag children [@shamoon](https://github.com/shamoon) ([#11125](https://github.com/paperless-ngx/paperless-ngx/pull/11125)) +- Fix: move hierarchical order logic in dropdown sorting [@shamoon](https://github.com/shamoon) ([#11128](https://github.com/paperless-ngx/paperless-ngx/pull/11128)) +- Fix: use original object for children in tag list [@shamoon](https://github.com/shamoon) ([#11127](https://github.com/paperless-ngx/paperless-ngx/pull/11127)) +- Fix: dont display or fetch users or groups with insufficient perms [@shamoon](https://github.com/shamoon) ([#11111](https://github.com/paperless-ngx/paperless-ngx/pull/11111))
## paperless-ngx 2.19.0 ### Notable Changes -- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) -- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) +- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) +- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) ### Features / Enhancements -- docker(deps): bump astral-sh/uv from 0.9.2-python3.12-bookworm-slim to 0.9.4-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11091](https://github.com/paperless-ngx/paperless-ngx/pull/11091)) -- Enhancement: use friendly file names when emailing documents [@JanKleine](https://github.com/JanKleine) ([#11055](https://github.com/paperless-ngx/paperless-ngx/pull/11055)) -- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) -- docker(deps): Bump astral-sh/uv from 0.8.22-python3.12-bookworm-slim to 0.9.2-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11052](https://github.com/paperless-ngx/paperless-ngx/pull/11052)) -- Feature: add support for emailing multiple documents [@JanKleine](https://github.com/JanKleine) ([#10666](https://github.com/paperless-ngx/paperless-ngx/pull/10666)) -- Enhancement: ignore same files in sanity checker as consumer [@shamoon](https://github.com/shamoon) ([#10999](https://github.com/paperless-ngx/paperless-ngx/pull/10999)) -- Enhancement: open color picker on swatch button click [@shamoon](https://github.com/shamoon) ([#10994](https://github.com/paperless-ngx/paperless-ngx/pull/10994)) -- Performance: Cache django-guardian permissions when counting documents [@Merinorus](https://github.com/Merinorus) ([#10657](https://github.com/paperless-ngx/paperless-ngx/pull/10657)) -- Tweakhancement: reorganize some list \& bulk editing buttons [@shamoon](https://github.com/shamoon) ([#10944](https://github.com/paperless-ngx/paperless-ngx/pull/10944)) -- Enhancement: support workflow path matching of barcode-split documents [@DerRockWolf](https://github.com/DerRockWolf) ([#10723](https://github.com/paperless-ngx/paperless-ngx/pull/10723)) -- Feature: processed mail UI [@shamoon](https://github.com/shamoon) ([#10866](https://github.com/paperless-ngx/paperless-ngx/pull/10866)) -- Enhancement: support custom field values on post document [@shamoon](https://github.com/shamoon) ([#10859](https://github.com/paperless-ngx/paperless-ngx/pull/10859)) -- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) -- Enhancement: long text custom field [@jojo2357](https://github.com/jojo2357) ([#10846](https://github.com/paperless-ngx/paperless-ngx/pull/10846)) -- Enhancement: Add print button [@mpaletti](https://github.com/mpaletti) ([#10626](https://github.com/paperless-ngx/paperless-ngx/pull/10626)) -- Enhancement: add storage path as workflow trigger filter @david-loe ([#10771](https://github.com/paperless-ngx/paperless-ngx/pull/10771)) -- Enhancement: jinja template support for workflow title assignment [@sidey79](https://github.com/sidey79) ([#10700](https://github.com/paperless-ngx/paperless-ngx/pull/10700)) -- Enhancement: Limit excessively long content length when computing suggestions [@Merinorus](https://github.com/Merinorus) ([#10656](https://github.com/paperless-ngx/paperless-ngx/pull/10656)) +- docker(deps): bump astral-sh/uv from 0.9.2-python3.12-bookworm-slim to 0.9.4-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11091](https://github.com/paperless-ngx/paperless-ngx/pull/11091)) +- Enhancement: use friendly file names when emailing documents [@JanKleine](https://github.com/JanKleine) ([#11055](https://github.com/paperless-ngx/paperless-ngx/pull/11055)) +- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) +- docker(deps): Bump astral-sh/uv from 0.8.22-python3.12-bookworm-slim to 0.9.2-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11052](https://github.com/paperless-ngx/paperless-ngx/pull/11052)) +- Feature: add support for emailing multiple documents [@JanKleine](https://github.com/JanKleine) ([#10666](https://github.com/paperless-ngx/paperless-ngx/pull/10666)) +- Enhancement: ignore same files in sanity checker as consumer [@shamoon](https://github.com/shamoon) ([#10999](https://github.com/paperless-ngx/paperless-ngx/pull/10999)) +- Enhancement: open color picker on swatch button click [@shamoon](https://github.com/shamoon) ([#10994](https://github.com/paperless-ngx/paperless-ngx/pull/10994)) +- Performance: Cache django-guardian permissions when counting documents [@Merinorus](https://github.com/Merinorus) ([#10657](https://github.com/paperless-ngx/paperless-ngx/pull/10657)) +- Tweakhancement: reorganize some list \& bulk editing buttons [@shamoon](https://github.com/shamoon) ([#10944](https://github.com/paperless-ngx/paperless-ngx/pull/10944)) +- Enhancement: support workflow path matching of barcode-split documents [@DerRockWolf](https://github.com/DerRockWolf) ([#10723](https://github.com/paperless-ngx/paperless-ngx/pull/10723)) +- Feature: processed mail UI [@shamoon](https://github.com/shamoon) ([#10866](https://github.com/paperless-ngx/paperless-ngx/pull/10866)) +- Enhancement: support custom field values on post document [@shamoon](https://github.com/shamoon) ([#10859](https://github.com/paperless-ngx/paperless-ngx/pull/10859)) +- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) +- Enhancement: long text custom field [@jojo2357](https://github.com/jojo2357) ([#10846](https://github.com/paperless-ngx/paperless-ngx/pull/10846)) +- Enhancement: Add print button [@mpaletti](https://github.com/mpaletti) ([#10626](https://github.com/paperless-ngx/paperless-ngx/pull/10626)) +- Enhancement: add storage path as workflow trigger filter @david-loe ([#10771](https://github.com/paperless-ngx/paperless-ngx/pull/10771)) +- Enhancement: jinja template support for workflow title assignment [@sidey79](https://github.com/sidey79) ([#10700](https://github.com/paperless-ngx/paperless-ngx/pull/10700)) +- Enhancement: Limit excessively long content length when computing suggestions [@Merinorus](https://github.com/Merinorus) ([#10656](https://github.com/paperless-ngx/paperless-ngx/pull/10656)) ### Bug Fixes -- Fix: remove obsolete warning for custom field value index [@shamoon](https://github.com/shamoon) ([#11083](https://github.com/paperless-ngx/paperless-ngx/pull/11083)) -- Fix: set min-height for drag-drop items container [@shamoon](https://github.com/shamoon) ([#11064](https://github.com/paperless-ngx/paperless-ngx/pull/11064)) -- Fix custom field query dropdown toggle corners [@shamoon](https://github.com/shamoon) ([#11028](https://github.com/paperless-ngx/paperless-ngx/pull/11028)) -- Fix: correct save hotkey action when no next document exists [@shamoon](https://github.com/shamoon) ([#11027](https://github.com/paperless-ngx/paperless-ngx/pull/11027)) -- Fix: require only change permissions for task dismissal, add frontend error handling [@shamoon](https://github.com/shamoon) ([#11023](https://github.com/paperless-ngx/paperless-ngx/pull/11023)) -- Chore(deps): Bulk upgrade backend dependencies [@stumpylog](https://github.com/stumpylog) ([#10971](https://github.com/paperless-ngx/paperless-ngx/pull/10971)) -- Chore: remove Codecov token from CI workflow [@shamoon](https://github.com/shamoon) ([#10941](https://github.com/paperless-ngx/paperless-ngx/pull/10941)) -- Fix: fix select option removal and pagination update [@shamoon](https://github.com/shamoon) ([#10933](https://github.com/paperless-ngx/paperless-ngx/pull/10933)) -- Fix: skip fuzzy matching for empty document content [@shamoon](https://github.com/shamoon) ([#10914](https://github.com/paperless-ngx/paperless-ngx/pull/10914)) -- Fix: add extra error handling to \_consume for file checks [@shamoon](https://github.com/shamoon) ([#10897](https://github.com/paperless-ngx/paperless-ngx/pull/10897)) -- Fix: restore str celery beat schedule filename [@shamoon](https://github.com/shamoon) ([#10893](https://github.com/paperless-ngx/paperless-ngx/pull/10893)) -- Fix: fix pdf editor hover rotate counterclockwise button [@shamoon](https://github.com/shamoon) ([#10848](https://github.com/paperless-ngx/paperless-ngx/pull/10848)) -- Fix: warp long words in toast content [@shamoon](https://github.com/shamoon) ([#10839](https://github.com/paperless-ngx/paperless-ngx/pull/10839)) -- Fix: fix error when bulk adding empty doc link custom fields [@shamoon](https://github.com/shamoon) ([#10832](https://github.com/paperless-ngx/paperless-ngx/pull/10832)) -- Fix: set match value for correspondents created by mail rule [@shamoon](https://github.com/shamoon) ([#10820](https://github.com/paperless-ngx/paperless-ngx/pull/10820)) +- Fix: remove obsolete warning for custom field value index [@shamoon](https://github.com/shamoon) ([#11083](https://github.com/paperless-ngx/paperless-ngx/pull/11083)) +- Fix: set min-height for drag-drop items container [@shamoon](https://github.com/shamoon) ([#11064](https://github.com/paperless-ngx/paperless-ngx/pull/11064)) +- Fix custom field query dropdown toggle corners [@shamoon](https://github.com/shamoon) ([#11028](https://github.com/paperless-ngx/paperless-ngx/pull/11028)) +- Fix: correct save hotkey action when no next document exists [@shamoon](https://github.com/shamoon) ([#11027](https://github.com/paperless-ngx/paperless-ngx/pull/11027)) +- Fix: require only change permissions for task dismissal, add frontend error handling [@shamoon](https://github.com/shamoon) ([#11023](https://github.com/paperless-ngx/paperless-ngx/pull/11023)) +- Chore(deps): Bulk upgrade backend dependencies [@stumpylog](https://github.com/stumpylog) ([#10971](https://github.com/paperless-ngx/paperless-ngx/pull/10971)) +- Chore: remove Codecov token from CI workflow [@shamoon](https://github.com/shamoon) ([#10941](https://github.com/paperless-ngx/paperless-ngx/pull/10941)) +- Fix: fix select option removal and pagination update [@shamoon](https://github.com/shamoon) ([#10933](https://github.com/paperless-ngx/paperless-ngx/pull/10933)) +- Fix: skip fuzzy matching for empty document content [@shamoon](https://github.com/shamoon) ([#10914](https://github.com/paperless-ngx/paperless-ngx/pull/10914)) +- Fix: add extra error handling to \_consume for file checks [@shamoon](https://github.com/shamoon) ([#10897](https://github.com/paperless-ngx/paperless-ngx/pull/10897)) +- Fix: restore str celery beat schedule filename [@shamoon](https://github.com/shamoon) ([#10893](https://github.com/paperless-ngx/paperless-ngx/pull/10893)) +- Fix: fix pdf editor hover rotate counterclockwise button [@shamoon](https://github.com/shamoon) ([#10848](https://github.com/paperless-ngx/paperless-ngx/pull/10848)) +- Fix: warp long words in toast content [@shamoon](https://github.com/shamoon) ([#10839](https://github.com/paperless-ngx/paperless-ngx/pull/10839)) +- Fix: fix error when bulk adding empty doc link custom fields [@shamoon](https://github.com/shamoon) ([#10832](https://github.com/paperless-ngx/paperless-ngx/pull/10832)) +- Fix: set match value for correspondents created by mail rule [@shamoon](https://github.com/shamoon) ([#10820](https://github.com/paperless-ngx/paperless-ngx/pull/10820)) ### Maintenance -- Chore(deps): Bump the actions group with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10978](https://github.com/paperless-ngx/paperless-ngx/pull/10978)) -- Chore: remove Codecov token from CI workflow [@shamoon](https://github.com/shamoon) ([#10941](https://github.com/paperless-ngx/paperless-ngx/pull/10941)) +- Chore(deps): Bump the actions group with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10978](https://github.com/paperless-ngx/paperless-ngx/pull/10978)) +- Chore: remove Codecov token from CI workflow [@shamoon](https://github.com/shamoon) ([#10941](https://github.com/paperless-ngx/paperless-ngx/pull/10941)) ### Dependencies
29 changes -- docker(deps): bump astral-sh/uv from 0.9.2-python3.12-bookworm-slim to 0.9.4-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11091](https://github.com/paperless-ngx/paperless-ngx/pull/11091)) -- docker-compose(deps): Bump gotenberg/gotenberg from 8.23 to 8.24 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#11050](https://github.com/paperless-ngx/paperless-ngx/pull/11050)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11065](https://github.com/paperless-ngx/paperless-ngx/pull/11065)) -- docker(deps): Bump astral-sh/uv from 0.8.22-python3.12-bookworm-slim to 0.9.2-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11052](https://github.com/paperless-ngx/paperless-ngx/pull/11052)) -- Chore(deps): Bump the actions group with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10978](https://github.com/paperless-ngx/paperless-ngx/pull/10978)) -- Chore(deps): Bump uuid from 11.1.0 to 13.0.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10983](https://github.com/paperless-ngx/paperless-ngx/pull/10983)) -- Chore(deps-dev): Bump @playwright/test from 1.55.0 to 1.55.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10982](https://github.com/paperless-ngx/paperless-ngx/pull/10982)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10981](https://github.com/paperless-ngx/paperless-ngx/pull/10981)) -- Chore(deps-dev): Bump webpack from 5.101.3 to 5.102.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10986](https://github.com/paperless-ngx/paperless-ngx/pull/10986)) -- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.2.0 to 4.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10985](https://github.com/paperless-ngx/paperless-ngx/pull/10985)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10980](https://github.com/paperless-ngx/paperless-ngx/pull/10980)) -- Chore(deps-dev): Bump @types/node from 24.3.0 to 24.6.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10984](https://github.com/paperless-ngx/paperless-ngx/pull/10984)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10979](https://github.com/paperless-ngx/paperless-ngx/pull/10979)) -- docker-compose(deps): Bump library/postgres from 17 to 18 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10965](https://github.com/paperless-ngx/paperless-ngx/pull/10965)) -- Chore(deps): Bump the major-versions group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10960](https://github.com/paperless-ngx/paperless-ngx/pull/10960)) -- Chore(deps): Bump types-colorama from 0.4.15.20240311 to 0.4.15.20250801 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10961](https://github.com/paperless-ngx/paperless-ngx/pull/10961)) -- Chore(deps): Bump django-guardian from 3.1.3 to 3.2.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10909](https://github.com/paperless-ngx/paperless-ngx/pull/10909)) -- Chore(deps): Bump django-soft-delete from 1.0.19 to 1.0.21 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10908](https://github.com/paperless-ngx/paperless-ngx/pull/10908)) -- Chore(deps): Bump whitenoise from 6.10.0 to 6.11.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10910](https://github.com/paperless-ngx/paperless-ngx/pull/10910)) -- Chore(deps): Bump django-cors-headers from 4.8.0 to 4.9.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10907](https://github.com/paperless-ngx/paperless-ngx/pull/10907)) -- docker(deps): bump astral-sh/uv from 0.8.17-python3.12-bookworm-slim to 0.8.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10906](https://github.com/paperless-ngx/paperless-ngx/pull/10906)) -- docker(deps): Bump astral-sh/uv from 0.8.15-python3.12-bookworm-slim to 0.8.17-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10864](https://github.com/paperless-ngx/paperless-ngx/pull/10864)) -- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10880](https://github.com/paperless-ngx/paperless-ngx/pull/10880)) -- Chore(deps): Bump django-guardian from 3.1.2 to 3.1.3 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10863](https://github.com/paperless-ngx/paperless-ngx/pull/10863)) -- Chore(deps): Bump pytest-cov from 6.2.1 to 7.0.0 in the development group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#10822](https://github.com/paperless-ngx/paperless-ngx/pull/10822)) -- Chore(deps): Bump the django group with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10811](https://github.com/paperless-ngx/paperless-ngx/pull/10811)) -- docker-compose(deps): Bump gotenberg/gotenberg from 8.22 to 8.23 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10812](https://github.com/paperless-ngx/paperless-ngx/pull/10812)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10821](https://github.com/paperless-ngx/paperless-ngx/pull/10821)) -- docker(deps): Bump astral-sh/uv from 0.8.13-python3.12-bookworm-slim to 0.8.15-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10810](https://github.com/paperless-ngx/paperless-ngx/pull/10810)) +- docker(deps): bump astral-sh/uv from 0.9.2-python3.12-bookworm-slim to 0.9.4-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11091](https://github.com/paperless-ngx/paperless-ngx/pull/11091)) +- docker-compose(deps): Bump gotenberg/gotenberg from 8.23 to 8.24 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#11050](https://github.com/paperless-ngx/paperless-ngx/pull/11050)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11065](https://github.com/paperless-ngx/paperless-ngx/pull/11065)) +- docker(deps): Bump astral-sh/uv from 0.8.22-python3.12-bookworm-slim to 0.9.2-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#11052](https://github.com/paperless-ngx/paperless-ngx/pull/11052)) +- Chore(deps): Bump the actions group with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10978](https://github.com/paperless-ngx/paperless-ngx/pull/10978)) +- Chore(deps): Bump uuid from 11.1.0 to 13.0.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10983](https://github.com/paperless-ngx/paperless-ngx/pull/10983)) +- Chore(deps-dev): Bump @playwright/test from 1.55.0 to 1.55.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10982](https://github.com/paperless-ngx/paperless-ngx/pull/10982)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10981](https://github.com/paperless-ngx/paperless-ngx/pull/10981)) +- Chore(deps-dev): Bump webpack from 5.101.3 to 5.102.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10986](https://github.com/paperless-ngx/paperless-ngx/pull/10986)) +- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.2.0 to 4.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10985](https://github.com/paperless-ngx/paperless-ngx/pull/10985)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10980](https://github.com/paperless-ngx/paperless-ngx/pull/10980)) +- Chore(deps-dev): Bump @types/node from 24.3.0 to 24.6.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10984](https://github.com/paperless-ngx/paperless-ngx/pull/10984)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10979](https://github.com/paperless-ngx/paperless-ngx/pull/10979)) +- docker-compose(deps): Bump library/postgres from 17 to 18 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10965](https://github.com/paperless-ngx/paperless-ngx/pull/10965)) +- Chore(deps): Bump the major-versions group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10960](https://github.com/paperless-ngx/paperless-ngx/pull/10960)) +- Chore(deps): Bump types-colorama from 0.4.15.20240311 to 0.4.15.20250801 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10961](https://github.com/paperless-ngx/paperless-ngx/pull/10961)) +- Chore(deps): Bump django-guardian from 3.1.3 to 3.2.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10909](https://github.com/paperless-ngx/paperless-ngx/pull/10909)) +- Chore(deps): Bump django-soft-delete from 1.0.19 to 1.0.21 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10908](https://github.com/paperless-ngx/paperless-ngx/pull/10908)) +- Chore(deps): Bump whitenoise from 6.10.0 to 6.11.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10910](https://github.com/paperless-ngx/paperless-ngx/pull/10910)) +- Chore(deps): Bump django-cors-headers from 4.8.0 to 4.9.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10907](https://github.com/paperless-ngx/paperless-ngx/pull/10907)) +- docker(deps): bump astral-sh/uv from 0.8.17-python3.12-bookworm-slim to 0.8.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10906](https://github.com/paperless-ngx/paperless-ngx/pull/10906)) +- docker(deps): Bump astral-sh/uv from 0.8.15-python3.12-bookworm-slim to 0.8.17-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10864](https://github.com/paperless-ngx/paperless-ngx/pull/10864)) +- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10880](https://github.com/paperless-ngx/paperless-ngx/pull/10880)) +- Chore(deps): Bump django-guardian from 3.1.2 to 3.1.3 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10863](https://github.com/paperless-ngx/paperless-ngx/pull/10863)) +- Chore(deps): Bump pytest-cov from 6.2.1 to 7.0.0 in the development group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#10822](https://github.com/paperless-ngx/paperless-ngx/pull/10822)) +- Chore(deps): Bump the django group with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10811](https://github.com/paperless-ngx/paperless-ngx/pull/10811)) +- docker-compose(deps): Bump gotenberg/gotenberg from 8.22 to 8.23 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10812](https://github.com/paperless-ngx/paperless-ngx/pull/10812)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10821](https://github.com/paperless-ngx/paperless-ngx/pull/10821)) +- docker(deps): Bump astral-sh/uv from 0.8.13-python3.12-bookworm-slim to 0.8.15-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10810](https://github.com/paperless-ngx/paperless-ngx/pull/10810))
### All App Changes @@ -174,84 +568,84 @@
51 changes -- Tweak: improve tag parent validation error handling [@shamoon](https://github.com/shamoon) ([#11096](https://github.com/paperless-ngx/paperless-ngx/pull/11096)) -- Fix: remove obsolete warning for custom field value index [@shamoon](https://github.com/shamoon) ([#11083](https://github.com/paperless-ngx/paperless-ngx/pull/11083)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11065](https://github.com/paperless-ngx/paperless-ngx/pull/11065)) -- Enhancement: use friendly file names when emailing documents [@JanKleine](https://github.com/JanKleine) ([#11055](https://github.com/paperless-ngx/paperless-ngx/pull/11055)) -- Fix: set min-height for drag-drop items container [@shamoon](https://github.com/shamoon) ([#11064](https://github.com/paperless-ngx/paperless-ngx/pull/11064)) -- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) -- Feature: add support for emailing multiple documents [@JanKleine](https://github.com/JanKleine) ([#10666](https://github.com/paperless-ngx/paperless-ngx/pull/10666)) -- Fix custom field query dropdown toggle corners [@shamoon](https://github.com/shamoon) ([#11028](https://github.com/paperless-ngx/paperless-ngx/pull/11028)) -- Fix: correct save hotkey action when no next document exists [@shamoon](https://github.com/shamoon) ([#11027](https://github.com/paperless-ngx/paperless-ngx/pull/11027)) -- Fix: require only change permissions for task dismissal, add frontend error handling [@shamoon](https://github.com/shamoon) ([#11023](https://github.com/paperless-ngx/paperless-ngx/pull/11023)) -- Enhancement: ignore same files in sanity checker as consumer [@shamoon](https://github.com/shamoon) ([#10999](https://github.com/paperless-ngx/paperless-ngx/pull/10999)) -- Enhancement: open color picker on swatch button click [@shamoon](https://github.com/shamoon) ([#10994](https://github.com/paperless-ngx/paperless-ngx/pull/10994)) -- Chore(deps): Bump uuid from 11.1.0 to 13.0.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10983](https://github.com/paperless-ngx/paperless-ngx/pull/10983)) -- Chore(deps-dev): Bump @playwright/test from 1.55.0 to 1.55.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10982](https://github.com/paperless-ngx/paperless-ngx/pull/10982)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10981](https://github.com/paperless-ngx/paperless-ngx/pull/10981)) -- Chore(deps-dev): Bump webpack from 5.101.3 to 5.102.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10986](https://github.com/paperless-ngx/paperless-ngx/pull/10986)) -- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.2.0 to 4.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10985](https://github.com/paperless-ngx/paperless-ngx/pull/10985)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10980](https://github.com/paperless-ngx/paperless-ngx/pull/10980)) -- Chore(deps-dev): Bump @types/node from 24.3.0 to 24.6.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10984](https://github.com/paperless-ngx/paperless-ngx/pull/10984)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10979](https://github.com/paperless-ngx/paperless-ngx/pull/10979)) -- Performance: Cache django-guardian permissions when counting documents [@Merinorus](https://github.com/Merinorus) ([#10657](https://github.com/paperless-ngx/paperless-ngx/pull/10657)) -- Chore(deps): Bulk upgrade backend dependencies [@stumpylog](https://github.com/stumpylog) ([#10971](https://github.com/paperless-ngx/paperless-ngx/pull/10971)) -- Chore(deps): Bump the major-versions group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10960](https://github.com/paperless-ngx/paperless-ngx/pull/10960)) -- Chore(deps): Bump types-colorama from 0.4.15.20240311 to 0.4.15.20250801 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10961](https://github.com/paperless-ngx/paperless-ngx/pull/10961)) -- Chore(deps): Bump django-guardian from 3.1.3 to 3.2.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10909](https://github.com/paperless-ngx/paperless-ngx/pull/10909)) -- Chore(deps): Bump django-soft-delete from 1.0.19 to 1.0.21 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10908](https://github.com/paperless-ngx/paperless-ngx/pull/10908)) -- Chore(deps): Bump whitenoise from 6.10.0 to 6.11.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10910](https://github.com/paperless-ngx/paperless-ngx/pull/10910)) -- Tweakhancement: reorganize some list \& bulk editing buttons [@shamoon](https://github.com/shamoon) ([#10944](https://github.com/paperless-ngx/paperless-ngx/pull/10944)) -- Chore(deps): Bump django-cors-headers from 4.8.0 to 4.9.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10907](https://github.com/paperless-ngx/paperless-ngx/pull/10907)) -- Fix: fix select option removal and pagination update [@shamoon](https://github.com/shamoon) ([#10933](https://github.com/paperless-ngx/paperless-ngx/pull/10933)) -- Enhancement: support workflow path matching of barcode-split documents [@DerRockWolf](https://github.com/DerRockWolf) ([#10723](https://github.com/paperless-ngx/paperless-ngx/pull/10723)) -- Fix: skip fuzzy matching for empty document content [@shamoon](https://github.com/shamoon) ([#10914](https://github.com/paperless-ngx/paperless-ngx/pull/10914)) -- Feature: processed mail UI [@shamoon](https://github.com/shamoon) ([#10866](https://github.com/paperless-ngx/paperless-ngx/pull/10866)) -- Fix: add extra error handling to \_consume for file checks [@shamoon](https://github.com/shamoon) ([#10897](https://github.com/paperless-ngx/paperless-ngx/pull/10897)) -- Fix: restore str celery beat schedule filename [@shamoon](https://github.com/shamoon) ([#10893](https://github.com/paperless-ngx/paperless-ngx/pull/10893)) -- Enhancement: support custom field values on post document [@shamoon](https://github.com/shamoon) ([#10859](https://github.com/paperless-ngx/paperless-ngx/pull/10859)) -- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) -- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10880](https://github.com/paperless-ngx/paperless-ngx/pull/10880)) -- Chore(deps): Bump django-guardian from 3.1.2 to 3.1.3 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10863](https://github.com/paperless-ngx/paperless-ngx/pull/10863)) -- Enhancement: long text custom field [@jojo2357](https://github.com/jojo2357) ([#10846](https://github.com/paperless-ngx/paperless-ngx/pull/10846)) -- Fix: fix pdf editor hover rotate counterclockwise button [@shamoon](https://github.com/shamoon) ([#10848](https://github.com/paperless-ngx/paperless-ngx/pull/10848)) -- Fix: warp long words in toast content [@shamoon](https://github.com/shamoon) ([#10839](https://github.com/paperless-ngx/paperless-ngx/pull/10839)) -- Fix: fix error when bulk adding empty doc link custom fields [@shamoon](https://github.com/shamoon) ([#10832](https://github.com/paperless-ngx/paperless-ngx/pull/10832)) -- Enhancement: Add print button [@mpaletti](https://github.com/mpaletti) ([#10626](https://github.com/paperless-ngx/paperless-ngx/pull/10626)) -- Enhancement: add storage path as workflow trigger filter @david-loe ([#10771](https://github.com/paperless-ngx/paperless-ngx/pull/10771)) -- Enhancement: jinja template support for workflow title assignment [@sidey79](https://github.com/sidey79) ([#10700](https://github.com/paperless-ngx/paperless-ngx/pull/10700)) -- Chore(deps): Bump pytest-cov from 6.2.1 to 7.0.0 in the development group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#10822](https://github.com/paperless-ngx/paperless-ngx/pull/10822)) -- Chore(deps): Bump the django group with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10811](https://github.com/paperless-ngx/paperless-ngx/pull/10811)) -- Enhancement: Limit excessively long content length when computing suggestions [@Merinorus](https://github.com/Merinorus) ([#10656](https://github.com/paperless-ngx/paperless-ngx/pull/10656)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10821](https://github.com/paperless-ngx/paperless-ngx/pull/10821)) -- Fix: set match value for correspondents created by mail rule [@shamoon](https://github.com/shamoon) ([#10820](https://github.com/paperless-ngx/paperless-ngx/pull/10820)) +- Tweak: improve tag parent validation error handling [@shamoon](https://github.com/shamoon) ([#11096](https://github.com/paperless-ngx/paperless-ngx/pull/11096)) +- Fix: remove obsolete warning for custom field value index [@shamoon](https://github.com/shamoon) ([#11083](https://github.com/paperless-ngx/paperless-ngx/pull/11083)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#11065](https://github.com/paperless-ngx/paperless-ngx/pull/11065)) +- Enhancement: use friendly file names when emailing documents [@JanKleine](https://github.com/JanKleine) ([#11055](https://github.com/paperless-ngx/paperless-ngx/pull/11055)) +- Fix: set min-height for drag-drop items container [@shamoon](https://github.com/shamoon) ([#11064](https://github.com/paperless-ngx/paperless-ngx/pull/11064)) +- Feature: Advanced Workflow Filters [@shamoon](https://github.com/shamoon) ([#11029](https://github.com/paperless-ngx/paperless-ngx/pull/11029)) +- Feature: add support for emailing multiple documents [@JanKleine](https://github.com/JanKleine) ([#10666](https://github.com/paperless-ngx/paperless-ngx/pull/10666)) +- Fix custom field query dropdown toggle corners [@shamoon](https://github.com/shamoon) ([#11028](https://github.com/paperless-ngx/paperless-ngx/pull/11028)) +- Fix: correct save hotkey action when no next document exists [@shamoon](https://github.com/shamoon) ([#11027](https://github.com/paperless-ngx/paperless-ngx/pull/11027)) +- Fix: require only change permissions for task dismissal, add frontend error handling [@shamoon](https://github.com/shamoon) ([#11023](https://github.com/paperless-ngx/paperless-ngx/pull/11023)) +- Enhancement: ignore same files in sanity checker as consumer [@shamoon](https://github.com/shamoon) ([#10999](https://github.com/paperless-ngx/paperless-ngx/pull/10999)) +- Enhancement: open color picker on swatch button click [@shamoon](https://github.com/shamoon) ([#10994](https://github.com/paperless-ngx/paperless-ngx/pull/10994)) +- Chore(deps): Bump uuid from 11.1.0 to 13.0.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10983](https://github.com/paperless-ngx/paperless-ngx/pull/10983)) +- Chore(deps-dev): Bump @playwright/test from 1.55.0 to 1.55.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10982](https://github.com/paperless-ngx/paperless-ngx/pull/10982)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10981](https://github.com/paperless-ngx/paperless-ngx/pull/10981)) +- Chore(deps-dev): Bump webpack from 5.101.3 to 5.102.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10986](https://github.com/paperless-ngx/paperless-ngx/pull/10986)) +- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.2.0 to 4.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10985](https://github.com/paperless-ngx/paperless-ngx/pull/10985)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10980](https://github.com/paperless-ngx/paperless-ngx/pull/10980)) +- Chore(deps-dev): Bump @types/node from 24.3.0 to 24.6.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10984](https://github.com/paperless-ngx/paperless-ngx/pull/10984)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10979](https://github.com/paperless-ngx/paperless-ngx/pull/10979)) +- Performance: Cache django-guardian permissions when counting documents [@Merinorus](https://github.com/Merinorus) ([#10657](https://github.com/paperless-ngx/paperless-ngx/pull/10657)) +- Chore(deps): Bulk upgrade backend dependencies [@stumpylog](https://github.com/stumpylog) ([#10971](https://github.com/paperless-ngx/paperless-ngx/pull/10971)) +- Chore(deps): Bump the major-versions group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10960](https://github.com/paperless-ngx/paperless-ngx/pull/10960)) +- Chore(deps): Bump types-colorama from 0.4.15.20240311 to 0.4.15.20250801 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10961](https://github.com/paperless-ngx/paperless-ngx/pull/10961)) +- Chore(deps): Bump django-guardian from 3.1.3 to 3.2.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10909](https://github.com/paperless-ngx/paperless-ngx/pull/10909)) +- Chore(deps): Bump django-soft-delete from 1.0.19 to 1.0.21 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10908](https://github.com/paperless-ngx/paperless-ngx/pull/10908)) +- Chore(deps): Bump whitenoise from 6.10.0 to 6.11.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10910](https://github.com/paperless-ngx/paperless-ngx/pull/10910)) +- Tweakhancement: reorganize some list \& bulk editing buttons [@shamoon](https://github.com/shamoon) ([#10944](https://github.com/paperless-ngx/paperless-ngx/pull/10944)) +- Chore(deps): Bump django-cors-headers from 4.8.0 to 4.9.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10907](https://github.com/paperless-ngx/paperless-ngx/pull/10907)) +- Fix: fix select option removal and pagination update [@shamoon](https://github.com/shamoon) ([#10933](https://github.com/paperless-ngx/paperless-ngx/pull/10933)) +- Enhancement: support workflow path matching of barcode-split documents [@DerRockWolf](https://github.com/DerRockWolf) ([#10723](https://github.com/paperless-ngx/paperless-ngx/pull/10723)) +- Fix: skip fuzzy matching for empty document content [@shamoon](https://github.com/shamoon) ([#10914](https://github.com/paperless-ngx/paperless-ngx/pull/10914)) +- Feature: processed mail UI [@shamoon](https://github.com/shamoon) ([#10866](https://github.com/paperless-ngx/paperless-ngx/pull/10866)) +- Fix: add extra error handling to \_consume for file checks [@shamoon](https://github.com/shamoon) ([#10897](https://github.com/paperless-ngx/paperless-ngx/pull/10897)) +- Fix: restore str celery beat schedule filename [@shamoon](https://github.com/shamoon) ([#10893](https://github.com/paperless-ngx/paperless-ngx/pull/10893)) +- Enhancement: support custom field values on post document [@shamoon](https://github.com/shamoon) ([#10859](https://github.com/paperless-ngx/paperless-ngx/pull/10859)) +- Feature: Nested Tags [@shamoon](https://github.com/shamoon) ([#10833](https://github.com/paperless-ngx/paperless-ngx/pull/10833)) +- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10880](https://github.com/paperless-ngx/paperless-ngx/pull/10880)) +- Chore(deps): Bump django-guardian from 3.1.2 to 3.1.3 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10863](https://github.com/paperless-ngx/paperless-ngx/pull/10863)) +- Enhancement: long text custom field [@jojo2357](https://github.com/jojo2357) ([#10846](https://github.com/paperless-ngx/paperless-ngx/pull/10846)) +- Fix: fix pdf editor hover rotate counterclockwise button [@shamoon](https://github.com/shamoon) ([#10848](https://github.com/paperless-ngx/paperless-ngx/pull/10848)) +- Fix: warp long words in toast content [@shamoon](https://github.com/shamoon) ([#10839](https://github.com/paperless-ngx/paperless-ngx/pull/10839)) +- Fix: fix error when bulk adding empty doc link custom fields [@shamoon](https://github.com/shamoon) ([#10832](https://github.com/paperless-ngx/paperless-ngx/pull/10832)) +- Enhancement: Add print button [@mpaletti](https://github.com/mpaletti) ([#10626](https://github.com/paperless-ngx/paperless-ngx/pull/10626)) +- Enhancement: add storage path as workflow trigger filter @david-loe ([#10771](https://github.com/paperless-ngx/paperless-ngx/pull/10771)) +- Enhancement: jinja template support for workflow title assignment [@sidey79](https://github.com/sidey79) ([#10700](https://github.com/paperless-ngx/paperless-ngx/pull/10700)) +- Chore(deps): Bump pytest-cov from 6.2.1 to 7.0.0 in the development group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#10822](https://github.com/paperless-ngx/paperless-ngx/pull/10822)) +- Chore(deps): Bump the django group with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10811](https://github.com/paperless-ngx/paperless-ngx/pull/10811)) +- Enhancement: Limit excessively long content length when computing suggestions [@Merinorus](https://github.com/Merinorus) ([#10656](https://github.com/paperless-ngx/paperless-ngx/pull/10656)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10821](https://github.com/paperless-ngx/paperless-ngx/pull/10821)) +- Fix: set match value for correspondents created by mail rule [@shamoon](https://github.com/shamoon) ([#10820](https://github.com/paperless-ngx/paperless-ngx/pull/10820))
## paperless-ngx 2.18.4 ### Features / Enhancements -- Enhancement: report websocket status [@shamoon](https://github.com/shamoon) ([#10777](https://github.com/paperless-ngx/paperless-ngx/pull/10777)) +- Enhancement: report websocket status [@shamoon](https://github.com/shamoon) ([#10777](https://github.com/paperless-ngx/paperless-ngx/pull/10777)) ### Bug Fixes -- Revert "Performance: Enable virtual scrolling for large custom field … [@shamoon](https://github.com/shamoon) ([#10803](https://github.com/paperless-ngx/paperless-ngx/pull/10803)) -- Fixhancement: update sidebar view counts on save \& next also [@shamoon](https://github.com/shamoon) ([#10793](https://github.com/paperless-ngx/paperless-ngx/pull/10793)) -- Performance fix: add paging for custom field select options [@shamoon](https://github.com/shamoon) ([#10755](https://github.com/paperless-ngx/paperless-ngx/pull/10755)) +- Revert "Performance: Enable virtual scrolling for large custom field … [@shamoon](https://github.com/shamoon) ([#10803](https://github.com/paperless-ngx/paperless-ngx/pull/10803)) +- Fixhancement: update sidebar view counts on save \& next also [@shamoon](https://github.com/shamoon) ([#10793](https://github.com/paperless-ngx/paperless-ngx/pull/10793)) +- Performance fix: add paging for custom field select options [@shamoon](https://github.com/shamoon) ([#10755](https://github.com/paperless-ngx/paperless-ngx/pull/10755)) ### Dependencies
8 changes -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@shamoon](https://github.com/shamoon) ([#10770](https://github.com/paperless-ngx/paperless-ngx/pull/10770)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10745](https://github.com/paperless-ngx/paperless-ngx/pull/10745)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10744](https://github.com/paperless-ngx/paperless-ngx/pull/10744)) -- Chore(deps): Bump bootstrap from 5.3.7 to 5.3.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10740](https://github.com/paperless-ngx/paperless-ngx/pull/10740)) -- Chore(deps-dev): Bump @playwright/test from 1.54.2 to 1.55.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10743](https://github.com/paperless-ngx/paperless-ngx/pull/10743)) -- Chore(deps-dev): Bump webpack from 5.101.0 to 5.101.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10751](https://github.com/paperless-ngx/paperless-ngx/pull/10751)) -- Chore(deps-dev): Bump @types/node from 24.1.0 to 24.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10750](https://github.com/paperless-ngx/paperless-ngx/pull/10750)) -- Chore(deps): Bump the actions group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10757](https://github.com/paperless-ngx/paperless-ngx/pull/10757)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@shamoon](https://github.com/shamoon) ([#10770](https://github.com/paperless-ngx/paperless-ngx/pull/10770)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10745](https://github.com/paperless-ngx/paperless-ngx/pull/10745)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10744](https://github.com/paperless-ngx/paperless-ngx/pull/10744)) +- Chore(deps): Bump bootstrap from 5.3.7 to 5.3.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10740](https://github.com/paperless-ngx/paperless-ngx/pull/10740)) +- Chore(deps-dev): Bump @playwright/test from 1.54.2 to 1.55.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10743](https://github.com/paperless-ngx/paperless-ngx/pull/10743)) +- Chore(deps-dev): Bump webpack from 5.101.0 to 5.101.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10751](https://github.com/paperless-ngx/paperless-ngx/pull/10751)) +- Chore(deps-dev): Bump @types/node from 24.1.0 to 24.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10750](https://github.com/paperless-ngx/paperless-ngx/pull/10750)) +- Chore(deps): Bump the actions group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10757](https://github.com/paperless-ngx/paperless-ngx/pull/10757))
### All App Changes @@ -259,43 +653,43 @@
13 changes -- Revert "Performance: Enable virtual scrolling for large custom field … @shamoon ([#10803](https://github.com/paperless-ngx/paperless-ngx/pull/10803)) -- Fixhancement: update sidebar view counts on save \& next also @shamoon ([#10793](https://github.com/paperless-ngx/paperless-ngx/pull/10793)) -- Enhancement: report websocket status @shamoon ([#10777](https://github.com/paperless-ngx/paperless-ngx/pull/10777)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates @shamoon ([#10770](https://github.com/paperless-ngx/paperless-ngx/pull/10770)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10745](https://github.com/paperless-ngx/paperless-ngx/pull/10745)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10744](https://github.com/paperless-ngx/paperless-ngx/pull/10744)) -- Chore(deps): Bump bootstrap from 5.3.7 to 5.3.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10740](https://github.com/paperless-ngx/paperless-ngx/pull/10740)) -- Chore(deps-dev): Bump @playwright/test from 1.54.2 to 1.55.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10743](https://github.com/paperless-ngx/paperless-ngx/pull/10743)) -- Chore(deps-dev): Bump webpack from 5.101.0 to 5.101.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10751](https://github.com/paperless-ngx/paperless-ngx/pull/10751)) -- Chore(deps-dev): Bump @types/node from 24.1.0 to 24.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10750](https://github.com/paperless-ngx/paperless-ngx/pull/10750)) -- Chore: switch from os.path to pathlib.Path @gothicVI ([#10539](https://github.com/paperless-ngx/paperless-ngx/pull/10539)) -- Performance fix: add paging for custom field select options @shamoon ([#10755](https://github.com/paperless-ngx/paperless-ngx/pull/10755)) +- Revert "Performance: Enable virtual scrolling for large custom field … @shamoon ([#10803](https://github.com/paperless-ngx/paperless-ngx/pull/10803)) +- Fixhancement: update sidebar view counts on save \& next also @shamoon ([#10793](https://github.com/paperless-ngx/paperless-ngx/pull/10793)) +- Enhancement: report websocket status @shamoon ([#10777](https://github.com/paperless-ngx/paperless-ngx/pull/10777)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates @shamoon ([#10770](https://github.com/paperless-ngx/paperless-ngx/pull/10770)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10745](https://github.com/paperless-ngx/paperless-ngx/pull/10745)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10744](https://github.com/paperless-ngx/paperless-ngx/pull/10744)) +- Chore(deps): Bump bootstrap from 5.3.7 to 5.3.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10740](https://github.com/paperless-ngx/paperless-ngx/pull/10740)) +- Chore(deps-dev): Bump @playwright/test from 1.54.2 to 1.55.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10743](https://github.com/paperless-ngx/paperless-ngx/pull/10743)) +- Chore(deps-dev): Bump webpack from 5.101.0 to 5.101.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10751](https://github.com/paperless-ngx/paperless-ngx/pull/10751)) +- Chore(deps-dev): Bump @types/node from 24.1.0 to 24.3.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10750](https://github.com/paperless-ngx/paperless-ngx/pull/10750)) +- Chore: switch from os.path to pathlib.Path @gothicVI ([#10539](https://github.com/paperless-ngx/paperless-ngx/pull/10539)) +- Performance fix: add paging for custom field select options @shamoon ([#10755](https://github.com/paperless-ngx/paperless-ngx/pull/10755))
## paperless-ngx 2.18.3 ### Bug Fixes -- Fix: include application config language settings for dateparser auto-detection [@shamoon](https://github.com/shamoon) ([#10722](https://github.com/paperless-ngx/paperless-ngx/pull/10722)) -- Fix: hide sidebar counts during saved views organization [@shamoon](https://github.com/shamoon) ([#10716](https://github.com/paperless-ngx/paperless-ngx/pull/10716)) -- Fix: wrap long view titles in sidebar [@shamoon](https://github.com/shamoon) ([#10715](https://github.com/paperless-ngx/paperless-ngx/pull/10715)) -- Fixhancement: more saved view count refreshes [@shamoon](https://github.com/shamoon) ([#10694](https://github.com/paperless-ngx/paperless-ngx/pull/10694)) -- Fix: include pagination array items for valid openapi schema [@shamoon](https://github.com/shamoon) ([#10682](https://github.com/paperless-ngx/paperless-ngx/pull/10682)) -- Fix: prevent scroll for view name in sidebar [@shamoon](https://github.com/shamoon) ([#10676](https://github.com/paperless-ngx/paperless-ngx/pull/10676)) -- Tweak: center document close button in app frame [@shamoon](https://github.com/shamoon) ([#10661](https://github.com/paperless-ngx/paperless-ngx/pull/10661)) -- Performance: Enable virtual scrolling for large custom field selects @david-loe ([#10708](https://github.com/paperless-ngx/paperless-ngx/pull/10708)) +- Fix: include application config language settings for dateparser auto-detection [@shamoon](https://github.com/shamoon) ([#10722](https://github.com/paperless-ngx/paperless-ngx/pull/10722)) +- Fix: hide sidebar counts during saved views organization [@shamoon](https://github.com/shamoon) ([#10716](https://github.com/paperless-ngx/paperless-ngx/pull/10716)) +- Fix: wrap long view titles in sidebar [@shamoon](https://github.com/shamoon) ([#10715](https://github.com/paperless-ngx/paperless-ngx/pull/10715)) +- Fixhancement: more saved view count refreshes [@shamoon](https://github.com/shamoon) ([#10694](https://github.com/paperless-ngx/paperless-ngx/pull/10694)) +- Fix: include pagination array items for valid openapi schema [@shamoon](https://github.com/shamoon) ([#10682](https://github.com/paperless-ngx/paperless-ngx/pull/10682)) +- Fix: prevent scroll for view name in sidebar [@shamoon](https://github.com/shamoon) ([#10676](https://github.com/paperless-ngx/paperless-ngx/pull/10676)) +- Tweak: center document close button in app frame [@shamoon](https://github.com/shamoon) ([#10661](https://github.com/paperless-ngx/paperless-ngx/pull/10661)) +- Performance: Enable virtual scrolling for large custom field selects @david-loe ([#10708](https://github.com/paperless-ngx/paperless-ngx/pull/10708)) ### Dependencies
5 changes -- Chore(deps): Update granian[uvloop] requirement from ~=2.4.1 to ~=2.5.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10529](https://github.com/paperless-ngx/paperless-ngx/pull/10529)) -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10714](https://github.com/paperless-ngx/paperless-ngx/pull/10714)) -- docker-compose(deps): Bump library/mariadb from 11 to 12 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10621](https://github.com/paperless-ngx/paperless-ngx/pull/10621)) -- docker-compose(deps): Bump gotenberg/gotenberg from 8.20 to 8.22 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10687](https://github.com/paperless-ngx/paperless-ngx/pull/10687)) -- docker(deps): Bump astral-sh/uv from 0.8.8-python3.12-bookworm-slim to 0.8.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10685](https://github.com/paperless-ngx/paperless-ngx/pull/10685)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.4.1 to ~=2.5.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10529](https://github.com/paperless-ngx/paperless-ngx/pull/10529)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10714](https://github.com/paperless-ngx/paperless-ngx/pull/10714)) +- docker-compose(deps): Bump library/mariadb from 11 to 12 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10621](https://github.com/paperless-ngx/paperless-ngx/pull/10621)) +- docker-compose(deps): Bump gotenberg/gotenberg from 8.20 to 8.22 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#10687](https://github.com/paperless-ngx/paperless-ngx/pull/10687)) +- docker(deps): Bump astral-sh/uv from 0.8.8-python3.12-bookworm-slim to 0.8.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10685](https://github.com/paperless-ngx/paperless-ngx/pull/10685))
### All App Changes @@ -303,153 +697,153 @@
11 changes -- Fix: include application config language settings for dateparser auto-detection [@shamoon](https://github.com/shamoon) ([#10722](https://github.com/paperless-ngx/paperless-ngx/pull/10722)) -- Chore(deps): Update granian[uvloop] requirement from ~=2.4.1 to ~=2.5.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10529](https://github.com/paperless-ngx/paperless-ngx/pull/10529)) -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10714](https://github.com/paperless-ngx/paperless-ngx/pull/10714)) -- Fix: hide sidebar counts during saved views organization [@shamoon](https://github.com/shamoon) ([#10716](https://github.com/paperless-ngx/paperless-ngx/pull/10716)) -- Fix: wrap long view titles in sidebar [@shamoon](https://github.com/shamoon) ([#10715](https://github.com/paperless-ngx/paperless-ngx/pull/10715)) -- Performance: Enable virtual scrolling for large custom field selects @david-loe ([#10708](https://github.com/paperless-ngx/paperless-ngx/pull/10708)) -- Chore: refactor document details component [@shamoon](https://github.com/shamoon) ([#10662](https://github.com/paperless-ngx/paperless-ngx/pull/10662)) -- Fixhancement: more saved view count refreshes [@shamoon](https://github.com/shamoon) ([#10694](https://github.com/paperless-ngx/paperless-ngx/pull/10694)) -- Fix: include pagination array items for valid openapi schema [@shamoon](https://github.com/shamoon) ([#10682](https://github.com/paperless-ngx/paperless-ngx/pull/10682)) -- Fix: prevent scroll for view name in sidebar [@shamoon](https://github.com/shamoon) ([#10676](https://github.com/paperless-ngx/paperless-ngx/pull/10676)) -- Tweak: center document close button in app frame [@shamoon](https://github.com/shamoon) ([#10661](https://github.com/paperless-ngx/paperless-ngx/pull/10661)) +- Fix: include application config language settings for dateparser auto-detection [@shamoon](https://github.com/shamoon) ([#10722](https://github.com/paperless-ngx/paperless-ngx/pull/10722)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.4.1 to ~=2.5.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10529](https://github.com/paperless-ngx/paperless-ngx/pull/10529)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10714](https://github.com/paperless-ngx/paperless-ngx/pull/10714)) +- Fix: hide sidebar counts during saved views organization [@shamoon](https://github.com/shamoon) ([#10716](https://github.com/paperless-ngx/paperless-ngx/pull/10716)) +- Fix: wrap long view titles in sidebar [@shamoon](https://github.com/shamoon) ([#10715](https://github.com/paperless-ngx/paperless-ngx/pull/10715)) +- Performance: Enable virtual scrolling for large custom field selects @david-loe ([#10708](https://github.com/paperless-ngx/paperless-ngx/pull/10708)) +- Chore: refactor document details component [@shamoon](https://github.com/shamoon) ([#10662](https://github.com/paperless-ngx/paperless-ngx/pull/10662)) +- Fixhancement: more saved view count refreshes [@shamoon](https://github.com/shamoon) ([#10694](https://github.com/paperless-ngx/paperless-ngx/pull/10694)) +- Fix: include pagination array items for valid openapi schema [@shamoon](https://github.com/shamoon) ([#10682](https://github.com/paperless-ngx/paperless-ngx/pull/10682)) +- Fix: prevent scroll for view name in sidebar [@shamoon](https://github.com/shamoon) ([#10676](https://github.com/paperless-ngx/paperless-ngx/pull/10676)) +- Tweak: center document close button in app frame [@shamoon](https://github.com/shamoon) ([#10661](https://github.com/paperless-ngx/paperless-ngx/pull/10661))
## paperless-ngx 2.18.2 ### Bug Fixes -- Fix: prevent loss of changes when switching between open docs [@shamoon](https://github.com/shamoon) ([#10659](https://github.com/paperless-ngx/paperless-ngx/pull/10659)) -- Fix: ignore incomplete tasks for system status 'last run' [@shamoon](https://github.com/shamoon) ([#10641](https://github.com/paperless-ngx/paperless-ngx/pull/10641)) -- Fix: increase legibility of date filter clear button in light mode [@shamoon](https://github.com/shamoon) ([#10649](https://github.com/paperless-ngx/paperless-ngx/pull/10649)) -- Fix: ensure saved view count is visible with long names [@shamoon](https://github.com/shamoon) ([#10616](https://github.com/paperless-ngx/paperless-ngx/pull/10616)) -- Tweak: improve dateparser auto-detection messages [@shamoon](https://github.com/shamoon) ([#10640](https://github.com/paperless-ngx/paperless-ngx/pull/10640)) +- Fix: prevent loss of changes when switching between open docs [@shamoon](https://github.com/shamoon) ([#10659](https://github.com/paperless-ngx/paperless-ngx/pull/10659)) +- Fix: ignore incomplete tasks for system status 'last run' [@shamoon](https://github.com/shamoon) ([#10641](https://github.com/paperless-ngx/paperless-ngx/pull/10641)) +- Fix: increase legibility of date filter clear button in light mode [@shamoon](https://github.com/shamoon) ([#10649](https://github.com/paperless-ngx/paperless-ngx/pull/10649)) +- Fix: ensure saved view count is visible with long names [@shamoon](https://github.com/shamoon) ([#10616](https://github.com/paperless-ngx/paperless-ngx/pull/10616)) +- Tweak: improve dateparser auto-detection messages [@shamoon](https://github.com/shamoon) ([#10640](https://github.com/paperless-ngx/paperless-ngx/pull/10640)) ### Dependencies -- Chore(deps): Bump the development group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10578](https://github.com/paperless-ngx/paperless-ngx/pull/10578)) +- Chore(deps): Bump the development group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10578](https://github.com/paperless-ngx/paperless-ngx/pull/10578)) ### All App Changes
6 changes -- Fix: prevent loss of changes when switching between open docs [@shamoon](https://github.com/shamoon) ([#10659](https://github.com/paperless-ngx/paperless-ngx/pull/10659)) -- Fix: ignore incomplete tasks for system status 'last run' [@shamoon](https://github.com/shamoon) ([#10641](https://github.com/paperless-ngx/paperless-ngx/pull/10641)) -- Tweak: improve dateparser auto-detection messages [@shamoon](https://github.com/shamoon) ([#10640](https://github.com/paperless-ngx/paperless-ngx/pull/10640)) -- Fix: increase legibility of date filter clear button in light mode [@shamoon](https://github.com/shamoon) ([#10649](https://github.com/paperless-ngx/paperless-ngx/pull/10649)) -- Fix: ensure saved view count is visible with long names [@shamoon](https://github.com/shamoon) ([#10616](https://github.com/paperless-ngx/paperless-ngx/pull/10616)) -- Chore(deps): Bump the development group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10578](https://github.com/paperless-ngx/paperless-ngx/pull/10578)) +- Fix: prevent loss of changes when switching between open docs [@shamoon](https://github.com/shamoon) ([#10659](https://github.com/paperless-ngx/paperless-ngx/pull/10659)) +- Fix: ignore incomplete tasks for system status 'last run' [@shamoon](https://github.com/shamoon) ([#10641](https://github.com/paperless-ngx/paperless-ngx/pull/10641)) +- Tweak: improve dateparser auto-detection messages [@shamoon](https://github.com/shamoon) ([#10640](https://github.com/paperless-ngx/paperless-ngx/pull/10640)) +- Fix: increase legibility of date filter clear button in light mode [@shamoon](https://github.com/shamoon) ([#10649](https://github.com/paperless-ngx/paperless-ngx/pull/10649)) +- Fix: ensure saved view count is visible with long names [@shamoon](https://github.com/shamoon) ([#10616](https://github.com/paperless-ngx/paperless-ngx/pull/10616)) +- Chore(deps): Bump the development group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10578](https://github.com/paperless-ngx/paperless-ngx/pull/10578))
## paperless-ngx 2.18.1 ### Features / Enhancements -- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593)) -- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588)) +- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593)) +- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588)) ### Bug Fixes -- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599)) +- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599)) ### Documentation -- Documentation: fix filters docs [@shamoon](https://github.com/shamoon) ([#10600](https://github.com/paperless-ngx/paperless-ngx/pull/10600)) +- Documentation: fix filters docs [@shamoon](https://github.com/shamoon) ([#10600](https://github.com/paperless-ngx/paperless-ngx/pull/10600)) ### All App Changes
4 changes -- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599)) -- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593)) -- Development: restore version tag display [@shamoon](https://github.com/shamoon) ([#10592](https://github.com/paperless-ngx/paperless-ngx/pull/10592)) -- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588)) +- Fix: fix app logo validation with no file [@shamoon](https://github.com/shamoon) ([#10599](https://github.com/paperless-ngx/paperless-ngx/pull/10599)) +- Tweak: fix some button consistency [@shamoon](https://github.com/shamoon) ([#10593](https://github.com/paperless-ngx/paperless-ngx/pull/10593)) +- Development: restore version tag display [@shamoon](https://github.com/shamoon) ([#10592](https://github.com/paperless-ngx/paperless-ngx/pull/10592)) +- Fixhancement: mobile layout improvements for pdf editor [@shamoon](https://github.com/shamoon) ([#10588](https://github.com/paperless-ngx/paperless-ngx/pull/10588))
## paperless-ngx 2.18.0 ### Notable Changes -- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) +- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) ### Features / Enhancements -- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559)) -- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) -- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555)) -- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363)) -- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354)) -- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483)) -- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487)) -- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246)) -- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402)) -- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352)) -- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181)) -- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784)) +- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559)) +- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) +- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555)) +- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363)) +- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354)) +- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483)) +- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487)) +- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246)) +- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402)) +- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352)) +- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181)) +- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784)) ### Bug Fixes -- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473)) -- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468)) -- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416)) -- Fixhancement: follow redirects in curl health check [@V0idC0de](https://github.com/V0idC0de) ([#10415](https://github.com/paperless-ngx/paperless-ngx/pull/10415)) -- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399)) -- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369)) -- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337)) -- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287)) -- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279)) -- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243)) -- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469)) -- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449)) +- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473)) +- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468)) +- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416)) +- Fixhancement: follow redirects in curl health check [@V0idC0de](https://github.com/V0idC0de) ([#10415](https://github.com/paperless-ngx/paperless-ngx/pull/10415)) +- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399)) +- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369)) +- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337)) +- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287)) +- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279)) +- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243)) +- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469)) +- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449)) ### Security -- Address XSS vulnerability GHSA-6p53-hqqw-8j62 +- Address XSS vulnerability GHSA-6p53-hqqw-8j62 ### Maintenance -- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564)) -- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343)) -- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) -- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) -- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465)) -- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397)) -- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) -- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) -- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302)) +- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564)) +- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343)) +- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) +- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) +- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465)) +- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397)) +- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) +- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) +- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302)) ### Dependencies
23 changes -- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561)) -- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564)) -- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) -- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498)) -- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499)) -- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501)) -- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500)) -- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) -- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465)) -- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343)) -- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) -- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311)) -- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) -- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308)) -- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309)) -- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303)) -- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273)) +- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561)) +- docker(deps): Bump astral-sh/uv from 0.8.4-python3.12-bookworm-slim to 0.8.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10564](https://github.com/paperless-ngx/paperless-ngx/pull/10564)) +- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) +- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498)) +- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499)) +- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501)) +- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500)) +- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) +- docker(deps): bump astral-sh/uv from 0.7.19-python3.12-bookworm-slim to 0.8.3-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10465](https://github.com/paperless-ngx/paperless-ngx/pull/10465)) +- docker(deps): Bump astral-sh/uv from 0.7.9-python3.12-bookworm-slim to 0.7.19-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10343](https://github.com/paperless-ngx/paperless-ngx/pull/10343)) +- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) +- Chore(deps): Bump stefanzweifel/git-auto-commit-action from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#10302](https://github.com/paperless-ngx/paperless-ngx/pull/10302)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311)) +- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) +- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308)) +- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309)) +- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303)) +- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273))
### All App Changes @@ -457,142 +851,142 @@
44 changes -- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561)) -- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559)) -- Chore: Removes duplication and spread out config for codespell [@stumpylog](https://github.com/stumpylog) ([#10560](https://github.com/paperless-ngx/paperless-ngx/pull/10560)) -- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) -- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) -- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555)) -- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363)) -- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397)) -- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) -- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498)) -- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499)) -- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501)) -- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500)) -- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496)) -- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483)) -- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487)) -- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) -- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473)) -- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469)) -- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468)) -- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449)) -- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246)) -- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416)) -- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402)) -- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399)) -- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369)) -- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352)) -- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) -- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311)) -- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) -- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308)) -- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309)) -- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303)) -- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181)) -- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784)) -- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287)) -- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279)) -- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273)) -- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243)) +- chore: Small targeted upgrades to dependencies [@stumpylog](https://github.com/stumpylog) ([#10561](https://github.com/paperless-ngx/paperless-ngx/pull/10561)) +- Feature: Add filter to localize dates for filepath templating [@stumpylog](https://github.com/stumpylog) ([#10559](https://github.com/paperless-ngx/paperless-ngx/pull/10559)) +- Chore: Removes duplication and spread out config for codespell [@stumpylog](https://github.com/stumpylog) ([#10560](https://github.com/paperless-ngx/paperless-ngx/pull/10560)) +- Chore(deps): Bump the django group across 1 directory with 9 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10538](https://github.com/paperless-ngx/paperless-ngx/pull/10538)) +- Feature: PDF editor [@shamoon](https://github.com/shamoon) ([#10318](https://github.com/paperless-ngx/paperless-ngx/pull/10318)) +- Enhancement: support webhook restrictions [@shamoon](https://github.com/shamoon) ([#10555](https://github.com/paperless-ngx/paperless-ngx/pull/10555)) +- Performance: Classifier performance optimizations [@Merinorus](https://github.com/Merinorus) ([#10363](https://github.com/paperless-ngx/paperless-ngx/pull/10363)) +- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#10397](https://github.com/paperless-ngx/paperless-ngx/pull/10397)) +- Chore(deps): Bump the small-changes group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10528](https://github.com/paperless-ngx/paperless-ngx/pull/10528)) +- Performance: add setting to enable DB connection pooling for PostgreSQL [@Merinorus](https://github.com/Merinorus) ([#10354](https://github.com/paperless-ngx/paperless-ngx/pull/10354)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10497](https://github.com/paperless-ngx/paperless-ngx/pull/10497)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10498](https://github.com/paperless-ngx/paperless-ngx/pull/10498)) +- Chore(deps-dev): Bump @playwright/test from 1.53.2 to 1.54.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10499](https://github.com/paperless-ngx/paperless-ngx/pull/10499)) +- Chore(deps-dev): Bump webpack from 5.99.9 to 5.101.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10501](https://github.com/paperless-ngx/paperless-ngx/pull/10501)) +- Chore(deps-dev): Bump prettier-plugin-organize-imports from 4.1.0 to 4.2.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10500](https://github.com/paperless-ngx/paperless-ngx/pull/10500)) +- Chore(deps-dev): Bump @types/node from 24.0.10 to 24.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10502](https://github.com/paperless-ngx/paperless-ngx/pull/10502)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10496](https://github.com/paperless-ngx/paperless-ngx/pull/10496)) +- Fixhancement: improve text thumbnail generation for large files [@shamoon](https://github.com/shamoon) ([#10483](https://github.com/paperless-ngx/paperless-ngx/pull/10483)) +- Enhancement: disable auto spellcheck on filtering dropdowns [@TheDodger](https://github.com/TheDodger) ([#10487](https://github.com/paperless-ngx/paperless-ngx/pull/10487)) +- Chore(deps): Bump the small-changes group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10481](https://github.com/paperless-ngx/paperless-ngx/pull/10481)) +- Fix: include ignore for config logos in sanity checker [@shamoon](https://github.com/shamoon) ([#10473](https://github.com/paperless-ngx/paperless-ngx/pull/10473)) +- Chore: add tasks task_id param to openapi spec [@shamoon](https://github.com/shamoon) ([#10469](https://github.com/paperless-ngx/paperless-ngx/pull/10469)) +- Fix: track and restore changed document fields from session storage [@shamoon](https://github.com/shamoon) ([#10468](https://github.com/paperless-ngx/paperless-ngx/pull/10468)) +- Chore: include advanced search query param in API spec [@shamoon](https://github.com/shamoon) ([#10449](https://github.com/paperless-ngx/paperless-ngx/pull/10449)) +- Enhancement: display saved view counts [@shamoon](https://github.com/shamoon) ([#10246](https://github.com/paperless-ngx/paperless-ngx/pull/10246)) +- Fix: Make some natural keyword date searches timezone-aware [@shamoon](https://github.com/shamoon) ([#10416](https://github.com/paperless-ngx/paperless-ngx/pull/10416)) +- Fixhancement: add missing exact operator for boolean CF queries [@shamoon](https://github.com/shamoon) ([#10402](https://github.com/paperless-ngx/paperless-ngx/pull/10402)) +- Fix: dont use translated verbose_name for getting object perms [@shamoon](https://github.com/shamoon) ([#10399](https://github.com/paperless-ngx/paperless-ngx/pull/10399)) +- Fix: fix date format for 'today' in DateComponent [@shamoon](https://github.com/shamoon) ([#10369](https://github.com/paperless-ngx/paperless-ngx/pull/10369)) +- Feature: add Vietnamese translation [@shamoon](https://github.com/shamoon) ([#10352](https://github.com/paperless-ngx/paperless-ngx/pull/10352)) +- Chore(deps): Bump the small-changes group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10347](https://github.com/paperless-ngx/paperless-ngx/pull/10347)) +- Fix: default to empty permissions for group creation [@shamoon](https://github.com/shamoon) ([#10337](https://github.com/paperless-ngx/paperless-ngx/pull/10337)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10311](https://github.com/paperless-ngx/paperless-ngx/pull/10311)) +- Chore(deps-dev): Bump @types/node from 22.15.29 to 24.0.10 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10306](https://github.com/paperless-ngx/paperless-ngx/pull/10306)) +- Chore(deps): Bump bootstrap from 5.3.6 to 5.3.7 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10308](https://github.com/paperless-ngx/paperless-ngx/pull/10308)) +- Chore(deps-dev): Bump webpack from 5.98.0 to 5.99.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10309](https://github.com/paperless-ngx/paperless-ngx/pull/10309)) +- Chore(deps-dev): Bump @playwright/test from 1.51.1 to 1.53.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10307](https://github.com/paperless-ngx/paperless-ngx/pull/10307)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10303](https://github.com/paperless-ngx/paperless-ngx/pull/10303)) +- Performance: Add support for configuring date parser languages [@Merinorus](https://github.com/Merinorus) ([#10181](https://github.com/paperless-ngx/paperless-ngx/pull/10181)) +- Enhancement: Add a database caching for improved performance [@Merinorus](https://github.com/Merinorus) ([#9784](https://github.com/paperless-ngx/paperless-ngx/pull/9784)) +- Fix: correct api created coercion with timezone [@shamoon](https://github.com/shamoon) ([#10287](https://github.com/paperless-ngx/paperless-ngx/pull/10287)) +- Fix: reset search query for preview on reset filter [@shamoon](https://github.com/shamoon) ([#10279](https://github.com/paperless-ngx/paperless-ngx/pull/10279)) +- Chore: update to Angular 20 [@shamoon](https://github.com/shamoon) ([#10273](https://github.com/paperless-ngx/paperless-ngx/pull/10273)) +- Chore: reject absurd max age values [@shamoon](https://github.com/shamoon) ([#10243](https://github.com/paperless-ngx/paperless-ngx/pull/10243))
## paperless-ngx 2.17.1 ### Bug Fixes -- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227)) +- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227)) ### All App Changes -- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227)) +- Fix: correct PAPERLESS_EMPTY_TRASH_DIR to Path [@shamoon](https://github.com/shamoon) ([#10227](https://github.com/paperless-ngx/paperless-ngx/pull/10227)) ## paperless-ngx 2.17.0 ### Breaking Changes -- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) +- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) ### Features / Enhancements -- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214)) -- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183)) -- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073)) +- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214)) +- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183)) +- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073)) ### Bug Fixes -- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204)) -- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) -- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196)) -- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194)) -- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191)) -- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164)) -- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157)) -- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151)) -- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148)) +- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204)) +- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) +- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196)) +- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194)) +- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191)) +- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164)) +- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157)) +- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151)) +- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148)) ### Dependencies -- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212)) +- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212)) ### All App Changes
14 changes -- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214)) -- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204)) -- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) -- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9933](https://github.com/paperless-ngx/paperless-ngx/pull/9933)) -- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212)) -- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196)) -- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194)) -- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191)) -- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183)) -- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073)) -- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164)) -- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157)) -- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151)) -- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148)) +- QoL: log version at startup, show backend vs frontend mismatch in system status [@shamoon](https://github.com/shamoon) ([#10214](https://github.com/paperless-ngx/paperless-ngx/pull/10214)) +- Fix: more api fixes [@shamoon](https://github.com/shamoon) ([#10204](https://github.com/paperless-ngx/paperless-ngx/pull/10204)) +- Fix: restore expected pre-2.16 scheduled workflow offset behavior [@shamoon](https://github.com/shamoon) ([#10218](https://github.com/paperless-ngx/paperless-ngx/pull/10218)) +- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9933](https://github.com/paperless-ngx/paperless-ngx/pull/9933)) +- Chore: bump angular/common to 19.12.14 [@shamoon](https://github.com/shamoon) ([#10212](https://github.com/paperless-ngx/paperless-ngx/pull/10212)) +- Fix: fix some API crashes [@shamoon](https://github.com/shamoon) ([#10196](https://github.com/paperless-ngx/paperless-ngx/pull/10196)) +- Fix: remove duplicate base path in websocket urls [@robertmx](https://github.com/robertmx) ([#10194](https://github.com/paperless-ngx/paperless-ngx/pull/10194)) +- Fix: use hard delete for custom fields with workflow removal [@shamoon](https://github.com/shamoon) ([#10191](https://github.com/paperless-ngx/paperless-ngx/pull/10191)) +- Feature: add Persian translation [@shamoon](https://github.com/shamoon) ([#10183](https://github.com/paperless-ngx/paperless-ngx/pull/10183)) +- Enhancement: support import of zipped export [@kaerbr](https://github.com/kaerbr) ([#10073](https://github.com/paperless-ngx/paperless-ngx/pull/10073)) +- Fix: fix mail account test api schema [@shamoon](https://github.com/shamoon) ([#10164](https://github.com/paperless-ngx/paperless-ngx/pull/10164)) +- Fix: correct api schema for mail_account process [@shamoon](https://github.com/shamoon) ([#10157](https://github.com/paperless-ngx/paperless-ngx/pull/10157)) +- Fix: correct api schema for next_asn [@shamoon](https://github.com/shamoon) ([#10151](https://github.com/paperless-ngx/paperless-ngx/pull/10151)) +- Fix: fix email and notes endpoints api spec [@shamoon](https://github.com/shamoon) ([#10148](https://github.com/paperless-ngx/paperless-ngx/pull/10148))
## paperless-ngx 2.16.3 ### Features / Enhancements -- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031)) -- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994)) -- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977)) +- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031)) +- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994)) +- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977)) ### Bug Fixes -- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121)) -- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107)) -- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049)) -- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070)) -- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066)) +- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121)) +- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107)) +- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049)) +- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070)) +- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066)) ### Dependencies
10 changes -- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085)) -- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100)) -- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090)) -- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089)) -- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088)) -- docker(deps): bump astral-sh/uv from 0.7.8-python3.12-bookworm-slim to 0.7.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10084](https://github.com/paperless-ngx/paperless-ngx/pull/10084)) -- docker(deps): Bump astral-sh/uv from 0.6.16-python3.12-bookworm-slim to 0.7.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10056](https://github.com/paperless-ngx/paperless-ngx/pull/10056)) +- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100)) +- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090)) +- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089)) +- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088)) +- docker(deps): bump astral-sh/uv from 0.7.8-python3.12-bookworm-slim to 0.7.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10084](https://github.com/paperless-ngx/paperless-ngx/pull/10084)) +- docker(deps): Bump astral-sh/uv from 0.6.16-python3.12-bookworm-slim to 0.7.8-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#10056](https://github.com/paperless-ngx/paperless-ngx/pull/10056))
### All App Changes @@ -600,116 +994,116 @@
16 changes -- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121)) -- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031)) -- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085)) -- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994)) -- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055)) -- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100)) -- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090)) -- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089)) -- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088)) -- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049)) -- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977)) -- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070)) -- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066)) +- Fix: handle whoosh query correction errors [@shamoon](https://github.com/shamoon) ([#10121](https://github.com/paperless-ngx/paperless-ngx/pull/10121)) +- Performance: pre-filter document list in scheduled workflow checks [@shamoon](https://github.com/shamoon) ([#10031](https://github.com/paperless-ngx/paperless-ngx/pull/10031)) +- Chore(deps): Bump the small-changes group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10085](https://github.com/paperless-ngx/paperless-ngx/pull/10085)) +- Chore: refactor consumer plugin checks to a pre-flight plugin [@shamoon](https://github.com/shamoon) ([#9994](https://github.com/paperless-ngx/paperless-ngx/pull/9994)) +- Chore(deps): Update granian[uvloop] requirement from ~=2.2.0 to ~=2.3.2 @[dependabot[bot]](https://github.com/apps/dependabot) ([#10055](https://github.com/paperless-ngx/paperless-ngx/pull/10055)) +- Fix: handle favicon with non-default static dir [@shamoon](https://github.com/shamoon) ([#10107](https://github.com/paperless-ngx/paperless-ngx/pull/10107)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 18 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10099](https://github.com/paperless-ngx/paperless-ngx/pull/10099)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#10100](https://github.com/paperless-ngx/paperless-ngx/pull/10100)) +- Chore(deps): Bump bootstrap from 5.3.3 to 5.3.6 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10091](https://github.com/paperless-ngx/paperless-ngx/pull/10091)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.9.0 to 1.9.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10090](https://github.com/paperless-ngx/paperless-ngx/pull/10090)) +- Chore(deps-dev): Bump @types/node from 22.15.3 to 22.15.29 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10089](https://github.com/paperless-ngx/paperless-ngx/pull/10089)) +- Chore(deps): Bump zone.js from 0.15.0 to 0.15.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#10088](https://github.com/paperless-ngx/paperless-ngx/pull/10088)) +- Fixhancement: cleanup user or group references in settings upon deletion [@shamoon](https://github.com/shamoon) ([#10049](https://github.com/paperless-ngx/paperless-ngx/pull/10049)) +- Enhancement: include DOCUMENT_TYPE to post consume scripts [@matthesrieke](https://github.com/matthesrieke) ([#9977](https://github.com/paperless-ngx/paperless-ngx/pull/9977)) +- Fix: Add exception to in [@Freilichtbuehne](https://github.com/Freilichtbuehne) ([#10070](https://github.com/paperless-ngx/paperless-ngx/pull/10070)) +- Fix: include base href when opening global search result in new window [@shamoon](https://github.com/shamoon) ([#10066](https://github.com/paperless-ngx/paperless-ngx/pull/10066))
## paperless-ngx 2.16.2 ### Bug Fixes -- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021)) -- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026)) -- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022)) -- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023)) +- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021)) +- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026)) +- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022)) +- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023)) ### Dependencies -- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980)) +- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980)) ### All App Changes
5 changes -- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021)) -- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023)) -- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026)) -- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022)) -- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980)) +- Fix: accept datetime for created [@shamoon](https://github.com/shamoon) ([#10021](https://github.com/paperless-ngx/paperless-ngx/pull/10021)) +- Fix: add fallback to copyfile on PermissionError @samuel-kosmann ([#10023](https://github.com/paperless-ngx/paperless-ngx/pull/10023)) +- Fix: created date fixes in v2.16 [@shamoon](https://github.com/shamoon) ([#10026](https://github.com/paperless-ngx/paperless-ngx/pull/10026)) +- Fix: mark fields for created objects as dirty [@shamoon](https://github.com/shamoon) ([#10022](https://github.com/paperless-ngx/paperless-ngx/pull/10022)) +- Chore: warn users about removal of postgres v13 support [@shamoon](https://github.com/shamoon) ([#9980](https://github.com/paperless-ngx/paperless-ngx/pull/9980))
## paperless-ngx 2.16.1 ### Bug Fixes -- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976)) +- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976)) ### All App Changes -- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976)) +- Fix: fix created date filtering broken in 2.16.0 [@shamoon](https://github.com/shamoon) ([#9976](https://github.com/paperless-ngx/paperless-ngx/pull/9976)) ## paperless-ngx 2.16.0 ### Breaking Changes -- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793)) +- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793)) ### Features -- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746)) -- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771)) -- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744)) -- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949)) -- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876)) -- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742)) -- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743)) -- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762)) -- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804)) +- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746)) +- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771)) +- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744)) +- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949)) +- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876)) +- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742)) +- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743)) +- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762)) +- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804)) ### Bug Fixes -- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738)) -- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962)) -- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946)) -- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846)) -- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834)) -- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817)) -- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761)) +- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738)) +- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962)) +- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946)) +- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846)) +- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834)) +- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817)) +- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761)) ### Maintenance -- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842)) -- Chore: split ci frontend e2e vs unit tests [@shamoon](https://github.com/shamoon) ([#9851](https://github.com/paperless-ngx/paperless-ngx/pull/9851)) -- Chore: auto-generate translation strings [@shamoon](https://github.com/shamoon) ([#9462](https://github.com/paperless-ngx/paperless-ngx/pull/9462)) -- Chore: add ymlfmt [@shamoon](https://github.com/shamoon) ([#9745](https://github.com/paperless-ngx/paperless-ngx/pull/9745)) -- Chore: replace secretary with GHA [@shamoon](https://github.com/shamoon) ([#9723](https://github.com/paperless-ngx/paperless-ngx/pull/9723)) -- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924)) -- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926)) +- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842)) +- Chore: split ci frontend e2e vs unit tests [@shamoon](https://github.com/shamoon) ([#9851](https://github.com/paperless-ngx/paperless-ngx/pull/9851)) +- Chore: auto-generate translation strings [@shamoon](https://github.com/shamoon) ([#9462](https://github.com/paperless-ngx/paperless-ngx/pull/9462)) +- Chore: add ymlfmt [@shamoon](https://github.com/shamoon) ([#9745](https://github.com/paperless-ngx/paperless-ngx/pull/9745)) +- Chore: replace secretary with GHA [@shamoon](https://github.com/shamoon) ([#9723](https://github.com/paperless-ngx/paperless-ngx/pull/9723)) +- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924)) +- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926)) ### Dependencies
14 changes -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921)) -- docker-compose(deps): Bump library/redis from 7 to 8 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9879](https://github.com/paperless-ngx/paperless-ngx/pull/9879)) -- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849)) -- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850)) -- docker(deps): Bump astral-sh/uv from 0.6.14-python3.12-bookworm-slim to 0.6.16-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9767](https://github.com/paperless-ngx/paperless-ngx/pull/9767)) -- docker-compose(deps): bump gotenberg/gotenberg from 8.19 to 8.20 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9661](https://github.com/paperless-ngx/paperless-ngx/pull/9661)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769)) -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764)) -- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753)) -- docker(deps): bump astral-sh/uv from 0.6.13-python3.12-bookworm-slim to 0.6.14-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9656](https://github.com/paperless-ngx/paperless-ngx/pull/9656)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921)) +- docker-compose(deps): Bump library/redis from 7 to 8 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9879](https://github.com/paperless-ngx/paperless-ngx/pull/9879)) +- Chore(deps): Bump astral-sh/setup-uv from 5 to 6 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9842](https://github.com/paperless-ngx/paperless-ngx/pull/9842)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849)) +- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850)) +- docker(deps): Bump astral-sh/uv from 0.6.14-python3.12-bookworm-slim to 0.6.16-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9767](https://github.com/paperless-ngx/paperless-ngx/pull/9767)) +- docker-compose(deps): bump gotenberg/gotenberg from 8.19 to 8.20 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9661](https://github.com/paperless-ngx/paperless-ngx/pull/9661)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764)) +- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753)) +- docker(deps): bump astral-sh/uv from 0.6.13-python3.12-bookworm-slim to 0.6.14-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9656](https://github.com/paperless-ngx/paperless-ngx/pull/9656))
### All App Changes @@ -717,232 +1111,232 @@
29 changes -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921)) -- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962)) -- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949)) -- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946)) -- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793)) -- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926)) -- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924)) -- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746)) -- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876)) -- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849)) -- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850)) -- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846)) -- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834)) -- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817)) -- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804)) -- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769)) -- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743)) -- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744)) -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764)) -- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753)) -- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762)) -- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761)) -- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9339](https://github.com/paperless-ngx/paperless-ngx/pull/9339)) -- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9921](https://github.com/paperless-ngx/paperless-ngx/pull/9921)) +- Fix: handle created change with api version increment, use created only on frontend, deprecate created_date [@shamoon](https://github.com/shamoon) ([#9962](https://github.com/paperless-ngx/paperless-ngx/pull/9962)) +- Fixhancement: automatically disable email verification if no smtp setup [@shamoon](https://github.com/shamoon) ([#9949](https://github.com/paperless-ngx/paperless-ngx/pull/9949)) +- Fix: ignore logo file from sanity checker [@shamoon](https://github.com/shamoon) ([#9946](https://github.com/paperless-ngx/paperless-ngx/pull/9946)) +- [BREAKING] Change: treat created as date not datetime [@shamoon](https://github.com/shamoon) ([#9793](https://github.com/paperless-ngx/paperless-ngx/pull/9793)) +- Fix/Chore: replace file drop package [@shamoon](https://github.com/shamoon) ([#9926](https://github.com/paperless-ngx/paperless-ngx/pull/9926)) +- Chore: resolve dynamic import warnings from pdfjs, again [@shamoon](https://github.com/shamoon) ([#9924](https://github.com/paperless-ngx/paperless-ngx/pull/9924)) +- Enhancement: support negative offset in scheduled workflows [@shamoon](https://github.com/shamoon) ([#9746](https://github.com/paperless-ngx/paperless-ngx/pull/9746)) +- Fixhancement: better handle removed social apps in profile [@shamoon](https://github.com/shamoon) ([#9876](https://github.com/paperless-ngx/paperless-ngx/pull/9876)) +- Enhancement: add barcode frontend config [@shamoon](https://github.com/shamoon) ([#9742](https://github.com/paperless-ngx/paperless-ngx/pull/9742)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9848](https://github.com/paperless-ngx/paperless-ngx/pull/9848)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9849](https://github.com/paperless-ngx/paperless-ngx/pull/9849)) +- Chore(deps-dev): Bump @types/node from 22.13.17 to 22.15.3 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9850](https://github.com/paperless-ngx/paperless-ngx/pull/9850)) +- Fix: correctly handle empty user for old notes api format, fix frontend API version [@shamoon](https://github.com/shamoon) ([#9846](https://github.com/paperless-ngx/paperless-ngx/pull/9846)) +- Fix: fix single select in filterable dropdowns when editing [@shamoon](https://github.com/shamoon) ([#9834](https://github.com/paperless-ngx/paperless-ngx/pull/9834)) +- Fix: always update classifier task result [@shamoon](https://github.com/shamoon) ([#9817](https://github.com/paperless-ngx/paperless-ngx/pull/9817)) +- Fixhancement: check more permissions for status consumer messages [@shamoon](https://github.com/shamoon) ([#9804](https://github.com/paperless-ngx/paperless-ngx/pull/9804)) +- Enhancement: support heic images [@shamoon](https://github.com/shamoon) ([#9771](https://github.com/paperless-ngx/paperless-ngx/pull/9771)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9768](https://github.com/paperless-ngx/paperless-ngx/pull/9768)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9770](https://github.com/paperless-ngx/paperless-ngx/pull/9770)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.4 to 14.5.5 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9769](https://github.com/paperless-ngx/paperless-ngx/pull/9769)) +- Enhancement: support allauth disable unknown account emails [@shamoon](https://github.com/shamoon) ([#9743](https://github.com/paperless-ngx/paperless-ngx/pull/9743)) +- Enhancement: use patch instead of put for frontend document changes [@shamoon](https://github.com/shamoon) ([#9744](https://github.com/paperless-ngx/paperless-ngx/pull/9744)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9764](https://github.com/paperless-ngx/paperless-ngx/pull/9764)) +- Chore(deps): Bump the django group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9753](https://github.com/paperless-ngx/paperless-ngx/pull/9753)) +- Fixhancement: tag plus button should add tag to doc [@shamoon](https://github.com/shamoon) ([#9762](https://github.com/paperless-ngx/paperless-ngx/pull/9762)) +- Fix: fix zoom increase/decrease buttons in FF [@shamoon](https://github.com/shamoon) ([#9761](https://github.com/paperless-ngx/paperless-ngx/pull/9761)) +- Chore: switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9339](https://github.com/paperless-ngx/paperless-ngx/pull/9339)) +- Fix: include subpath in drf-spectacular settings if set [@shamoon](https://github.com/shamoon) ([#9738](https://github.com/paperless-ngx/paperless-ngx/pull/9738))
## paperless-ngx 2.15.3 ### Bug Fixes -- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684)) -- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702)) -- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714)) -- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700)) -- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674)) +- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684)) +- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702)) +- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714)) +- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700)) +- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674)) ### All App Changes
5 changes -- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684)) -- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702)) -- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714)) -- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700)) -- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674)) +- Fix: do not try deleting original file that was moved to trash dir [@shamoon](https://github.com/shamoon) ([#9684](https://github.com/paperless-ngx/paperless-ngx/pull/9684)) +- Fix: preserve non-ASCII filenames in document downloads [@shamoon](https://github.com/shamoon) ([#9702](https://github.com/paperless-ngx/paperless-ngx/pull/9702)) +- Fix: fix breaking api change to document notes user field [@shamoon](https://github.com/shamoon) ([#9714](https://github.com/paperless-ngx/paperless-ngx/pull/9714)) +- Fix: another doc link fix [@shamoon](https://github.com/shamoon) ([#9700](https://github.com/paperless-ngx/paperless-ngx/pull/9700)) +- Fix: correctly handle dict data with webhook [@shamoon](https://github.com/shamoon) ([#9674](https://github.com/paperless-ngx/paperless-ngx/pull/9674))
## paperless-ngx 2.15.2 ### Bug Fixes -- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616)) -- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643)) -- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629)) +- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616)) +- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643)) +- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629)) ### Dependencies -- Chore: Bump celery to 5.5.1 [@hannesortmeier](https://github.com/hannesortmeier) ([#9642](https://github.com/paperless-ngx/paperless-ngx/pull/9642)) +- Chore: Bump celery to 5.5.1 [@hannesortmeier](https://github.com/hannesortmeier) ([#9642](https://github.com/paperless-ngx/paperless-ngx/pull/9642)) ### All App Changes
4 changes -- Tweak: consistently use created date when displaying doc in list [@shamoon](https://github.com/shamoon) ([#9651](https://github.com/paperless-ngx/paperless-ngx/pull/9651)) -- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616)) -- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643)) -- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629)) +- Tweak: consistently use created date when displaying doc in list [@shamoon](https://github.com/shamoon) ([#9651](https://github.com/paperless-ngx/paperless-ngx/pull/9651)) +- Fix: Adds better handling during folder checking/creation/permissions for non-root [@stumpylog](https://github.com/stumpylog) ([#9616](https://github.com/paperless-ngx/paperless-ngx/pull/9616)) +- Fix: Explicitly set the HOME environment to resolve issues running as root with database certificates [@stumpylog](https://github.com/stumpylog) ([#9643](https://github.com/paperless-ngx/paperless-ngx/pull/9643)) +- Fix: prevent self-linking when bulk edit doc link [@shamoon](https://github.com/shamoon) ([#9629](https://github.com/paperless-ngx/paperless-ngx/pull/9629))
## paperless-ngx 2.15.1 ### Bug Fixes -- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604)) -- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601)) -- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599)) -- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594)) +- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604)) +- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601)) +- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599)) +- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594)) ### Maintenance -- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573)) +- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573)) ### Dependencies -- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573)) -- Chore: move to whoosh-reloaded, for now [@shamoon](https://github.com/shamoon) ([#9605](https://github.com/paperless-ngx/paperless-ngx/pull/9605)) +- docker(deps): Bump astral-sh/uv from 0.6.9-python3.12-bookworm-slim to 0.6.13-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9573](https://github.com/paperless-ngx/paperless-ngx/pull/9573)) +- Chore: move to whoosh-reloaded, for now [@shamoon](https://github.com/shamoon) ([#9605](https://github.com/paperless-ngx/paperless-ngx/pull/9605)) ### All App Changes
4 changes -- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604)) -- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601)) -- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599)) -- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594)) +- Fix: Run migration lock as the correct user [@stumpylog](https://github.com/stumpylog) ([#9604](https://github.com/paperless-ngx/paperless-ngx/pull/9604)) +- Fix: Adds a warning to the user if their secret file includes a trailing newline [@stumpylog](https://github.com/stumpylog) ([#9601](https://github.com/paperless-ngx/paperless-ngx/pull/9601)) +- Fix: correct download filename in 2.15.0 [@shamoon](https://github.com/shamoon) ([#9599](https://github.com/paperless-ngx/paperless-ngx/pull/9599)) +- Fix: dont exclude matching check for scheduled workflows [@shamoon](https://github.com/shamoon) ([#9594](https://github.com/paperless-ngx/paperless-ngx/pull/9594))
## paperless-ngx 2.15.0 ### Features -- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500)) -- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429)) -- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307)) -- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305)) -- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272)) -- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269)) -- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218)) -- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244)) -- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106)) -- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214)) -- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039)) -- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199)) -- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950)) -- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170)) -- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128)) -- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076)) -- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074)) -- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948)) -- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946)) -- Feature: Transition Docker to use s6 overlay [@stumpylog](https://github.com/stumpylog) ([#8886](https://github.com/paperless-ngx/paperless-ngx/pull/8886)) -- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980)) -- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033)) -- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004)) -- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017)) +- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500)) +- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429)) +- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307)) +- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305)) +- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272)) +- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269)) +- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218)) +- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244)) +- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106)) +- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214)) +- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039)) +- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199)) +- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950)) +- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170)) +- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128)) +- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076)) +- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074)) +- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948)) +- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946)) +- Feature: Transition Docker to use s6 overlay [@stumpylog](https://github.com/stumpylog) ([#8886](https://github.com/paperless-ngx/paperless-ngx/pull/8886)) +- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980)) +- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033)) +- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004)) +- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017)) ### Bug Fixes -- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580)) -- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559)) -- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542)) -- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533)) -- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459)) -- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453)) -- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393)) -- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392)) -- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387)) -- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384)) -- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360)) -- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359)) -- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356)) -- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336)) -- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331)) -- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321)) -- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322)) -- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293)) -- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271)) -- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225)) -- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219)) -- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195)) -- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168)) -- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148)) -- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147)) -- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140)) -- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139)) -- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127)) -- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085)) -- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058)) -- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996)) -- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012)) +- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580)) +- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559)) +- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542)) +- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533)) +- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459)) +- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453)) +- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393)) +- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392)) +- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387)) +- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384)) +- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360)) +- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359)) +- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356)) +- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336)) +- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331)) +- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321)) +- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322)) +- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293)) +- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271)) +- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225)) +- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219)) +- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195)) +- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168)) +- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148)) +- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147)) +- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140)) +- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139)) +- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127)) +- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085)) +- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058)) +- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996)) +- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012)) ### Maintenance -- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488)) -- Chore: Enables dependabot for Dockerfile and our Compose files [@stumpylog](https://github.com/stumpylog) ([#9342](https://github.com/paperless-ngx/paperless-ngx/pull/9342)) -- Chore: ensure codecov upload gets attempted [@shamoon](https://github.com/shamoon) ([#9308](https://github.com/paperless-ngx/paperless-ngx/pull/9308)) -- Chore: Split out some items into extras [@stumpylog](https://github.com/stumpylog) ([#9297](https://github.com/paperless-ngx/paperless-ngx/pull/9297)) -- Chore: Enables Codecov test reporting for the backend [@stumpylog](https://github.com/stumpylog) ([#9295](https://github.com/paperless-ngx/paperless-ngx/pull/9295)) -- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292)) +- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488)) +- Chore: Enables dependabot for Dockerfile and our Compose files [@stumpylog](https://github.com/stumpylog) ([#9342](https://github.com/paperless-ngx/paperless-ngx/pull/9342)) +- Chore: ensure codecov upload gets attempted [@shamoon](https://github.com/shamoon) ([#9308](https://github.com/paperless-ngx/paperless-ngx/pull/9308)) +- Chore: Split out some items into extras [@stumpylog](https://github.com/stumpylog) ([#9297](https://github.com/paperless-ngx/paperless-ngx/pull/9297)) +- Chore: Enables Codecov test reporting for the backend [@stumpylog](https://github.com/stumpylog) ([#9295](https://github.com/paperless-ngx/paperless-ngx/pull/9295)) +- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292)) ### Dependencies
43 changes -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538)) -- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537)) -- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540)) -- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486)) -- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371)) -- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348)) -- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347)) -- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345)) -- docker-compose(deps): Bump library/postgres from 16 to 17 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9353](https://github.com/paperless-ngx/paperless-ngx/pull/9353)) -- docker(deps): Bump astral-sh/uv from 0.6.3-python3.12-bookworm-slim to 0.6.5-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9344](https://github.com/paperless-ngx/paperless-ngx/pull/9344)) -- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288)) -- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289)) -- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267)) -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.9.0 to 0.10.0 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9252](https://github.com/paperless-ngx/paperless-ngx/pull/9252)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256)) -- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255)) -- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258)) -- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254)) -- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143)) -- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142)) -- Dependencies: Updates to jbig2enc 0.30 [@stumpylog](https://github.com/stumpylog) ([#9092](https://github.com/paperless-ngx/paperless-ngx/pull/9092)) -- Chore(deps): Bump cryptography from 44.0.0 to 44.0.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9080](https://github.com/paperless-ngx/paperless-ngx/pull/9080)) -- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064)) -- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061)) -- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065)) -- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013)) -- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014)) -- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991)) -- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993)) -- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538)) +- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537)) +- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540)) +- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486)) +- docker(deps): Bump astral-sh/uv from 0.6.5-python3.12-bookworm-slim to 0.6.9-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9488](https://github.com/paperless-ngx/paperless-ngx/pull/9488)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371)) +- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348)) +- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347)) +- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345)) +- docker-compose(deps): Bump library/postgres from 16 to 17 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#9353](https://github.com/paperless-ngx/paperless-ngx/pull/9353)) +- docker(deps): Bump astral-sh/uv from 0.6.3-python3.12-bookworm-slim to 0.6.5-python3.12-bookworm-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#9344](https://github.com/paperless-ngx/paperless-ngx/pull/9344)) +- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288)) +- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289)) +- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.9.0 to 0.10.0 in the actions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9252](https://github.com/paperless-ngx/paperless-ngx/pull/9252)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256)) +- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255)) +- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258)) +- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254)) +- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143)) +- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142)) +- Dependencies: Updates to jbig2enc 0.30 [@stumpylog](https://github.com/stumpylog) ([#9092](https://github.com/paperless-ngx/paperless-ngx/pull/9092)) +- Chore(deps): Bump cryptography from 44.0.0 to 44.0.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9080](https://github.com/paperless-ngx/paperless-ngx/pull/9080)) +- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064)) +- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061)) +- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065)) +- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013)) +- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014)) +- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991)) +- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993)) +- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986))
### All App Changes @@ -950,365 +1344,365 @@
109 changes -- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580)) -- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559)) -- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538)) -- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537)) -- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540)) -- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533)) -- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500)) -- Fix: fix cf dropdown placement on mobile [@shamoon](https://github.com/shamoon) ([#9508](https://github.com/paperless-ngx/paperless-ngx/pull/9508)) -- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486)) -- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459)) -- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453)) -- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429)) -- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393)) -- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392)) -- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387)) -- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371)) -- Development: change frontend package manager to pnpm [@shamoon](https://github.com/shamoon) ([#9363](https://github.com/paperless-ngx/paperless-ngx/pull/9363)) -- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360)) -- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359)) -- Tweak: add saved views hint to dashboard [@shamoon](https://github.com/shamoon) ([#9362](https://github.com/paperless-ngx/paperless-ngx/pull/9362)) -- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348)) -- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347)) -- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345)) -- Ensure the directories have been overridden and created for this test [@stumpylog](https://github.com/stumpylog) ([#9354](https://github.com/paperless-ngx/paperless-ngx/pull/9354)) -- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356)) -- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336)) -- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331)) -- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321)) -- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322)) -- Chore: Switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9060](https://github.com/paperless-ngx/paperless-ngx/pull/9060)) -- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307)) -- Chore: remove popper preventOverflow fix [@shamoon](https://github.com/shamoon) ([#9306](https://github.com/paperless-ngx/paperless-ngx/pull/9306)) -- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305)) -- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272)) -- Chore: add codecov frontend test results [@shamoon](https://github.com/shamoon) ([#9296](https://github.com/paperless-ngx/paperless-ngx/pull/9296)) -- Chore: Removes undocumented FileInfo [@stumpylog](https://github.com/stumpylog) ([#9298](https://github.com/paperless-ngx/paperless-ngx/pull/9298)) -- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288)) -- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293)) -- Chore: Removes the unused Log model and LogFilterSet [@stumpylog](https://github.com/stumpylog) ([#9294](https://github.com/paperless-ngx/paperless-ngx/pull/9294)) -- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292)) -- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289)) -- Chore: Switch from pipenv to uv [@stumpylog](https://github.com/stumpylog) ([#9251](https://github.com/paperless-ngx/paperless-ngx/pull/9251)) -- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269)) -- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271)) -- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256)) -- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259)) -- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255)) -- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258)) -- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254)) -- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218)) -- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244)) -- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106)) -- Chore: Switch remote version check to HTTPx [@stumpylog](https://github.com/stumpylog) ([#9232](https://github.com/paperless-ngx/paperless-ngx/pull/9232)) -- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225)) -- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219)) -- Chore: Reduce imports for a slight memory improvement [@stumpylog](https://github.com/stumpylog) ([#9217](https://github.com/paperless-ngx/paperless-ngx/pull/9217)) -- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214)) -- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039)) -- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199)) -- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195)) -- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950)) -- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170)) -- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168)) -- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143)) -- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142)) -- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148)) -- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147)) -- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140)) -- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139)) -- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128)) -- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127)) -- Chore: more efficient select cf update handler [@shamoon](https://github.com/shamoon) ([#9099](https://github.com/paperless-ngx/paperless-ngx/pull/9099)) -- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085)) -- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076)) -- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074)) -- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064)) -- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061)) -- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065)) -- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063)) -- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948)) -- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058)) -- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946)) -- Enhancement: add layout options for email conversion [@RazielleS](https://github.com/RazielleS) ([#8907](https://github.com/paperless-ngx/paperless-ngx/pull/8907)) -- Chore: Enable ruff FBT [@gothicVI](https://github.com/gothicVI) ([#8645](https://github.com/paperless-ngx/paperless-ngx/pull/8645)) -- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980)) -- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033)) -- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996)) -- Tweak: improve date matching regex for dates after numbers [@XstreamGit](https://github.com/XstreamGit) ([#8964](https://github.com/paperless-ngx/paperless-ngx/pull/8964)) -- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004)) -- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013)) -- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014)) -- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012)) -- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991)) -- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993)) -- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986)) +- Fix: ensure only matched scheduled workflows are applied [@shamoon](https://github.com/shamoon) ([#9580](https://github.com/paperless-ngx/paperless-ngx/pull/9580)) +- Fix: fix large doc thumb hidden at unexpected screen sizes [@shamoon](https://github.com/shamoon) ([#9559](https://github.com/paperless-ngx/paperless-ngx/pull/9559)) +- Fix: fix potential race condition when creating new cf from doc details [@shamoon](https://github.com/shamoon) ([#9542](https://github.com/paperless-ngx/paperless-ngx/pull/9542)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9536](https://github.com/paperless-ngx/paperless-ngx/pull/9536)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9538](https://github.com/paperless-ngx/paperless-ngx/pull/9538)) +- Chore(deps-dev): Bump @types/node from 22.13.9 to 22.13.17 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9539](https://github.com/paperless-ngx/paperless-ngx/pull/9539)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.3 to 14.5.4 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9537](https://github.com/paperless-ngx/paperless-ngx/pull/9537)) +- Chore(deps-dev): Bump @playwright/test from 1.50.1 to 1.51.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9540](https://github.com/paperless-ngx/paperless-ngx/pull/9540)) +- Fix: fix doc link input [@shamoon](https://github.com/shamoon) ([#9533](https://github.com/paperless-ngx/paperless-ngx/pull/9533)) +- Enhancement: allow webUI first account signup [@shamoon](https://github.com/shamoon) ([#9500](https://github.com/paperless-ngx/paperless-ngx/pull/9500)) +- Fix: fix cf dropdown placement on mobile [@shamoon](https://github.com/shamoon) ([#9508](https://github.com/paperless-ngx/paperless-ngx/pull/9508)) +- Chore(deps): Bump django from 5.1.6 to 5.1.7 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9486](https://github.com/paperless-ngx/paperless-ngx/pull/9486)) +- Fix: only overwrite existing cf values in workflow if set [@shamoon](https://github.com/shamoon) ([#9459](https://github.com/paperless-ngx/paperless-ngx/pull/9459)) +- Fix: fix auto-close when doc update no longer has permissions [@shamoon](https://github.com/shamoon) ([#9453](https://github.com/paperless-ngx/paperless-ngx/pull/9453)) +- Enhancement: support more 'not assigned' filtering, refactor [@shamoon](https://github.com/shamoon) ([#9429](https://github.com/paperless-ngx/paperless-ngx/pull/9429)) +- Change: better handle permissions in patch requests [@shamoon](https://github.com/shamoon) ([#9393](https://github.com/paperless-ngx/paperless-ngx/pull/9393)) +- Fix: use correct filename with webhook [@shamoon](https://github.com/shamoon) ([#9392](https://github.com/paperless-ngx/paperless-ngx/pull/9392)) +- Change: sync OIDC groups on first login too [@shamoon](https://github.com/shamoon) ([#9387](https://github.com/paperless-ngx/paperless-ngx/pull/9387)) +- Fix: only parse custom field queries when valid [@shamoon](https://github.com/shamoon) ([#9384](https://github.com/paperless-ngx/paperless-ngx/pull/9384)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9372](https://github.com/paperless-ngx/paperless-ngx/pull/9372)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9371](https://github.com/paperless-ngx/paperless-ngx/pull/9371)) +- Development: change frontend package manager to pnpm [@shamoon](https://github.com/shamoon) ([#9363](https://github.com/paperless-ngx/paperless-ngx/pull/9363)) +- Fix: Allow setting of other Granian options [@stumpylog](https://github.com/stumpylog) ([#9360](https://github.com/paperless-ngx/paperless-ngx/pull/9360)) +- Fix: Always clean up INotify [@stumpylog](https://github.com/stumpylog) ([#9359](https://github.com/paperless-ngx/paperless-ngx/pull/9359)) +- Tweak: add saved views hint to dashboard [@shamoon](https://github.com/shamoon) ([#9362](https://github.com/paperless-ngx/paperless-ngx/pull/9362)) +- Chore(deps): Update ocrmypdf requirement from ~=16.9.0 to ~=16.10.0 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9348](https://github.com/paperless-ngx/paperless-ngx/pull/9348)) +- Chore(deps): Update drf-spectacular-sidecar requirement from ~=2025.2.1 to ~=2025.3.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#9347](https://github.com/paperless-ngx/paperless-ngx/pull/9347)) +- Chore(deps): Bump the small-changes group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9345](https://github.com/paperless-ngx/paperless-ngx/pull/9345)) +- Ensure the directories have been overridden and created for this test [@stumpylog](https://github.com/stumpylog) ([#9354](https://github.com/paperless-ngx/paperless-ngx/pull/9354)) +- Fix typo in inactive account template [@ocean90](https://github.com/ocean90) ([#9356](https://github.com/paperless-ngx/paperless-ngx/pull/9356)) +- Fix: fix notes serializing in API document response [@shamoon](https://github.com/shamoon) ([#9336](https://github.com/paperless-ngx/paperless-ngx/pull/9336)) +- Fix: correct all results with whoosh queries [@shamoon](https://github.com/shamoon) ([#9331](https://github.com/paperless-ngx/paperless-ngx/pull/9331)) +- Fix: fix typo in altered migration [@gothicVI](https://github.com/gothicVI) ([#9321](https://github.com/paperless-ngx/paperless-ngx/pull/9321)) +- Fix: add account_inactive template / url [@shamoon](https://github.com/shamoon) ([#9322](https://github.com/paperless-ngx/paperless-ngx/pull/9322)) +- Chore: Switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#9060](https://github.com/paperless-ngx/paperless-ngx/pull/9060)) +- Enhancement: reorganize dates dropdown, add more relative options [@shamoon](https://github.com/shamoon) ([#9307](https://github.com/paperless-ngx/paperless-ngx/pull/9307)) +- Chore: remove popper preventOverflow fix [@shamoon](https://github.com/shamoon) ([#9306](https://github.com/paperless-ngx/paperless-ngx/pull/9306)) +- Enhancement: add switch to allow merging non-PDFs with archive version [@shamoon](https://github.com/shamoon) ([#9305](https://github.com/paperless-ngx/paperless-ngx/pull/9305)) +- Enhancement: support assigning custom field values in workflows [@shamoon](https://github.com/shamoon) ([#9272](https://github.com/paperless-ngx/paperless-ngx/pull/9272)) +- Chore: add codecov frontend test results [@shamoon](https://github.com/shamoon) ([#9296](https://github.com/paperless-ngx/paperless-ngx/pull/9296)) +- Chore: Removes undocumented FileInfo [@stumpylog](https://github.com/stumpylog) ([#9298](https://github.com/paperless-ngx/paperless-ngx/pull/9298)) +- Chore(deps-dev): Bump the frontend-angular-dependencies group in /src-ui with 5 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9288](https://github.com/paperless-ngx/paperless-ngx/pull/9288)) +- Fix: Switches data to content to upload raw bytes/text content [@stumpylog](https://github.com/stumpylog) ([#9293](https://github.com/paperless-ngx/paperless-ngx/pull/9293)) +- Chore: Removes the unused Log model and LogFilterSet [@stumpylog](https://github.com/stumpylog) ([#9294](https://github.com/paperless-ngx/paperless-ngx/pull/9294)) +- Chore: Combine Python settings files [@stumpylog](https://github.com/stumpylog) ([#9292](https://github.com/paperless-ngx/paperless-ngx/pull/9292)) +- Chore(deps-dev): Bump @types/node from 22.13.8 to 22.13.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9290](https://github.com/paperless-ngx/paperless-ngx/pull/9290)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9289](https://github.com/paperless-ngx/paperless-ngx/pull/9289)) +- Chore: Switch from pipenv to uv [@stumpylog](https://github.com/stumpylog) ([#9251](https://github.com/paperless-ngx/paperless-ngx/pull/9251)) +- Enhancement: Add slugify filter in templating [@hwaterke](https://github.com/hwaterke) ([#9269](https://github.com/paperless-ngx/paperless-ngx/pull/9269)) +- Fix: handle null workflow body and email subject [@shamoon](https://github.com/shamoon) ([#9271](https://github.com/paperless-ngx/paperless-ngx/pull/9271)) +- Chore(deps-dev): Bump @types/node from 22.13.5 to 22.13.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9267](https://github.com/paperless-ngx/paperless-ngx/pull/9267)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9253](https://github.com/paperless-ngx/paperless-ngx/pull/9253)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.8.0 to 1.9.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9260](https://github.com/paperless-ngx/paperless-ngx/pull/9260)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9256](https://github.com/paperless-ngx/paperless-ngx/pull/9256)) +- Chore(deps): Bump uuid from 11.0.5 to 11.1.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9259](https://github.com/paperless-ngx/paperless-ngx/pull/9259)) +- Chore(deps-dev): Bump jest-preset-angular from 14.5.1 to 14.5.3 in /src-ui in the frontend-jest-dependencies group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9255](https://github.com/paperless-ngx/paperless-ngx/pull/9255)) +- Chore(deps): Bump rxjs from 7.8.1 to 7.8.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9258](https://github.com/paperless-ngx/paperless-ngx/pull/9258)) +- Chore(deps-dev): Bump @types/node from 22.13.0 to 22.13.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#9257](https://github.com/paperless-ngx/paperless-ngx/pull/9257)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 22 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9254](https://github.com/paperless-ngx/paperless-ngx/pull/9254)) +- Feature: Switch webserver to granian [@stumpylog](https://github.com/stumpylog) ([#9218](https://github.com/paperless-ngx/paperless-ngx/pull/9218)) +- Enhancement: relocate and smaller upload widget, dont limit upload list [@shamoon](https://github.com/shamoon) ([#9244](https://github.com/paperless-ngx/paperless-ngx/pull/9244)) +- Enhancement: run tasks from system status, report sanity check, simpler classifier check, styling updates [@shamoon](https://github.com/shamoon) ([#9106](https://github.com/paperless-ngx/paperless-ngx/pull/9106)) +- Chore: Switch remote version check to HTTPx [@stumpylog](https://github.com/stumpylog) ([#9232](https://github.com/paperless-ngx/paperless-ngx/pull/9232)) +- Fix: cleanup saved view references on custom field deletion, auto-refresh views, show error on saved view save [@shamoon](https://github.com/shamoon) ([#9225](https://github.com/paperless-ngx/paperless-ngx/pull/9225)) +- Fix: revert thumbnail CSS workaround in favor of GPU workaround [@shamoon](https://github.com/shamoon) ([#9219](https://github.com/paperless-ngx/paperless-ngx/pull/9219)) +- Chore: Reduce imports for a slight memory improvement [@stumpylog](https://github.com/stumpylog) ([#9217](https://github.com/paperless-ngx/paperless-ngx/pull/9217)) +- Enhancement: include celery log in logs view [@shamoon](https://github.com/shamoon) ([#9214](https://github.com/paperless-ngx/paperless-ngx/pull/9214)) +- Enhancement: support default groups for regular and social account signup, syncing on login [@shamoon](https://github.com/shamoon) ([#9039](https://github.com/paperless-ngx/paperless-ngx/pull/9039)) +- Enhancement: allow disabling the filesystem consumer [@shamoon](https://github.com/shamoon) ([#9199](https://github.com/paperless-ngx/paperless-ngx/pull/9199)) +- Fix: correct split confirm removal [@shamoon](https://github.com/shamoon) ([#9195](https://github.com/paperless-ngx/paperless-ngx/pull/9195)) +- Feature: email document [@shamoon](https://github.com/shamoon) ([#8950](https://github.com/paperless-ngx/paperless-ngx/pull/8950)) +- Enhancement: webui workflowtrigger source option [@shamoon](https://github.com/shamoon) ([#9170](https://github.com/paperless-ngx/paperless-ngx/pull/9170)) +- Fix: saved views do not return to default display fields after setting and then removing [@shamoon](https://github.com/shamoon) ([#9168](https://github.com/paperless-ngx/paperless-ngx/pull/9168)) +- Chore(deps): Bump django-filter from 24.3 to 25.1 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9143](https://github.com/paperless-ngx/paperless-ngx/pull/9143)) +- Chore(deps-dev): Bump mkdocs-material from 9.6.3 to 9.6.4 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9142](https://github.com/paperless-ngx/paperless-ngx/pull/9142)) +- Fix: correct logged number of deleted documents on trash empty [@shamoon](https://github.com/shamoon) ([#9148](https://github.com/paperless-ngx/paperless-ngx/pull/9148)) +- Fix: include account confirm email allauth URL [@shamoon](https://github.com/shamoon) ([#9147](https://github.com/paperless-ngx/paperless-ngx/pull/9147)) +- Fix: remove additional scrollbar from popup preview [@shamoon](https://github.com/shamoon) ([#9140](https://github.com/paperless-ngx/paperless-ngx/pull/9140)) +- Fix: wrap selected display fields [@shamoon](https://github.com/shamoon) ([#9139](https://github.com/paperless-ngx/paperless-ngx/pull/9139)) +- Enhancement: use charfield for webhook url, custom validation [@shamoon](https://github.com/shamoon) ([#9128](https://github.com/paperless-ngx/paperless-ngx/pull/9128)) +- Fix: reset documents sort field if user deletes the custom field [@shamoon](https://github.com/shamoon) ([#9127](https://github.com/paperless-ngx/paperless-ngx/pull/9127)) +- Chore: more efficient select cf update handler [@shamoon](https://github.com/shamoon) ([#9099](https://github.com/paperless-ngx/paperless-ngx/pull/9099)) +- Fix: limit document title length in workflows [@shamoon](https://github.com/shamoon) ([#9085](https://github.com/paperless-ngx/paperless-ngx/pull/9085)) +- Feature: Chinese Traditional translation [@LokiHung](https://github.com/LokiHung) ([#9076](https://github.com/paperless-ngx/paperless-ngx/pull/9076)) +- Enhancement: Use cached sessions for a minor performance improvement [@stumpylog](https://github.com/stumpylog) ([#9074](https://github.com/paperless-ngx/paperless-ngx/pull/9074)) +- Chore(deps): Bump the small-changes group with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9064](https://github.com/paperless-ngx/paperless-ngx/pull/9064)) +- Chore(deps-dev): Bump the development group with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9061](https://github.com/paperless-ngx/paperless-ngx/pull/9061)) +- Chore(deps): Bump the django group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9065](https://github.com/paperless-ngx/paperless-ngx/pull/9065)) +- Chore(deps): Bump drf-spectacular-sidecar from 2024.11.1 to 2025.2.1 in the major-versions group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9063](https://github.com/paperless-ngx/paperless-ngx/pull/9063)) +- Feature: openapi spec, full api browser [@shamoon](https://github.com/shamoon) ([#8948](https://github.com/paperless-ngx/paperless-ngx/pull/8948)) +- Fix: include doc link input import in custom fields query dropdown [@shamoon](https://github.com/shamoon) ([#9058](https://github.com/paperless-ngx/paperless-ngx/pull/9058)) +- Enhancement: filter by file type [@shamoon](https://github.com/shamoon) ([#8946](https://github.com/paperless-ngx/paperless-ngx/pull/8946)) +- Enhancement: add layout options for email conversion [@RazielleS](https://github.com/RazielleS) ([#8907](https://github.com/paperless-ngx/paperless-ngx/pull/8907)) +- Chore: Enable ruff FBT [@gothicVI](https://github.com/gothicVI) ([#8645](https://github.com/paperless-ngx/paperless-ngx/pull/8645)) +- Feature: better toast notifications management [@shamoon](https://github.com/shamoon) ([#8980](https://github.com/paperless-ngx/paperless-ngx/pull/8980)) +- Enhancement: date picker and date filter dropdown improvements [@shamoon](https://github.com/shamoon) ([#9033](https://github.com/paperless-ngx/paperless-ngx/pull/9033)) +- Fix: deselect and trigger refresh for deleted documents from bulk operations with delete originals [@shamoon](https://github.com/shamoon) ([#8996](https://github.com/paperless-ngx/paperless-ngx/pull/8996)) +- Tweak: improve date matching regex for dates after numbers [@XstreamGit](https://github.com/XstreamGit) ([#8964](https://github.com/paperless-ngx/paperless-ngx/pull/8964)) +- Tweak: more accurate classifier last trained time [@shamoon](https://github.com/shamoon) ([#9004](https://github.com/paperless-ngx/paperless-ngx/pull/9004)) +- Enhancement: allow setting default pdf zoom [@shamoon](https://github.com/shamoon) ([#9017](https://github.com/paperless-ngx/paperless-ngx/pull/9017)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#9013](https://github.com/paperless-ngx/paperless-ngx/pull/9013)) +- Chore(deps): Bump django-soft-delete from 1.0.16 to 1.0.18 in the django group @[dependabot[bot]](https://github.com/apps/dependabot) ([#9014](https://github.com/paperless-ngx/paperless-ngx/pull/9014)) +- Fix: allow empty email in profile [@shamoon](https://github.com/shamoon) ([#9012](https://github.com/paperless-ngx/paperless-ngx/pull/9012)) +- Chore(deps): Bump uuid from 11.0.2 to 11.0.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8992](https://github.com/paperless-ngx/paperless-ngx/pull/8992)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.1 to 1.8.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8991](https://github.com/paperless-ngx/paperless-ngx/pull/8991)) +- Chore(deps-dev): Bump @playwright/test from 1.48.2 to 1.50.1 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8993](https://github.com/paperless-ngx/paperless-ngx/pull/8993)) +- Chore(deps-dev): Bump @types/node from 22.8.6 to 22.13.0 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8989](https://github.com/paperless-ngx/paperless-ngx/pull/8989)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8988](https://github.com/paperless-ngx/paperless-ngx/pull/8988)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 23 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8986](https://github.com/paperless-ngx/paperless-ngx/pull/8986))
## paperless-ngx 2.14.7 ### Features -- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) +- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) ### Bug Fixes -- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) -- Fix: reflect doc links in bulk modify custom fields by [@shamoon](https://github.com/shamoon) [#8962](https://github.com/paperless-ngx/paperless-ngx/pull/8962) -- Fix: also ensure symmetric doc link removal on bulk edit by [@shamoon](https://github.com/shamoon) [#8963](https://github.com/paperless-ngx/paperless-ngx/pull/8963) +- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) +- Fix: reflect doc links in bulk modify custom fields by [@shamoon](https://github.com/shamoon) [#8962](https://github.com/paperless-ngx/paperless-ngx/pull/8962) +- Fix: also ensure symmetric doc link removal on bulk edit by [@shamoon](https://github.com/shamoon) [#8963](https://github.com/paperless-ngx/paperless-ngx/pull/8963) ### All App Changes
4 changes -- Chore(deps-dev): Bump ruff from 0.9.2 to 0.9.3 in the development group by @[dependabot[bot]](https://github.com/apps/dependabot) [#8928](https://github.com/paperless-ngx/paperless-ngx/pull/8928) -- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) -- Fix: reflect doc links in bulk modify custom fields by [@shamoon](https://github.com/shamoon) [#8962](https://github.com/paperless-ngx/paperless-ngx/pull/8962) -- Fix: also ensure symmetric doc link removal on bulk edit by [@shamoon](https://github.com/shamoon) [#8963](https://github.com/paperless-ngx/paperless-ngx/pull/8963) +- Chore(deps-dev): Bump ruff from 0.9.2 to 0.9.3 in the development group by @[dependabot[bot]](https://github.com/apps/dependabot) [#8928](https://github.com/paperless-ngx/paperless-ngx/pull/8928) +- Enhancement: require totp code for obtain auth token by [@shamoon](https://github.com/shamoon) [#8936](https://github.com/paperless-ngx/paperless-ngx/pull/8936) +- Fix: reflect doc links in bulk modify custom fields by [@shamoon](https://github.com/shamoon) [#8962](https://github.com/paperless-ngx/paperless-ngx/pull/8962) +- Fix: also ensure symmetric doc link removal on bulk edit by [@shamoon](https://github.com/shamoon) [#8963](https://github.com/paperless-ngx/paperless-ngx/pull/8963)
## paperless-ngx 2.14.6 ### Bug Fixes -- Fix: backwards-compatible versioned API response for custom field select fields, update default API version [@shamoon](https://github.com/shamoon) ([#8912](https://github.com/paperless-ngx/paperless-ngx/pull/8912)) -- Tweak: place items with 0 documents at bottom of filterable list, retain alphabetical [@shamoon](https://github.com/shamoon) ([#8924](https://github.com/paperless-ngx/paperless-ngx/pull/8924)) -- Fix: set larger page size for abstract service getFew [@shamoon](https://github.com/shamoon) ([#8920](https://github.com/paperless-ngx/paperless-ngx/pull/8920)) -- Fix/refactor: remove doc observables, fix username async [@shamoon](https://github.com/shamoon) ([#8908](https://github.com/paperless-ngx/paperless-ngx/pull/8908)) -- Fix: include missing fields for saved view widgets [@shamoon](https://github.com/shamoon) ([#8905](https://github.com/paperless-ngx/paperless-ngx/pull/8905)) -- Fix: force set document not dirty before close after save [@shamoon](https://github.com/shamoon) ([#8888](https://github.com/paperless-ngx/paperless-ngx/pull/8888)) -- Fixhancement: restore search highlighting and add for built-in viewer [@shamoon](https://github.com/shamoon) ([#8885](https://github.com/paperless-ngx/paperless-ngx/pull/8885)) -- Fix: resolve cpu usage due to incorrect interval use [@shamoon](https://github.com/shamoon) ([#8884](https://github.com/paperless-ngx/paperless-ngx/pull/8884)) +- Fix: backwards-compatible versioned API response for custom field select fields, update default API version [@shamoon](https://github.com/shamoon) ([#8912](https://github.com/paperless-ngx/paperless-ngx/pull/8912)) +- Tweak: place items with 0 documents at bottom of filterable list, retain alphabetical [@shamoon](https://github.com/shamoon) ([#8924](https://github.com/paperless-ngx/paperless-ngx/pull/8924)) +- Fix: set larger page size for abstract service getFew [@shamoon](https://github.com/shamoon) ([#8920](https://github.com/paperless-ngx/paperless-ngx/pull/8920)) +- Fix/refactor: remove doc observables, fix username async [@shamoon](https://github.com/shamoon) ([#8908](https://github.com/paperless-ngx/paperless-ngx/pull/8908)) +- Fix: include missing fields for saved view widgets [@shamoon](https://github.com/shamoon) ([#8905](https://github.com/paperless-ngx/paperless-ngx/pull/8905)) +- Fix: force set document not dirty before close after save [@shamoon](https://github.com/shamoon) ([#8888](https://github.com/paperless-ngx/paperless-ngx/pull/8888)) +- Fixhancement: restore search highlighting and add for built-in viewer [@shamoon](https://github.com/shamoon) ([#8885](https://github.com/paperless-ngx/paperless-ngx/pull/8885)) +- Fix: resolve cpu usage due to incorrect interval use [@shamoon](https://github.com/shamoon) ([#8884](https://github.com/paperless-ngx/paperless-ngx/pull/8884)) ### All App Changes
10 changes -- Fix: backwards-compatible versioned API response for custom field select fields, update default API version [@shamoon](https://github.com/shamoon) ([#8912](https://github.com/paperless-ngx/paperless-ngx/pull/8912)) -- Tweak: place items with 0 documents at bottom of filterable list, retain alphabetical [@shamoon](https://github.com/shamoon) ([#8924](https://github.com/paperless-ngx/paperless-ngx/pull/8924)) -- Fix: set larger page size for abstract service getFew [@shamoon](https://github.com/shamoon) ([#8920](https://github.com/paperless-ngx/paperless-ngx/pull/8920)) -- Fix/refactor: remove doc observables, fix username async [@shamoon](https://github.com/shamoon) ([#8908](https://github.com/paperless-ngx/paperless-ngx/pull/8908)) -- Fix: include missing fields for saved view widgets [@shamoon](https://github.com/shamoon) ([#8905](https://github.com/paperless-ngx/paperless-ngx/pull/8905)) -- Chore: Upgrades dependencies and hook versions [@stumpylog](https://github.com/stumpylog) ([#8895](https://github.com/paperless-ngx/paperless-ngx/pull/8895)) -- Fix: force set document not dirty before close after save [@shamoon](https://github.com/shamoon) ([#8888](https://github.com/paperless-ngx/paperless-ngx/pull/8888)) -- Change: Revert dropdown sorting by doc count [@shamoon](https://github.com/shamoon) ([#8887](https://github.com/paperless-ngx/paperless-ngx/pull/8887)) -- Fixhancement: restore search highlighting and add for built-in viewer [@shamoon](https://github.com/shamoon) ([#8885](https://github.com/paperless-ngx/paperless-ngx/pull/8885)) -- Fix: resolve cpu usage due to incorrect interval use [@shamoon](https://github.com/shamoon) ([#8884](https://github.com/paperless-ngx/paperless-ngx/pull/8884)) +- Fix: backwards-compatible versioned API response for custom field select fields, update default API version [@shamoon](https://github.com/shamoon) ([#8912](https://github.com/paperless-ngx/paperless-ngx/pull/8912)) +- Tweak: place items with 0 documents at bottom of filterable list, retain alphabetical [@shamoon](https://github.com/shamoon) ([#8924](https://github.com/paperless-ngx/paperless-ngx/pull/8924)) +- Fix: set larger page size for abstract service getFew [@shamoon](https://github.com/shamoon) ([#8920](https://github.com/paperless-ngx/paperless-ngx/pull/8920)) +- Fix/refactor: remove doc observables, fix username async [@shamoon](https://github.com/shamoon) ([#8908](https://github.com/paperless-ngx/paperless-ngx/pull/8908)) +- Fix: include missing fields for saved view widgets [@shamoon](https://github.com/shamoon) ([#8905](https://github.com/paperless-ngx/paperless-ngx/pull/8905)) +- Chore: Upgrades dependencies and hook versions [@stumpylog](https://github.com/stumpylog) ([#8895](https://github.com/paperless-ngx/paperless-ngx/pull/8895)) +- Fix: force set document not dirty before close after save [@shamoon](https://github.com/shamoon) ([#8888](https://github.com/paperless-ngx/paperless-ngx/pull/8888)) +- Change: Revert dropdown sorting by doc count [@shamoon](https://github.com/shamoon) ([#8887](https://github.com/paperless-ngx/paperless-ngx/pull/8887)) +- Fixhancement: restore search highlighting and add for built-in viewer [@shamoon](https://github.com/shamoon) ([#8885](https://github.com/paperless-ngx/paperless-ngx/pull/8885)) +- Fix: resolve cpu usage due to incorrect interval use [@shamoon](https://github.com/shamoon) ([#8884](https://github.com/paperless-ngx/paperless-ngx/pull/8884))
## paperless-ngx 2.14.5 ### Features -- Change: restrict altering and creation of superusers to superusers only [@shamoon](https://github.com/shamoon) ([#8837](https://github.com/paperless-ngx/paperless-ngx/pull/8837)) +- Change: restrict altering and creation of superusers to superusers only [@shamoon](https://github.com/shamoon) ([#8837](https://github.com/paperless-ngx/paperless-ngx/pull/8837)) ### Bug Fixes -- Fix: fix long tag visual wrapping [@shamoon](https://github.com/shamoon) ([#8833](https://github.com/paperless-ngx/paperless-ngx/pull/8833)) -- Fix: Enforce classifier training ordering to prevent extra training [@stumpylog](https://github.com/stumpylog) ([#8822](https://github.com/paperless-ngx/paperless-ngx/pull/8822)) -- Fix: import router module to not found component [@shamoon](https://github.com/shamoon) ([#8821](https://github.com/paperless-ngx/paperless-ngx/pull/8821)) -- Fix: better reflect some mail account / rule permissions in UI [@shamoon](https://github.com/shamoon) ([#8812](https://github.com/paperless-ngx/paperless-ngx/pull/8812)) +- Fix: fix long tag visual wrapping [@shamoon](https://github.com/shamoon) ([#8833](https://github.com/paperless-ngx/paperless-ngx/pull/8833)) +- Fix: Enforce classifier training ordering to prevent extra training [@stumpylog](https://github.com/stumpylog) ([#8822](https://github.com/paperless-ngx/paperless-ngx/pull/8822)) +- Fix: import router module to not found component [@shamoon](https://github.com/shamoon) ([#8821](https://github.com/paperless-ngx/paperless-ngx/pull/8821)) +- Fix: better reflect some mail account / rule permissions in UI [@shamoon](https://github.com/shamoon) ([#8812](https://github.com/paperless-ngx/paperless-ngx/pull/8812)) ### Dependencies -- Chore(deps-dev): Bump undici from 5.28.4 to 5.28.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8851](https://github.com/paperless-ngx/paperless-ngx/pull/8851)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8841](https://github.com/paperless-ngx/paperless-ngx/pull/8841)) +- Chore(deps-dev): Bump undici from 5.28.4 to 5.28.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8851](https://github.com/paperless-ngx/paperless-ngx/pull/8851)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8841](https://github.com/paperless-ngx/paperless-ngx/pull/8841)) ### All App Changes
9 changes -- Chore(deps-dev): Bump undici from 5.28.4 to 5.28.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8851](https://github.com/paperless-ngx/paperless-ngx/pull/8851)) -- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8841](https://github.com/paperless-ngx/paperless-ngx/pull/8841)) -- Chore: use simpler method for attaching files to emails [@shamoon](https://github.com/shamoon) ([#8845](https://github.com/paperless-ngx/paperless-ngx/pull/8845)) -- Change: restrict altering and creation of superusers to superusers only [@shamoon](https://github.com/shamoon) ([#8837](https://github.com/paperless-ngx/paperless-ngx/pull/8837)) -- Fix: fix long tag visual wrapping [@shamoon](https://github.com/shamoon) ([#8833](https://github.com/paperless-ngx/paperless-ngx/pull/8833)) -- Change: allow generate auth token without a usable password [@shamoon](https://github.com/shamoon) ([#8824](https://github.com/paperless-ngx/paperless-ngx/pull/8824)) -- Fix: Enforce classifier training ordering to prevent extra training [@stumpylog](https://github.com/stumpylog) ([#8822](https://github.com/paperless-ngx/paperless-ngx/pull/8822)) -- Fix: import router module to not found component [@shamoon](https://github.com/shamoon) ([#8821](https://github.com/paperless-ngx/paperless-ngx/pull/8821)) -- Fix: better reflect some mail account / rule permissions in UI [@shamoon](https://github.com/shamoon) ([#8812](https://github.com/paperless-ngx/paperless-ngx/pull/8812)) +- Chore(deps-dev): Bump undici from 5.28.4 to 5.28.5 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#8851](https://github.com/paperless-ngx/paperless-ngx/pull/8851)) +- Chore(deps-dev): Bump the development group with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#8841](https://github.com/paperless-ngx/paperless-ngx/pull/8841)) +- Chore: use simpler method for attaching files to emails [@shamoon](https://github.com/shamoon) ([#8845](https://github.com/paperless-ngx/paperless-ngx/pull/8845)) +- Change: restrict altering and creation of superusers to superusers only [@shamoon](https://github.com/shamoon) ([#8837](https://github.com/paperless-ngx/paperless-ngx/pull/8837)) +- Fix: fix long tag visual wrapping [@shamoon](https://github.com/shamoon) ([#8833](https://github.com/paperless-ngx/paperless-ngx/pull/8833)) +- Change: allow generate auth token without a usable password [@shamoon](https://github.com/shamoon) ([#8824](https://github.com/paperless-ngx/paperless-ngx/pull/8824)) +- Fix: Enforce classifier training ordering to prevent extra training [@stumpylog](https://github.com/stumpylog) ([#8822](https://github.com/paperless-ngx/paperless-ngx/pull/8822)) +- Fix: import router module to not found component [@shamoon](https://github.com/shamoon) ([#8821](https://github.com/paperless-ngx/paperless-ngx/pull/8821)) +- Fix: better reflect some mail account / rule permissions in UI [@shamoon](https://github.com/shamoon) ([#8812](https://github.com/paperless-ngx/paperless-ngx/pull/8812))
## paperless-ngx 2.14.4 ### Features -- Enhancement: allow specifying JSON encoding for webhooks [@shamoon](https://github.com/shamoon) ([#8799](https://github.com/paperless-ngx/paperless-ngx/pull/8799)) -- Change: disable API basic auth if MFA enabled [@shamoon](https://github.com/shamoon) ([#8792](https://github.com/paperless-ngx/paperless-ngx/pull/8792)) +- Enhancement: allow specifying JSON encoding for webhooks [@shamoon](https://github.com/shamoon) ([#8799](https://github.com/paperless-ngx/paperless-ngx/pull/8799)) +- Change: disable API basic auth if MFA enabled [@shamoon](https://github.com/shamoon) ([#8792](https://github.com/paperless-ngx/paperless-ngx/pull/8792)) ### Bug Fixes -- Fix: Include email and webhook objects in the export [@stumpylog](https://github.com/stumpylog) ([#8790](https://github.com/paperless-ngx/paperless-ngx/pull/8790)) -- Fix: use MIMEBase for email attachments [@shamoon](https://github.com/shamoon) ([#8762](https://github.com/paperless-ngx/paperless-ngx/pull/8762)) -- Fix: handle page out of range in mgmt lists after delete [@shamoon](https://github.com/shamoon) ([#8771](https://github.com/paperless-ngx/paperless-ngx/pull/8771)) +- Fix: Include email and webhook objects in the export [@stumpylog](https://github.com/stumpylog) ([#8790](https://github.com/paperless-ngx/paperless-ngx/pull/8790)) +- Fix: use MIMEBase for email attachments [@shamoon](https://github.com/shamoon) ([#8762](https://github.com/paperless-ngx/paperless-ngx/pull/8762)) +- Fix: handle page out of range in mgmt lists after delete [@shamoon](https://github.com/shamoon) ([#8771](https://github.com/paperless-ngx/paperless-ngx/pull/8771)) ### All App Changes
5 changes -- Enhancement: allow specifying JSON encoding for webhooks [@shamoon](https://github.com/shamoon) ([#8799](https://github.com/paperless-ngx/paperless-ngx/pull/8799)) -- Change: disable API basic auth if MFA enabled [@shamoon](https://github.com/shamoon) ([#8792](https://github.com/paperless-ngx/paperless-ngx/pull/8792)) -- Fix: Include email and webhook objects in the export [@stumpylog](https://github.com/stumpylog) ([#8790](https://github.com/paperless-ngx/paperless-ngx/pull/8790)) -- Fix: use MIMEBase for email attachments [@shamoon](https://github.com/shamoon) ([#8762](https://github.com/paperless-ngx/paperless-ngx/pull/8762)) -- Fix: handle page out of range in mgmt lists after delete [@shamoon](https://github.com/shamoon) ([#8771](https://github.com/paperless-ngx/paperless-ngx/pull/8771)) +- Enhancement: allow specifying JSON encoding for webhooks [@shamoon](https://github.com/shamoon) ([#8799](https://github.com/paperless-ngx/paperless-ngx/pull/8799)) +- Change: disable API basic auth if MFA enabled [@shamoon](https://github.com/shamoon) ([#8792](https://github.com/paperless-ngx/paperless-ngx/pull/8792)) +- Fix: Include email and webhook objects in the export [@stumpylog](https://github.com/stumpylog) ([#8790](https://github.com/paperless-ngx/paperless-ngx/pull/8790)) +- Fix: use MIMEBase for email attachments [@shamoon](https://github.com/shamoon) ([#8762](https://github.com/paperless-ngx/paperless-ngx/pull/8762)) +- Fix: handle page out of range in mgmt lists after delete [@shamoon](https://github.com/shamoon) ([#8771](https://github.com/paperless-ngx/paperless-ngx/pull/8771))
## paperless-ngx 2.14.3 ### Bug Fixes -- Fix: Adds a default 30s timeout for emails, instead of no timeout [@stumpylog](https://github.com/stumpylog) ([#8757](https://github.com/paperless-ngx/paperless-ngx/pull/8757)) -- Fix: import forms modules for entries component [@shamoon](https://github.com/shamoon) ([#8752](https://github.com/paperless-ngx/paperless-ngx/pull/8752)) -- Fix: fix email/wh actions on consume started [@shamoon](https://github.com/shamoon) ([#8750](https://github.com/paperless-ngx/paperless-ngx/pull/8750)) -- Fix: import date picker module in cf query dropdown [@shamoon](https://github.com/shamoon) ([#8749](https://github.com/paperless-ngx/paperless-ngx/pull/8749)) +- Fix: Adds a default 30s timeout for emails, instead of no timeout [@stumpylog](https://github.com/stumpylog) ([#8757](https://github.com/paperless-ngx/paperless-ngx/pull/8757)) +- Fix: import forms modules for entries component [@shamoon](https://github.com/shamoon) ([#8752](https://github.com/paperless-ngx/paperless-ngx/pull/8752)) +- Fix: fix email/wh actions on consume started [@shamoon](https://github.com/shamoon) ([#8750](https://github.com/paperless-ngx/paperless-ngx/pull/8750)) +- Fix: import date picker module in cf query dropdown [@shamoon](https://github.com/shamoon) ([#8749](https://github.com/paperless-ngx/paperless-ngx/pull/8749)) ### All App Changes
5 changes -- Fix: Adds a default 30s timeout for emails, instead of no timeout [@stumpylog](https://github.com/stumpylog) ([#8757](https://github.com/paperless-ngx/paperless-ngx/pull/8757)) -- Enhancement: set autofocus on MFA code field [@mxmehl](https://github.com/mxmehl) ([#8756](https://github.com/paperless-ngx/paperless-ngx/pull/8756)) -- Fix: import forms modules for entries component [@shamoon](https://github.com/shamoon) ([#8752](https://github.com/paperless-ngx/paperless-ngx/pull/8752)) -- Fix: fix email/wh actions on consume started [@shamoon](https://github.com/shamoon) ([#8750](https://github.com/paperless-ngx/paperless-ngx/pull/8750)) -- Fix: import date picker module in cf query dropdown [@shamoon](https://github.com/shamoon) ([#8749](https://github.com/paperless-ngx/paperless-ngx/pull/8749)) +- Fix: Adds a default 30s timeout for emails, instead of no timeout [@stumpylog](https://github.com/stumpylog) ([#8757](https://github.com/paperless-ngx/paperless-ngx/pull/8757)) +- Enhancement: set autofocus on MFA code field [@mxmehl](https://github.com/mxmehl) ([#8756](https://github.com/paperless-ngx/paperless-ngx/pull/8756)) +- Fix: import forms modules for entries component [@shamoon](https://github.com/shamoon) ([#8752](https://github.com/paperless-ngx/paperless-ngx/pull/8752)) +- Fix: fix email/wh actions on consume started [@shamoon](https://github.com/shamoon) ([#8750](https://github.com/paperless-ngx/paperless-ngx/pull/8750)) +- Fix: import date picker module in cf query dropdown [@shamoon](https://github.com/shamoon) ([#8749](https://github.com/paperless-ngx/paperless-ngx/pull/8749))
## paperless-ngx 2.14.2 ### Bug Fixes -- Fix: dont try to parse empty webhook params [@shamoon](https://github.com/shamoon) ([#8742](https://github.com/paperless-ngx/paperless-ngx/pull/8742)) -- Fix: pass working file to workflows, pickle file bytes [@shamoon](https://github.com/shamoon) ([#8741](https://github.com/paperless-ngx/paperless-ngx/pull/8741)) -- Fix: use hard delete when bulk editing custom fields [@shamoon](https://github.com/shamoon) ([#8740](https://github.com/paperless-ngx/paperless-ngx/pull/8740)) -- Fix: Ensure email attachments use the latest document path for attachments [@stumpylog](https://github.com/stumpylog) ([#8737](https://github.com/paperless-ngx/paperless-ngx/pull/8737)) -- Fix: include tooltip module for custom fields display [@shamoon](https://github.com/shamoon) ([#8739](https://github.com/paperless-ngx/paperless-ngx/pull/8739)) -- Fix: remove id of webhook/email actions on copy [@shamoon](https://github.com/shamoon) ([#8729](https://github.com/paperless-ngx/paperless-ngx/pull/8729)) -- Fix: import dnd module for merge confirm dialog [@shamoon](https://github.com/shamoon) ([#8727](https://github.com/paperless-ngx/paperless-ngx/pull/8727)) +- Fix: dont try to parse empty webhook params [@shamoon](https://github.com/shamoon) ([#8742](https://github.com/paperless-ngx/paperless-ngx/pull/8742)) +- Fix: pass working file to workflows, pickle file bytes [@shamoon](https://github.com/shamoon) ([#8741](https://github.com/paperless-ngx/paperless-ngx/pull/8741)) +- Fix: use hard delete when bulk editing custom fields [@shamoon](https://github.com/shamoon) ([#8740](https://github.com/paperless-ngx/paperless-ngx/pull/8740)) +- Fix: Ensure email attachments use the latest document path for attachments [@stumpylog](https://github.com/stumpylog) ([#8737](https://github.com/paperless-ngx/paperless-ngx/pull/8737)) +- Fix: include tooltip module for custom fields display [@shamoon](https://github.com/shamoon) ([#8739](https://github.com/paperless-ngx/paperless-ngx/pull/8739)) +- Fix: remove id of webhook/email actions on copy [@shamoon](https://github.com/shamoon) ([#8729](https://github.com/paperless-ngx/paperless-ngx/pull/8729)) +- Fix: import dnd module for merge confirm dialog [@shamoon](https://github.com/shamoon) ([#8727](https://github.com/paperless-ngx/paperless-ngx/pull/8727)) ### Dependencies -- Chore(deps): Bump django from 5.1.4 to 5.1.5 [@dependabot](https://github.com/dependabot) ([#8738](https://github.com/paperless-ngx/paperless-ngx/pull/8738)) +- Chore(deps): Bump django from 5.1.4 to 5.1.5 [@dependabot](https://github.com/dependabot) ([#8738](https://github.com/paperless-ngx/paperless-ngx/pull/8738)) ### All App Changes
7 changes -- Fix: dont try to parse empty webhook params [@shamoon](https://github.com/shamoon) ([#8742](https://github.com/paperless-ngx/paperless-ngx/pull/8742)) -- Fix: pass working file to workflows, pickle file bytes [@shamoon](https://github.com/shamoon) ([#8741](https://github.com/paperless-ngx/paperless-ngx/pull/8741)) -- Fix: use hard delete when bulk editing custom fields [@shamoon](https://github.com/shamoon) ([#8740](https://github.com/paperless-ngx/paperless-ngx/pull/8740)) -- Fix: Ensure email attachments use the latest document path for attachments [@stumpylog](https://github.com/stumpylog) ([#8737](https://github.com/paperless-ngx/paperless-ngx/pull/8737)) -- Fix: include tooltip module for custom fields display [@shamoon](https://github.com/shamoon) ([#8739](https://github.com/paperless-ngx/paperless-ngx/pull/8739)) -- Fix: remove id of webhook/email actions on copy [@shamoon](https://github.com/shamoon) ([#8729](https://github.com/paperless-ngx/paperless-ngx/pull/8729)) -- Fix: import dnd module for merge confirm dialog [@shamoon](https://github.com/shamoon) ([#8727](https://github.com/paperless-ngx/paperless-ngx/pull/8727)) +- Fix: dont try to parse empty webhook params [@shamoon](https://github.com/shamoon) ([#8742](https://github.com/paperless-ngx/paperless-ngx/pull/8742)) +- Fix: pass working file to workflows, pickle file bytes [@shamoon](https://github.com/shamoon) ([#8741](https://github.com/paperless-ngx/paperless-ngx/pull/8741)) +- Fix: use hard delete when bulk editing custom fields [@shamoon](https://github.com/shamoon) ([#8740](https://github.com/paperless-ngx/paperless-ngx/pull/8740)) +- Fix: Ensure email attachments use the latest document path for attachments [@stumpylog](https://github.com/stumpylog) ([#8737](https://github.com/paperless-ngx/paperless-ngx/pull/8737)) +- Fix: include tooltip module for custom fields display [@shamoon](https://github.com/shamoon) ([#8739](https://github.com/paperless-ngx/paperless-ngx/pull/8739)) +- Fix: remove id of webhook/email actions on copy [@shamoon](https://github.com/shamoon) ([#8729](https://github.com/paperless-ngx/paperless-ngx/pull/8729)) +- Fix: import dnd module for merge confirm dialog [@shamoon](https://github.com/shamoon) ([#8727](https://github.com/paperless-ngx/paperless-ngx/pull/8727))
## paperless-ngx 2.14.1 ### Bug Fixes -- Fix: prevent error if bulk edit method not in MODIFIED_FIELD_BY_METHOD [@shamoon](https://github.com/shamoon) ([#8710](https://github.com/paperless-ngx/paperless-ngx/pull/8710)) -- Fix: include tag component in list view [@shamoon](https://github.com/shamoon) ([#8706](https://github.com/paperless-ngx/paperless-ngx/pull/8706)) -- Fix: use unmodified original for checksum if exists [@shamoon](https://github.com/shamoon) ([#8693](https://github.com/paperless-ngx/paperless-ngx/pull/8693)) -- Fix: complete load with native PDF viewer [@shamoon](https://github.com/shamoon) ([#8699](https://github.com/paperless-ngx/paperless-ngx/pull/8699)) +- Fix: prevent error if bulk edit method not in MODIFIED_FIELD_BY_METHOD [@shamoon](https://github.com/shamoon) ([#8710](https://github.com/paperless-ngx/paperless-ngx/pull/8710)) +- Fix: include tag component in list view [@shamoon](https://github.com/shamoon) ([#8706](https://github.com/paperless-ngx/paperless-ngx/pull/8706)) +- Fix: use unmodified original for checksum if exists [@shamoon](https://github.com/shamoon) ([#8693](https://github.com/paperless-ngx/paperless-ngx/pull/8693)) +- Fix: complete load with native PDF viewer [@shamoon](https://github.com/shamoon) ([#8699](https://github.com/paperless-ngx/paperless-ngx/pull/8699)) ### All App Changes
4 changes -- Fix: prevent error if bulk edit method not in MODIFIED_FIELD_BY_METHOD [@shamoon](https://github.com/shamoon) ([#8710](https://github.com/paperless-ngx/paperless-ngx/pull/8710)) -- Fix: include tag component in list view [@shamoon](https://github.com/shamoon) ([#8706](https://github.com/paperless-ngx/paperless-ngx/pull/8706)) -- Fix: use unmodified original for checksum if exists [@shamoon](https://github.com/shamoon) ([#8693](https://github.com/paperless-ngx/paperless-ngx/pull/8693)) -- Fix: complete load with native PDF viewer [@shamoon](https://github.com/shamoon) ([#8699](https://github.com/paperless-ngx/paperless-ngx/pull/8699)) +- Fix: prevent error if bulk edit method not in MODIFIED_FIELD_BY_METHOD [@shamoon](https://github.com/shamoon) ([#8710](https://github.com/paperless-ngx/paperless-ngx/pull/8710)) +- Fix: include tag component in list view [@shamoon](https://github.com/shamoon) ([#8706](https://github.com/paperless-ngx/paperless-ngx/pull/8706)) +- Fix: use unmodified original for checksum if exists [@shamoon](https://github.com/shamoon) ([#8693](https://github.com/paperless-ngx/paperless-ngx/pull/8693)) +- Fix: complete load with native PDF viewer [@shamoon](https://github.com/shamoon) ([#8699](https://github.com/paperless-ngx/paperless-ngx/pull/8699))
## paperless-ngx 2.14.0 ### Features -- Enhancement: custom field sorting [@shamoon](https://github.com/shamoon) ([#8494](https://github.com/paperless-ngx/paperless-ngx/pull/8494)) -- Enhancement: process mail button [@shamoon](https://github.com/shamoon) ([#8466](https://github.com/paperless-ngx/paperless-ngx/pull/8466)) -- Feature: bulk edit custom field values [@shamoon](https://github.com/shamoon) ([#8428](https://github.com/paperless-ngx/paperless-ngx/pull/8428)) -- Enhancement: improved loading visuals [@shamoon](https://github.com/shamoon) ([#8435](https://github.com/paperless-ngx/paperless-ngx/pull/8435)) -- Enhancement: prune audit logs and management command [@shamoon](https://github.com/shamoon) ([#8416](https://github.com/paperless-ngx/paperless-ngx/pull/8416)) -- Change: make saved views manage its own component [@shamoon](https://github.com/shamoon) ([#8423](https://github.com/paperless-ngx/paperless-ngx/pull/8423)) -- Enhancement: file task filtering [@shamoon](https://github.com/shamoon) ([#8421](https://github.com/paperless-ngx/paperless-ngx/pull/8421)) -- Enhancement: auto-link duplicate document [@shamoon](https://github.com/shamoon) ([#8415](https://github.com/paperless-ngx/paperless-ngx/pull/8415)) -- Feature: email, webhook workflow actions [@shamoon](https://github.com/shamoon) ([#8108](https://github.com/paperless-ngx/paperless-ngx/pull/8108)) -- Enhancement: use stable unique IDs for custom field select options [@shamoon](https://github.com/shamoon) ([#8299](https://github.com/paperless-ngx/paperless-ngx/pull/8299)) -- Enhancement: better TIFF display browser support [@shamoon](https://github.com/shamoon) ([#8087](https://github.com/paperless-ngx/paperless-ngx/pull/8087)) -- Enhancement: filterable list count sorting and opacification [@shamoon](https://github.com/shamoon) ([#8386](https://github.com/paperless-ngx/paperless-ngx/pull/8386)) -- Enhancement: preview button for document list and trash, refactor [@shamoon](https://github.com/shamoon) ([#8384](https://github.com/paperless-ngx/paperless-ngx/pull/8384)) -- Enhancement: use theme-color meta tag [@shamoon](https://github.com/shamoon) ([#8359](https://github.com/paperless-ngx/paperless-ngx/pull/8359)) -- Feature: scheduled workflow trigger [@shamoon](https://github.com/shamoon) ([#8036](https://github.com/paperless-ngx/paperless-ngx/pull/8036)) -- Enhancement: support owner permissions for file tasks [@shamoon](https://github.com/shamoon) ([#8195](https://github.com/paperless-ngx/paperless-ngx/pull/8195)) -- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) -- Enhancement: next / previous shortcuts for document list [@shamoon](https://github.com/shamoon) ([#8309](https://github.com/paperless-ngx/paperless-ngx/pull/8309)) -- Feature: two-factor authentication [@shamoon](https://github.com/shamoon) ([#8012](https://github.com/paperless-ngx/paperless-ngx/pull/8012)) -- Enhancement: save \& next / close shortcut key [@shamoon](https://github.com/shamoon) ([#8243](https://github.com/paperless-ngx/paperless-ngx/pull/8243)) -- Feature: loading preview, better text popup preview [@shamoon](https://github.com/shamoon) ([#8011](https://github.com/paperless-ngx/paperless-ngx/pull/8011)) +- Enhancement: custom field sorting [@shamoon](https://github.com/shamoon) ([#8494](https://github.com/paperless-ngx/paperless-ngx/pull/8494)) +- Enhancement: process mail button [@shamoon](https://github.com/shamoon) ([#8466](https://github.com/paperless-ngx/paperless-ngx/pull/8466)) +- Feature: bulk edit custom field values [@shamoon](https://github.com/shamoon) ([#8428](https://github.com/paperless-ngx/paperless-ngx/pull/8428)) +- Enhancement: improved loading visuals [@shamoon](https://github.com/shamoon) ([#8435](https://github.com/paperless-ngx/paperless-ngx/pull/8435)) +- Enhancement: prune audit logs and management command [@shamoon](https://github.com/shamoon) ([#8416](https://github.com/paperless-ngx/paperless-ngx/pull/8416)) +- Change: make saved views manage its own component [@shamoon](https://github.com/shamoon) ([#8423](https://github.com/paperless-ngx/paperless-ngx/pull/8423)) +- Enhancement: file task filtering [@shamoon](https://github.com/shamoon) ([#8421](https://github.com/paperless-ngx/paperless-ngx/pull/8421)) +- Enhancement: auto-link duplicate document [@shamoon](https://github.com/shamoon) ([#8415](https://github.com/paperless-ngx/paperless-ngx/pull/8415)) +- Feature: email, webhook workflow actions [@shamoon](https://github.com/shamoon) ([#8108](https://github.com/paperless-ngx/paperless-ngx/pull/8108)) +- Enhancement: use stable unique IDs for custom field select options [@shamoon](https://github.com/shamoon) ([#8299](https://github.com/paperless-ngx/paperless-ngx/pull/8299)) +- Enhancement: better TIFF display browser support [@shamoon](https://github.com/shamoon) ([#8087](https://github.com/paperless-ngx/paperless-ngx/pull/8087)) +- Enhancement: filterable list count sorting and opacification [@shamoon](https://github.com/shamoon) ([#8386](https://github.com/paperless-ngx/paperless-ngx/pull/8386)) +- Enhancement: preview button for document list and trash, refactor [@shamoon](https://github.com/shamoon) ([#8384](https://github.com/paperless-ngx/paperless-ngx/pull/8384)) +- Enhancement: use theme-color meta tag [@shamoon](https://github.com/shamoon) ([#8359](https://github.com/paperless-ngx/paperless-ngx/pull/8359)) +- Feature: scheduled workflow trigger [@shamoon](https://github.com/shamoon) ([#8036](https://github.com/paperless-ngx/paperless-ngx/pull/8036)) +- Enhancement: support owner permissions for file tasks [@shamoon](https://github.com/shamoon) ([#8195](https://github.com/paperless-ngx/paperless-ngx/pull/8195)) +- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) +- Enhancement: next / previous shortcuts for document list [@shamoon](https://github.com/shamoon) ([#8309](https://github.com/paperless-ngx/paperless-ngx/pull/8309)) +- Feature: two-factor authentication [@shamoon](https://github.com/shamoon) ([#8012](https://github.com/paperless-ngx/paperless-ngx/pull/8012)) +- Enhancement: save \& next / close shortcut key [@shamoon](https://github.com/shamoon) ([#8243](https://github.com/paperless-ngx/paperless-ngx/pull/8243)) +- Feature: loading preview, better text popup preview [@shamoon](https://github.com/shamoon) ([#8011](https://github.com/paperless-ngx/paperless-ngx/pull/8011)) ### Bug Fixes -- Fix: add some minor frontend permissions checks [@shamoon](https://github.com/shamoon) ([#8524](https://github.com/paperless-ngx/paperless-ngx/pull/8524)) -- FIx: obliquely trim spaces from global search [@shamoon](https://github.com/shamoon) ([#8484](https://github.com/paperless-ngx/paperless-ngx/pull/8484)) -- Fix: include global perms for bulk edit endpoint [@shamoon](https://github.com/shamoon) ([#8468](https://github.com/paperless-ngx/paperless-ngx/pull/8468)) -- Fix: frontend better reflect global perms for bulk edit, disabled form state [@shamoon](https://github.com/shamoon) ([#8469](https://github.com/paperless-ngx/paperless-ngx/pull/8469)) -- Fixhancement: dispatch change event from current field prior to save [@shamoon](https://github.com/shamoon) ([#8369](https://github.com/paperless-ngx/paperless-ngx/pull/8369)) -- Fix: Fixes install script to handle languages with dashes or underscores [@stumpylog](https://github.com/stumpylog) ([#8341](https://github.com/paperless-ngx/paperless-ngx/pull/8341)) -- Fix: handle very old dates with positive offset too [@shamoon](https://github.com/shamoon) ([#8335](https://github.com/paperless-ngx/paperless-ngx/pull/8335)) -- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) -- Fix: include db_index caveat in squashed migrations [@shamoon](https://github.com/shamoon) ([#8292](https://github.com/paperless-ngx/paperless-ngx/pull/8292)) -- Fix: prevent duplicate workflow runs [@shamoon](https://github.com/shamoon) ([#8268](https://github.com/paperless-ngx/paperless-ngx/pull/8268)) -- Fix: add note about select options to edit dialog [@shamoon](https://github.com/shamoon) ([#8267](https://github.com/paperless-ngx/paperless-ngx/pull/8267)) +- Fix: add some minor frontend permissions checks [@shamoon](https://github.com/shamoon) ([#8524](https://github.com/paperless-ngx/paperless-ngx/pull/8524)) +- FIx: obliquely trim spaces from global search [@shamoon](https://github.com/shamoon) ([#8484](https://github.com/paperless-ngx/paperless-ngx/pull/8484)) +- Fix: include global perms for bulk edit endpoint [@shamoon](https://github.com/shamoon) ([#8468](https://github.com/paperless-ngx/paperless-ngx/pull/8468)) +- Fix: frontend better reflect global perms for bulk edit, disabled form state [@shamoon](https://github.com/shamoon) ([#8469](https://github.com/paperless-ngx/paperless-ngx/pull/8469)) +- Fixhancement: dispatch change event from current field prior to save [@shamoon](https://github.com/shamoon) ([#8369](https://github.com/paperless-ngx/paperless-ngx/pull/8369)) +- Fix: Fixes install script to handle languages with dashes or underscores [@stumpylog](https://github.com/stumpylog) ([#8341](https://github.com/paperless-ngx/paperless-ngx/pull/8341)) +- Fix: handle very old dates with positive offset too [@shamoon](https://github.com/shamoon) ([#8335](https://github.com/paperless-ngx/paperless-ngx/pull/8335)) +- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) +- Fix: include db_index caveat in squashed migrations [@shamoon](https://github.com/shamoon) ([#8292](https://github.com/paperless-ngx/paperless-ngx/pull/8292)) +- Fix: prevent duplicate workflow runs [@shamoon](https://github.com/shamoon) ([#8268](https://github.com/paperless-ngx/paperless-ngx/pull/8268)) +- Fix: add note about select options to edit dialog [@shamoon](https://github.com/shamoon) ([#8267](https://github.com/paperless-ngx/paperless-ngx/pull/8267)) ### Maintenance -- Chore(deps): Bump codecov/codecov-action from 4 to 5 in the actions group [@dependabot](https://github.com/dependabot) ([#8401](https://github.com/paperless-ngx/paperless-ngx/pull/8401)) +- Chore(deps): Bump codecov/codecov-action from 4 to 5 in the actions group [@dependabot](https://github.com/dependabot) ([#8401](https://github.com/paperless-ngx/paperless-ngx/pull/8401)) ### Dependencies
16 changes -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#8627](https://github.com/paperless-ngx/paperless-ngx/pull/8627)) -- Chore(deps-dev): Bump ruff from 0.8.4 to 0.8.6 in the development group [@dependabot](https://github.com/dependabot) ([#8626](https://github.com/paperless-ngx/paperless-ngx/pull/8626)) -- Chore(deps): Bump django-allauth from 65.3.0 to 65.3.1 in the django group [@dependabot](https://github.com/dependabot) ([#8574](https://github.com/paperless-ngx/paperless-ngx/pull/8574)) -- Chore(deps-dev): Bump ruff from 0.8.3 to 0.8.4 in the development group [@dependabot](https://github.com/dependabot) ([#8546](https://github.com/paperless-ngx/paperless-ngx/pull/8546)) -- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#8547](https://github.com/paperless-ngx/paperless-ngx/pull/8547)) -- Chore: update ng2 pdf viewer [@shamoon](https://github.com/shamoon) ([#8462](https://github.com/paperless-ngx/paperless-ngx/pull/8462)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#8458](https://github.com/paperless-ngx/paperless-ngx/pull/8458)) -- Chore(deps): Bump django-soft-delete from 1.0.15 to 1.0.16 in the django group [@dependabot](https://github.com/dependabot) ([#8459](https://github.com/paperless-ngx/paperless-ngx/pull/8459)) -- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#8460](https://github.com/paperless-ngx/paperless-ngx/pull/8460)) -- Chore(deps): Bump django from 5.1.3 to 5.1.4 [@dependabot](https://github.com/dependabot) ([#8445](https://github.com/paperless-ngx/paperless-ngx/pull/8445)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8414](https://github.com/paperless-ngx/paperless-ngx/pull/8414)) -- Chore(deps): Bump codecov/codecov-action from 4 to 5 in the actions group [@dependabot](https://github.com/dependabot) ([#8401](https://github.com/paperless-ngx/paperless-ngx/pull/8401)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8352](https://github.com/paperless-ngx/paperless-ngx/pull/8352)) -- Chore(deps): Bump the small-changes group across 1 directory with 7 updates [@dependabot](https://github.com/dependabot) ([#8399](https://github.com/paperless-ngx/paperless-ngx/pull/8399)) -- Chore(deps): Bump tornado from 6.4.1 to 6.4.2 [@dependabot](https://github.com/dependabot) ([#8336](https://github.com/paperless-ngx/paperless-ngx/pull/8336)) -- Chore(deps): Bump watchdog from 5.0.3 to 6.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#8257](https://github.com/paperless-ngx/paperless-ngx/pull/8257)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#8627](https://github.com/paperless-ngx/paperless-ngx/pull/8627)) +- Chore(deps-dev): Bump ruff from 0.8.4 to 0.8.6 in the development group [@dependabot](https://github.com/dependabot) ([#8626](https://github.com/paperless-ngx/paperless-ngx/pull/8626)) +- Chore(deps): Bump django-allauth from 65.3.0 to 65.3.1 in the django group [@dependabot](https://github.com/dependabot) ([#8574](https://github.com/paperless-ngx/paperless-ngx/pull/8574)) +- Chore(deps-dev): Bump ruff from 0.8.3 to 0.8.4 in the development group [@dependabot](https://github.com/dependabot) ([#8546](https://github.com/paperless-ngx/paperless-ngx/pull/8546)) +- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#8547](https://github.com/paperless-ngx/paperless-ngx/pull/8547)) +- Chore: update ng2 pdf viewer [@shamoon](https://github.com/shamoon) ([#8462](https://github.com/paperless-ngx/paperless-ngx/pull/8462)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#8458](https://github.com/paperless-ngx/paperless-ngx/pull/8458)) +- Chore(deps): Bump django-soft-delete from 1.0.15 to 1.0.16 in the django group [@dependabot](https://github.com/dependabot) ([#8459](https://github.com/paperless-ngx/paperless-ngx/pull/8459)) +- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#8460](https://github.com/paperless-ngx/paperless-ngx/pull/8460)) +- Chore(deps): Bump django from 5.1.3 to 5.1.4 [@dependabot](https://github.com/dependabot) ([#8445](https://github.com/paperless-ngx/paperless-ngx/pull/8445)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8414](https://github.com/paperless-ngx/paperless-ngx/pull/8414)) +- Chore(deps): Bump codecov/codecov-action from 4 to 5 in the actions group [@dependabot](https://github.com/dependabot) ([#8401](https://github.com/paperless-ngx/paperless-ngx/pull/8401)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8352](https://github.com/paperless-ngx/paperless-ngx/pull/8352)) +- Chore(deps): Bump the small-changes group across 1 directory with 7 updates [@dependabot](https://github.com/dependabot) ([#8399](https://github.com/paperless-ngx/paperless-ngx/pull/8399)) +- Chore(deps): Bump tornado from 6.4.1 to 6.4.2 [@dependabot](https://github.com/dependabot) ([#8336](https://github.com/paperless-ngx/paperless-ngx/pull/8336)) +- Chore(deps): Bump watchdog from 5.0.3 to 6.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#8257](https://github.com/paperless-ngx/paperless-ngx/pull/8257))
### All App Changes @@ -1316,150 +1710,150 @@
65 changes -- Fix: use state param with oauth [@shamoon](https://github.com/shamoon) ([#8636](https://github.com/paperless-ngx/paperless-ngx/pull/8636)) -- Fix: check permissions for all documents via bulk download [@shamoon](https://github.com/shamoon) ([#8631](https://github.com/paperless-ngx/paperless-ngx/pull/8631)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#8627](https://github.com/paperless-ngx/paperless-ngx/pull/8627)) -- Chore(deps-dev): Bump ruff from 0.8.4 to 0.8.6 in the development group [@dependabot](https://github.com/dependabot) ([#8626](https://github.com/paperless-ngx/paperless-ngx/pull/8626)) -- Chore: Switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#8325](https://github.com/paperless-ngx/paperless-ngx/pull/8325)) -- Chore: disable max-age for some document endpoints [@tsia](https://github.com/tsia) ([#8611](https://github.com/paperless-ngx/paperless-ngx/pull/8611)) -- Fix: do not accept empty string for doc link value via API [@shamoon](https://github.com/shamoon) ([#8596](https://github.com/paperless-ngx/paperless-ngx/pull/8596)) -- Enhancement: angular 19 [@shamoon](https://github.com/shamoon) ([#8584](https://github.com/paperless-ngx/paperless-ngx/pull/8584)) -- Fix: fix hotkey arrows [@shamoon](https://github.com/shamoon) ([#8583](https://github.com/paperless-ngx/paperless-ngx/pull/8583)) -- Chore: remove outdated admin logentry handler [@shamoon](https://github.com/shamoon) ([#8580](https://github.com/paperless-ngx/paperless-ngx/pull/8580)) -- Chore(deps): Bump django-allauth from 65.3.0 to 65.3.1 in the django group [@dependabot](https://github.com/dependabot) ([#8574](https://github.com/paperless-ngx/paperless-ngx/pull/8574)) -- Enhancement: custom field sorting [@shamoon](https://github.com/shamoon) ([#8494](https://github.com/paperless-ngx/paperless-ngx/pull/8494)) -- Fix: fix occasional error toast overflow [@shamoon](https://github.com/shamoon) ([#8552](https://github.com/paperless-ngx/paperless-ngx/pull/8552)) -- Fix: fix share link archive version detection [@shamoon](https://github.com/shamoon) ([#8551](https://github.com/paperless-ngx/paperless-ngx/pull/8551)) -- Chore(deps-dev): Bump ruff from 0.8.3 to 0.8.4 in the development group [@dependabot](https://github.com/dependabot) ([#8546](https://github.com/paperless-ngx/paperless-ngx/pull/8546)) -- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#8547](https://github.com/paperless-ngx/paperless-ngx/pull/8547)) -- Enhancement: add timeout for Tika client [@HiranChaudhuri](https://github.com/HiranChaudhuri) ([#8520](https://github.com/paperless-ngx/paperless-ngx/pull/8520)) -- Fix: add some minor frontend permissions checks [@shamoon](https://github.com/shamoon) ([#8524](https://github.com/paperless-ngx/paperless-ngx/pull/8524)) -- FIx: obliquely trim spaces from global search [@shamoon](https://github.com/shamoon) ([#8484](https://github.com/paperless-ngx/paperless-ngx/pull/8484)) -- Fix: include global perms for bulk edit endpoint [@shamoon](https://github.com/shamoon) ([#8468](https://github.com/paperless-ngx/paperless-ngx/pull/8468)) -- Enhancement: process mail button [@shamoon](https://github.com/shamoon) ([#8466](https://github.com/paperless-ngx/paperless-ngx/pull/8466)) -- Fix: frontend better reflect global perms for bulk edit, disabled form state [@shamoon](https://github.com/shamoon) ([#8469](https://github.com/paperless-ngx/paperless-ngx/pull/8469)) -- Chore: update ng2 pdf viewer [@shamoon](https://github.com/shamoon) ([#8462](https://github.com/paperless-ngx/paperless-ngx/pull/8462)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#8458](https://github.com/paperless-ngx/paperless-ngx/pull/8458)) -- Chore(deps): Bump django-soft-delete from 1.0.15 to 1.0.16 in the django group [@dependabot](https://github.com/dependabot) ([#8459](https://github.com/paperless-ngx/paperless-ngx/pull/8459)) -- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#8460](https://github.com/paperless-ngx/paperless-ngx/pull/8460)) -- Chore: use rxjs instead of JS setInterval for timers [@shamoon](https://github.com/shamoon) ([#8461](https://github.com/paperless-ngx/paperless-ngx/pull/8461)) -- Feature: bulk edit custom field values [@shamoon](https://github.com/shamoon) ([#8428](https://github.com/paperless-ngx/paperless-ngx/pull/8428)) -- Enhancement: improved loading visuals [@shamoon](https://github.com/shamoon) ([#8435](https://github.com/paperless-ngx/paperless-ngx/pull/8435)) -- Enhancement: prune audit logs and management command [@shamoon](https://github.com/shamoon) ([#8416](https://github.com/paperless-ngx/paperless-ngx/pull/8416)) -- Change: make saved views manage its own component [@shamoon](https://github.com/shamoon) ([#8423](https://github.com/paperless-ngx/paperless-ngx/pull/8423)) -- Enhancement: file task filtering [@shamoon](https://github.com/shamoon) ([#8421](https://github.com/paperless-ngx/paperless-ngx/pull/8421)) -- Enhancement: auto-link duplicate document [@shamoon](https://github.com/shamoon) ([#8415](https://github.com/paperless-ngx/paperless-ngx/pull/8415)) -- Enhancement: include current filename placeholder in workflows @Lu-Fi ([#8319](https://github.com/paperless-ngx/paperless-ngx/pull/8319)) -- Feature: email, webhook workflow actions [@shamoon](https://github.com/shamoon) ([#8108](https://github.com/paperless-ngx/paperless-ngx/pull/8108)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8414](https://github.com/paperless-ngx/paperless-ngx/pull/8414)) -- Enhancement: use stable unique IDs for custom field select options [@shamoon](https://github.com/shamoon) ([#8299](https://github.com/paperless-ngx/paperless-ngx/pull/8299)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8352](https://github.com/paperless-ngx/paperless-ngx/pull/8352)) -- Enhancement: better TIFF display browser support [@shamoon](https://github.com/shamoon) ([#8087](https://github.com/paperless-ngx/paperless-ngx/pull/8087)) -- Chore(deps): Bump the small-changes group across 1 directory with 7 updates [@dependabot](https://github.com/dependabot) ([#8399](https://github.com/paperless-ngx/paperless-ngx/pull/8399)) -- Enhancement: History (audit log) for bulk edit operations [@shamoon](https://github.com/shamoon) ([#8196](https://github.com/paperless-ngx/paperless-ngx/pull/8196)) -- Enhancement: larger previews in action dialogs [@shamoon](https://github.com/shamoon) ([#8387](https://github.com/paperless-ngx/paperless-ngx/pull/8387)) -- Enhancement: filterable list count sorting and opacification [@shamoon](https://github.com/shamoon) ([#8386](https://github.com/paperless-ngx/paperless-ngx/pull/8386)) -- Enhancement: preview button for document list and trash, refactor [@shamoon](https://github.com/shamoon) ([#8384](https://github.com/paperless-ngx/paperless-ngx/pull/8384)) -- Fixhancement: dispatch change event from current field prior to save [@shamoon](https://github.com/shamoon) ([#8369](https://github.com/paperless-ngx/paperless-ngx/pull/8369)) -- Enhancement: use theme-color meta tag [@shamoon](https://github.com/shamoon) ([#8359](https://github.com/paperless-ngx/paperless-ngx/pull/8359)) -- Chore: cleanup urls, use actions for some views [@shamoon](https://github.com/shamoon) ([#8346](https://github.com/paperless-ngx/paperless-ngx/pull/8346)) -- Feature: scheduled workflow trigger [@shamoon](https://github.com/shamoon) ([#8036](https://github.com/paperless-ngx/paperless-ngx/pull/8036)) -- Fix: handle very old dates with positive offset too [@shamoon](https://github.com/shamoon) ([#8335](https://github.com/paperless-ngx/paperless-ngx/pull/8335)) -- Refactor: fix unnecessary use of filterable dropdown sorting [@shamoon](https://github.com/shamoon) ([#8328](https://github.com/paperless-ngx/paperless-ngx/pull/8328)) -- Enhancement: offer link to restored document [@shamoon](https://github.com/shamoon) ([#8321](https://github.com/paperless-ngx/paperless-ngx/pull/8321)) -- Enhancement: support owner permissions for file tasks [@shamoon](https://github.com/shamoon) ([#8195](https://github.com/paperless-ngx/paperless-ngx/pull/8195)) -- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) -- Chore(deps): Bump watchdog from 5.0.3 to 6.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#8257](https://github.com/paperless-ngx/paperless-ngx/pull/8257)) -- Enhancement: Add --compare-json option to document_exporter to write json files only if changed [@kdoren](https://github.com/kdoren) ([#8261](https://github.com/paperless-ngx/paperless-ngx/pull/8261)) -- Enhancement: next / previous shortcuts for document list [@shamoon](https://github.com/shamoon) ([#8309](https://github.com/paperless-ngx/paperless-ngx/pull/8309)) -- Feature: two-factor authentication [@shamoon](https://github.com/shamoon) ([#8012](https://github.com/paperless-ngx/paperless-ngx/pull/8012)) -- Fix: include db_index caveat in squashed migrations [@shamoon](https://github.com/shamoon) ([#8292](https://github.com/paperless-ngx/paperless-ngx/pull/8292)) -- Tweak: use fixed position for navbar [@shamoon](https://github.com/shamoon) ([#8279](https://github.com/paperless-ngx/paperless-ngx/pull/8279)) -- Fix: prevent duplicate workflow runs [@shamoon](https://github.com/shamoon) ([#8268](https://github.com/paperless-ngx/paperless-ngx/pull/8268)) -- Fix: add note about select options to edit dialog [@shamoon](https://github.com/shamoon) ([#8267](https://github.com/paperless-ngx/paperless-ngx/pull/8267)) -- Enhancement: save \& next / close shortcut key [@shamoon](https://github.com/shamoon) ([#8243](https://github.com/paperless-ngx/paperless-ngx/pull/8243)) -- Feature: loading preview, better text popup preview [@shamoon](https://github.com/shamoon) ([#8011](https://github.com/paperless-ngx/paperless-ngx/pull/8011)) -- Chore: switch src/documents/bulk\*.py from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#7862](https://github.com/paperless-ngx/paperless-ngx/pull/7862)) -- Chore: Bulk backend dependency updates [@stumpylog](https://github.com/stumpylog) ([#8212](https://github.com/paperless-ngx/paperless-ngx/pull/8212)) +- Fix: use state param with oauth [@shamoon](https://github.com/shamoon) ([#8636](https://github.com/paperless-ngx/paperless-ngx/pull/8636)) +- Fix: check permissions for all documents via bulk download [@shamoon](https://github.com/shamoon) ([#8631](https://github.com/paperless-ngx/paperless-ngx/pull/8631)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#8627](https://github.com/paperless-ngx/paperless-ngx/pull/8627)) +- Chore(deps-dev): Bump ruff from 0.8.4 to 0.8.6 in the development group [@dependabot](https://github.com/dependabot) ([#8626](https://github.com/paperless-ngx/paperless-ngx/pull/8626)) +- Chore: Switch from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#8325](https://github.com/paperless-ngx/paperless-ngx/pull/8325)) +- Chore: disable max-age for some document endpoints [@tsia](https://github.com/tsia) ([#8611](https://github.com/paperless-ngx/paperless-ngx/pull/8611)) +- Fix: do not accept empty string for doc link value via API [@shamoon](https://github.com/shamoon) ([#8596](https://github.com/paperless-ngx/paperless-ngx/pull/8596)) +- Enhancement: angular 19 [@shamoon](https://github.com/shamoon) ([#8584](https://github.com/paperless-ngx/paperless-ngx/pull/8584)) +- Fix: fix hotkey arrows [@shamoon](https://github.com/shamoon) ([#8583](https://github.com/paperless-ngx/paperless-ngx/pull/8583)) +- Chore: remove outdated admin logentry handler [@shamoon](https://github.com/shamoon) ([#8580](https://github.com/paperless-ngx/paperless-ngx/pull/8580)) +- Chore(deps): Bump django-allauth from 65.3.0 to 65.3.1 in the django group [@dependabot](https://github.com/dependabot) ([#8574](https://github.com/paperless-ngx/paperless-ngx/pull/8574)) +- Enhancement: custom field sorting [@shamoon](https://github.com/shamoon) ([#8494](https://github.com/paperless-ngx/paperless-ngx/pull/8494)) +- Fix: fix occasional error toast overflow [@shamoon](https://github.com/shamoon) ([#8552](https://github.com/paperless-ngx/paperless-ngx/pull/8552)) +- Fix: fix share link archive version detection [@shamoon](https://github.com/shamoon) ([#8551](https://github.com/paperless-ngx/paperless-ngx/pull/8551)) +- Chore(deps-dev): Bump ruff from 0.8.3 to 0.8.4 in the development group [@dependabot](https://github.com/dependabot) ([#8546](https://github.com/paperless-ngx/paperless-ngx/pull/8546)) +- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#8547](https://github.com/paperless-ngx/paperless-ngx/pull/8547)) +- Enhancement: add timeout for Tika client [@HiranChaudhuri](https://github.com/HiranChaudhuri) ([#8520](https://github.com/paperless-ngx/paperless-ngx/pull/8520)) +- Fix: add some minor frontend permissions checks [@shamoon](https://github.com/shamoon) ([#8524](https://github.com/paperless-ngx/paperless-ngx/pull/8524)) +- FIx: obliquely trim spaces from global search [@shamoon](https://github.com/shamoon) ([#8484](https://github.com/paperless-ngx/paperless-ngx/pull/8484)) +- Fix: include global perms for bulk edit endpoint [@shamoon](https://github.com/shamoon) ([#8468](https://github.com/paperless-ngx/paperless-ngx/pull/8468)) +- Enhancement: process mail button [@shamoon](https://github.com/shamoon) ([#8466](https://github.com/paperless-ngx/paperless-ngx/pull/8466)) +- Fix: frontend better reflect global perms for bulk edit, disabled form state [@shamoon](https://github.com/shamoon) ([#8469](https://github.com/paperless-ngx/paperless-ngx/pull/8469)) +- Chore: update ng2 pdf viewer [@shamoon](https://github.com/shamoon) ([#8462](https://github.com/paperless-ngx/paperless-ngx/pull/8462)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#8458](https://github.com/paperless-ngx/paperless-ngx/pull/8458)) +- Chore(deps): Bump django-soft-delete from 1.0.15 to 1.0.16 in the django group [@dependabot](https://github.com/dependabot) ([#8459](https://github.com/paperless-ngx/paperless-ngx/pull/8459)) +- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#8460](https://github.com/paperless-ngx/paperless-ngx/pull/8460)) +- Chore: use rxjs instead of JS setInterval for timers [@shamoon](https://github.com/shamoon) ([#8461](https://github.com/paperless-ngx/paperless-ngx/pull/8461)) +- Feature: bulk edit custom field values [@shamoon](https://github.com/shamoon) ([#8428](https://github.com/paperless-ngx/paperless-ngx/pull/8428)) +- Enhancement: improved loading visuals [@shamoon](https://github.com/shamoon) ([#8435](https://github.com/paperless-ngx/paperless-ngx/pull/8435)) +- Enhancement: prune audit logs and management command [@shamoon](https://github.com/shamoon) ([#8416](https://github.com/paperless-ngx/paperless-ngx/pull/8416)) +- Change: make saved views manage its own component [@shamoon](https://github.com/shamoon) ([#8423](https://github.com/paperless-ngx/paperless-ngx/pull/8423)) +- Enhancement: file task filtering [@shamoon](https://github.com/shamoon) ([#8421](https://github.com/paperless-ngx/paperless-ngx/pull/8421)) +- Enhancement: auto-link duplicate document [@shamoon](https://github.com/shamoon) ([#8415](https://github.com/paperless-ngx/paperless-ngx/pull/8415)) +- Enhancement: include current filename placeholder in workflows @Lu-Fi ([#8319](https://github.com/paperless-ngx/paperless-ngx/pull/8319)) +- Feature: email, webhook workflow actions [@shamoon](https://github.com/shamoon) ([#8108](https://github.com/paperless-ngx/paperless-ngx/pull/8108)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8414](https://github.com/paperless-ngx/paperless-ngx/pull/8414)) +- Enhancement: use stable unique IDs for custom field select options [@shamoon](https://github.com/shamoon) ([#8299](https://github.com/paperless-ngx/paperless-ngx/pull/8299)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#8352](https://github.com/paperless-ngx/paperless-ngx/pull/8352)) +- Enhancement: better TIFF display browser support [@shamoon](https://github.com/shamoon) ([#8087](https://github.com/paperless-ngx/paperless-ngx/pull/8087)) +- Chore(deps): Bump the small-changes group across 1 directory with 7 updates [@dependabot](https://github.com/dependabot) ([#8399](https://github.com/paperless-ngx/paperless-ngx/pull/8399)) +- Enhancement: History (audit log) for bulk edit operations [@shamoon](https://github.com/shamoon) ([#8196](https://github.com/paperless-ngx/paperless-ngx/pull/8196)) +- Enhancement: larger previews in action dialogs [@shamoon](https://github.com/shamoon) ([#8387](https://github.com/paperless-ngx/paperless-ngx/pull/8387)) +- Enhancement: filterable list count sorting and opacification [@shamoon](https://github.com/shamoon) ([#8386](https://github.com/paperless-ngx/paperless-ngx/pull/8386)) +- Enhancement: preview button for document list and trash, refactor [@shamoon](https://github.com/shamoon) ([#8384](https://github.com/paperless-ngx/paperless-ngx/pull/8384)) +- Fixhancement: dispatch change event from current field prior to save [@shamoon](https://github.com/shamoon) ([#8369](https://github.com/paperless-ngx/paperless-ngx/pull/8369)) +- Enhancement: use theme-color meta tag [@shamoon](https://github.com/shamoon) ([#8359](https://github.com/paperless-ngx/paperless-ngx/pull/8359)) +- Chore: cleanup urls, use actions for some views [@shamoon](https://github.com/shamoon) ([#8346](https://github.com/paperless-ngx/paperless-ngx/pull/8346)) +- Feature: scheduled workflow trigger [@shamoon](https://github.com/shamoon) ([#8036](https://github.com/paperless-ngx/paperless-ngx/pull/8036)) +- Fix: handle very old dates with positive offset too [@shamoon](https://github.com/shamoon) ([#8335](https://github.com/paperless-ngx/paperless-ngx/pull/8335)) +- Refactor: fix unnecessary use of filterable dropdown sorting [@shamoon](https://github.com/shamoon) ([#8328](https://github.com/paperless-ngx/paperless-ngx/pull/8328)) +- Enhancement: offer link to restored document [@shamoon](https://github.com/shamoon) ([#8321](https://github.com/paperless-ngx/paperless-ngx/pull/8321)) +- Enhancement: support owner permissions for file tasks [@shamoon](https://github.com/shamoon) ([#8195](https://github.com/paperless-ngx/paperless-ngx/pull/8195)) +- Fixhancement: change update content to handle archive disabled [@shamoon](https://github.com/shamoon) ([#8315](https://github.com/paperless-ngx/paperless-ngx/pull/8315)) +- Chore(deps): Bump watchdog from 5.0.3 to 6.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#8257](https://github.com/paperless-ngx/paperless-ngx/pull/8257)) +- Enhancement: Add --compare-json option to document_exporter to write json files only if changed [@kdoren](https://github.com/kdoren) ([#8261](https://github.com/paperless-ngx/paperless-ngx/pull/8261)) +- Enhancement: next / previous shortcuts for document list [@shamoon](https://github.com/shamoon) ([#8309](https://github.com/paperless-ngx/paperless-ngx/pull/8309)) +- Feature: two-factor authentication [@shamoon](https://github.com/shamoon) ([#8012](https://github.com/paperless-ngx/paperless-ngx/pull/8012)) +- Fix: include db_index caveat in squashed migrations [@shamoon](https://github.com/shamoon) ([#8292](https://github.com/paperless-ngx/paperless-ngx/pull/8292)) +- Tweak: use fixed position for navbar [@shamoon](https://github.com/shamoon) ([#8279](https://github.com/paperless-ngx/paperless-ngx/pull/8279)) +- Fix: prevent duplicate workflow runs [@shamoon](https://github.com/shamoon) ([#8268](https://github.com/paperless-ngx/paperless-ngx/pull/8268)) +- Fix: add note about select options to edit dialog [@shamoon](https://github.com/shamoon) ([#8267](https://github.com/paperless-ngx/paperless-ngx/pull/8267)) +- Enhancement: save \& next / close shortcut key [@shamoon](https://github.com/shamoon) ([#8243](https://github.com/paperless-ngx/paperless-ngx/pull/8243)) +- Feature: loading preview, better text popup preview [@shamoon](https://github.com/shamoon) ([#8011](https://github.com/paperless-ngx/paperless-ngx/pull/8011)) +- Chore: switch src/documents/bulk\*.py from os.path to pathlib.Path [@gothicVI](https://github.com/gothicVI) ([#7862](https://github.com/paperless-ngx/paperless-ngx/pull/7862)) +- Chore: Bulk backend dependency updates [@stumpylog](https://github.com/stumpylog) ([#8212](https://github.com/paperless-ngx/paperless-ngx/pull/8212))
## paperless-ngx 2.13.5 ### Bug Fixes -- Fix: handle page count exception for pw-protected files [@shamoon](https://github.com/shamoon) ([#8240](https://github.com/paperless-ngx/paperless-ngx/pull/8240)) -- Fix: correctly track task id in list for change detection [@shamoon](https://github.com/shamoon) ([#8230](https://github.com/paperless-ngx/paperless-ngx/pull/8230)) -- Fix: Admin pages should show trashed documents [@stumpylog](https://github.com/stumpylog) ([#8068](https://github.com/paperless-ngx/paperless-ngx/pull/8068)) -- Fix: tag colors shouldn't change when selected in list [@shamoon](https://github.com/shamoon) ([#8225](https://github.com/paperless-ngx/paperless-ngx/pull/8225)) -- Fix: fix re-activation of save button when changing array items [@shamoon](https://github.com/shamoon) ([#8208](https://github.com/paperless-ngx/paperless-ngx/pull/8208)) -- Fix: fix thumbnail clipping, select inverted color in safari dark mode not system [@shamoon](https://github.com/shamoon) ([#8193](https://github.com/paperless-ngx/paperless-ngx/pull/8193)) -- Fix: select checkbox should remain visible [@shamoon](https://github.com/shamoon) ([#8185](https://github.com/paperless-ngx/paperless-ngx/pull/8185)) -- Fix: warn with proper error on ASN exists in trash [@shamoon](https://github.com/shamoon) ([#8176](https://github.com/paperless-ngx/paperless-ngx/pull/8176)) +- Fix: handle page count exception for pw-protected files [@shamoon](https://github.com/shamoon) ([#8240](https://github.com/paperless-ngx/paperless-ngx/pull/8240)) +- Fix: correctly track task id in list for change detection [@shamoon](https://github.com/shamoon) ([#8230](https://github.com/paperless-ngx/paperless-ngx/pull/8230)) +- Fix: Admin pages should show trashed documents [@stumpylog](https://github.com/stumpylog) ([#8068](https://github.com/paperless-ngx/paperless-ngx/pull/8068)) +- Fix: tag colors shouldn't change when selected in list [@shamoon](https://github.com/shamoon) ([#8225](https://github.com/paperless-ngx/paperless-ngx/pull/8225)) +- Fix: fix re-activation of save button when changing array items [@shamoon](https://github.com/shamoon) ([#8208](https://github.com/paperless-ngx/paperless-ngx/pull/8208)) +- Fix: fix thumbnail clipping, select inverted color in safari dark mode not system [@shamoon](https://github.com/shamoon) ([#8193](https://github.com/paperless-ngx/paperless-ngx/pull/8193)) +- Fix: select checkbox should remain visible [@shamoon](https://github.com/shamoon) ([#8185](https://github.com/paperless-ngx/paperless-ngx/pull/8185)) +- Fix: warn with proper error on ASN exists in trash [@shamoon](https://github.com/shamoon) ([#8176](https://github.com/paperless-ngx/paperless-ngx/pull/8176)) ### Maintenance -- Chore: Updates all runner images to use Ubuntu Noble [@stumpylog](https://github.com/stumpylog) ([#8213](https://github.com/paperless-ngx/paperless-ngx/pull/8213)) -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.8.0 to 0.9.0 in the actions group [@dependabot](https://github.com/dependabot) ([#8142](https://github.com/paperless-ngx/paperless-ngx/pull/8142)) +- Chore: Updates all runner images to use Ubuntu Noble [@stumpylog](https://github.com/stumpylog) ([#8213](https://github.com/paperless-ngx/paperless-ngx/pull/8213)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.8.0 to 0.9.0 in the actions group [@dependabot](https://github.com/dependabot) ([#8142](https://github.com/paperless-ngx/paperless-ngx/pull/8142)) ### Dependencies -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.8.0 to 0.9.0 in the actions group [@dependabot](https://github.com/dependabot) ([#8142](https://github.com/paperless-ngx/paperless-ngx/pull/8142)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.8.0 to 0.9.0 in the actions group [@dependabot](https://github.com/dependabot) ([#8142](https://github.com/paperless-ngx/paperless-ngx/pull/8142)) ### All App Changes
7 changes -- Fix: handle page count exception for pw-protected files [@shamoon](https://github.com/shamoon) ([#8240](https://github.com/paperless-ngx/paperless-ngx/pull/8240)) -- Fix: correctly track task id in list for change detection [@shamoon](https://github.com/shamoon) ([#8230](https://github.com/paperless-ngx/paperless-ngx/pull/8230)) -- Fix: Admin pages should show trashed documents [@stumpylog](https://github.com/stumpylog) ([#8068](https://github.com/paperless-ngx/paperless-ngx/pull/8068)) -- Fix: tag colors shouldn't change when selected in list [@shamoon](https://github.com/shamoon) ([#8225](https://github.com/paperless-ngx/paperless-ngx/pull/8225)) -- Fix: fix re-activation of save button when changing array items [@shamoon](https://github.com/shamoon) ([#8208](https://github.com/paperless-ngx/paperless-ngx/pull/8208)) -- Fix: fix thumbnail clipping, select inverted color in safari dark mode not system [@shamoon](https://github.com/shamoon) ([#8193](https://github.com/paperless-ngx/paperless-ngx/pull/8193)) -- Fix: select checkbox should remain visible [@shamoon](https://github.com/shamoon) ([#8185](https://github.com/paperless-ngx/paperless-ngx/pull/8185)) -- Fix: warn with proper error on ASN exists in trash [@shamoon](https://github.com/shamoon) ([#8176](https://github.com/paperless-ngx/paperless-ngx/pull/8176)) +- Fix: handle page count exception for pw-protected files [@shamoon](https://github.com/shamoon) ([#8240](https://github.com/paperless-ngx/paperless-ngx/pull/8240)) +- Fix: correctly track task id in list for change detection [@shamoon](https://github.com/shamoon) ([#8230](https://github.com/paperless-ngx/paperless-ngx/pull/8230)) +- Fix: Admin pages should show trashed documents [@stumpylog](https://github.com/stumpylog) ([#8068](https://github.com/paperless-ngx/paperless-ngx/pull/8068)) +- Fix: tag colors shouldn't change when selected in list [@shamoon](https://github.com/shamoon) ([#8225](https://github.com/paperless-ngx/paperless-ngx/pull/8225)) +- Fix: fix re-activation of save button when changing array items [@shamoon](https://github.com/shamoon) ([#8208](https://github.com/paperless-ngx/paperless-ngx/pull/8208)) +- Fix: fix thumbnail clipping, select inverted color in safari dark mode not system [@shamoon](https://github.com/shamoon) ([#8193](https://github.com/paperless-ngx/paperless-ngx/pull/8193)) +- Fix: select checkbox should remain visible [@shamoon](https://github.com/shamoon) ([#8185](https://github.com/paperless-ngx/paperless-ngx/pull/8185)) +- Fix: warn with proper error on ASN exists in trash [@shamoon](https://github.com/shamoon) ([#8176](https://github.com/paperless-ngx/paperless-ngx/pull/8176))
## paperless-ngx 2.13.4 ### Bug Fixes -- Fix: fix dark mode icon blend mode in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8166](https://github.com/paperless-ngx/paperless-ngx/pull/8166)) -- Fix: fix clipped popup preview in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8165](https://github.com/paperless-ngx/paperless-ngx/pull/8165)) +- Fix: fix dark mode icon blend mode in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8166](https://github.com/paperless-ngx/paperless-ngx/pull/8166)) +- Fix: fix clipped popup preview in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8165](https://github.com/paperless-ngx/paperless-ngx/pull/8165)) ### All App Changes
2 changes -- Fix: fix dark mode icon blend mode in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8166](https://github.com/paperless-ngx/paperless-ngx/pull/8166)) -- Fix: fix clipped popup preview in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8165](https://github.com/paperless-ngx/paperless-ngx/pull/8165)) +- Fix: fix dark mode icon blend mode in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8166](https://github.com/paperless-ngx/paperless-ngx/pull/8166)) +- Fix: fix clipped popup preview in 2.13.3 [@shamoon](https://github.com/shamoon) ([#8165](https://github.com/paperless-ngx/paperless-ngx/pull/8165))
## paperless-ngx 2.13.3 ### Bug Fixes -- Fix: fix auto-clean PDFs, create parent dir for storing unmodified original [@shamoon](https://github.com/shamoon) ([#8157](https://github.com/paperless-ngx/paperless-ngx/pull/8157)) -- Fix: correctly handle exists, false in custom field query filter @yichi-yang ([#8158](https://github.com/paperless-ngx/paperless-ngx/pull/8158)) -- Fix: dont use filters for inverted thumbnails in Safari [@shamoon](https://github.com/shamoon) ([#8121](https://github.com/paperless-ngx/paperless-ngx/pull/8121)) -- Fix: use static object for activedisplayfields to prevent changes [@shamoon](https://github.com/shamoon) ([#8120](https://github.com/paperless-ngx/paperless-ngx/pull/8120)) -- Fix: dont invert pdf colors in FF [@shamoon](https://github.com/shamoon) ([#8110](https://github.com/paperless-ngx/paperless-ngx/pull/8110)) -- Fix: make mail account password and refresh token text fields [@shamoon](https://github.com/shamoon) ([#8107](https://github.com/paperless-ngx/paperless-ngx/pull/8107)) +- Fix: fix auto-clean PDFs, create parent dir for storing unmodified original [@shamoon](https://github.com/shamoon) ([#8157](https://github.com/paperless-ngx/paperless-ngx/pull/8157)) +- Fix: correctly handle exists, false in custom field query filter @yichi-yang ([#8158](https://github.com/paperless-ngx/paperless-ngx/pull/8158)) +- Fix: dont use filters for inverted thumbnails in Safari [@shamoon](https://github.com/shamoon) ([#8121](https://github.com/paperless-ngx/paperless-ngx/pull/8121)) +- Fix: use static object for activedisplayfields to prevent changes [@shamoon](https://github.com/shamoon) ([#8120](https://github.com/paperless-ngx/paperless-ngx/pull/8120)) +- Fix: dont invert pdf colors in FF [@shamoon](https://github.com/shamoon) ([#8110](https://github.com/paperless-ngx/paperless-ngx/pull/8110)) +- Fix: make mail account password and refresh token text fields [@shamoon](https://github.com/shamoon) ([#8107](https://github.com/paperless-ngx/paperless-ngx/pull/8107)) ### Dependencies
8 changes -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#8145](https://github.com/paperless-ngx/paperless-ngx/pull/8145)) -- Chore(deps-dev): Bump @types/node from 22.7.4 to 22.8.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#8148](https://github.com/paperless-ngx/paperless-ngx/pull/8148)) -- Chore(deps-dev): Bump @playwright/test from 1.47.2 to 1.48.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8147](https://github.com/paperless-ngx/paperless-ngx/pull/8147)) -- Chore(deps): Bump uuid from 10.0.0 to 11.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8146](https://github.com/paperless-ngx/paperless-ngx/pull/8146)) -- Chore(deps): Bump tslib from 2.7.0 to 2.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8149](https://github.com/paperless-ngx/paperless-ngx/pull/8149)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.0 to 1.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8150](https://github.com/paperless-ngx/paperless-ngx/pull/8150)) -- Chore(deps-dev): Bump @types/jest from 29.5.13 to 29.5.14 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#8144](https://github.com/paperless-ngx/paperless-ngx/pull/8144)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#8143](https://github.com/paperless-ngx/paperless-ngx/pull/8143)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#8145](https://github.com/paperless-ngx/paperless-ngx/pull/8145)) +- Chore(deps-dev): Bump @types/node from 22.7.4 to 22.8.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#8148](https://github.com/paperless-ngx/paperless-ngx/pull/8148)) +- Chore(deps-dev): Bump @playwright/test from 1.47.2 to 1.48.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8147](https://github.com/paperless-ngx/paperless-ngx/pull/8147)) +- Chore(deps): Bump uuid from 10.0.0 to 11.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8146](https://github.com/paperless-ngx/paperless-ngx/pull/8146)) +- Chore(deps): Bump tslib from 2.7.0 to 2.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8149](https://github.com/paperless-ngx/paperless-ngx/pull/8149)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.0 to 1.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8150](https://github.com/paperless-ngx/paperless-ngx/pull/8150)) +- Chore(deps-dev): Bump @types/jest from 29.5.13 to 29.5.14 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#8144](https://github.com/paperless-ngx/paperless-ngx/pull/8144)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#8143](https://github.com/paperless-ngx/paperless-ngx/pull/8143))
### All App Changes @@ -1467,142 +1861,142 @@
14 changes -- Fix: fix auto-clean PDFs, create parent dir for storing unmodified original [@shamoon](https://github.com/shamoon) ([#8157](https://github.com/paperless-ngx/paperless-ngx/pull/8157)) -- Fix: correctly handle exists, false in custom field query filter @yichi-yang ([#8158](https://github.com/paperless-ngx/paperless-ngx/pull/8158)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#8145](https://github.com/paperless-ngx/paperless-ngx/pull/8145)) -- Chore(deps-dev): Bump @types/node from 22.7.4 to 22.8.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#8148](https://github.com/paperless-ngx/paperless-ngx/pull/8148)) -- Chore(deps-dev): Bump @playwright/test from 1.47.2 to 1.48.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8147](https://github.com/paperless-ngx/paperless-ngx/pull/8147)) -- Chore(deps): Bump uuid from 10.0.0 to 11.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8146](https://github.com/paperless-ngx/paperless-ngx/pull/8146)) -- Chore(deps): Bump tslib from 2.7.0 to 2.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8149](https://github.com/paperless-ngx/paperless-ngx/pull/8149)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.0 to 1.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8150](https://github.com/paperless-ngx/paperless-ngx/pull/8150)) -- Chore(deps-dev): Bump @types/jest from 29.5.13 to 29.5.14 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#8144](https://github.com/paperless-ngx/paperless-ngx/pull/8144)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#8143](https://github.com/paperless-ngx/paperless-ngx/pull/8143)) -- Fix: dont use filters for inverted thumbnails in Safari [@shamoon](https://github.com/shamoon) ([#8121](https://github.com/paperless-ngx/paperless-ngx/pull/8121)) -- Fix: use static object for activedisplayfields to prevent changes [@shamoon](https://github.com/shamoon) ([#8120](https://github.com/paperless-ngx/paperless-ngx/pull/8120)) -- Fix: dont invert pdf colors in FF [@shamoon](https://github.com/shamoon) ([#8110](https://github.com/paperless-ngx/paperless-ngx/pull/8110)) -- Fix: make mail account password and refresh token text fields [@shamoon](https://github.com/shamoon) ([#8107](https://github.com/paperless-ngx/paperless-ngx/pull/8107)) +- Fix: fix auto-clean PDFs, create parent dir for storing unmodified original [@shamoon](https://github.com/shamoon) ([#8157](https://github.com/paperless-ngx/paperless-ngx/pull/8157)) +- Fix: correctly handle exists, false in custom field query filter @yichi-yang ([#8158](https://github.com/paperless-ngx/paperless-ngx/pull/8158)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#8145](https://github.com/paperless-ngx/paperless-ngx/pull/8145)) +- Chore(deps-dev): Bump @types/node from 22.7.4 to 22.8.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#8148](https://github.com/paperless-ngx/paperless-ngx/pull/8148)) +- Chore(deps-dev): Bump @playwright/test from 1.47.2 to 1.48.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8147](https://github.com/paperless-ngx/paperless-ngx/pull/8147)) +- Chore(deps): Bump uuid from 10.0.0 to 11.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#8146](https://github.com/paperless-ngx/paperless-ngx/pull/8146)) +- Chore(deps): Bump tslib from 2.7.0 to 2.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8149](https://github.com/paperless-ngx/paperless-ngx/pull/8149)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.2.0 to 1.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#8150](https://github.com/paperless-ngx/paperless-ngx/pull/8150)) +- Chore(deps-dev): Bump @types/jest from 29.5.13 to 29.5.14 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#8144](https://github.com/paperless-ngx/paperless-ngx/pull/8144)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#8143](https://github.com/paperless-ngx/paperless-ngx/pull/8143)) +- Fix: dont use filters for inverted thumbnails in Safari [@shamoon](https://github.com/shamoon) ([#8121](https://github.com/paperless-ngx/paperless-ngx/pull/8121)) +- Fix: use static object for activedisplayfields to prevent changes [@shamoon](https://github.com/shamoon) ([#8120](https://github.com/paperless-ngx/paperless-ngx/pull/8120)) +- Fix: dont invert pdf colors in FF [@shamoon](https://github.com/shamoon) ([#8110](https://github.com/paperless-ngx/paperless-ngx/pull/8110)) +- Fix: make mail account password and refresh token text fields [@shamoon](https://github.com/shamoon) ([#8107](https://github.com/paperless-ngx/paperless-ngx/pull/8107))
## paperless-ngx 2.13.2 ### Bug Fixes -- Fix: remove auth tokens from export [@shamoon](https://github.com/shamoon) ([#8100](https://github.com/paperless-ngx/paperless-ngx/pull/8100)) -- Fix: cf query dropdown styling affecting other components [@shamoon](https://github.com/shamoon) ([#8095](https://github.com/paperless-ngx/paperless-ngx/pull/8095)) +- Fix: remove auth tokens from export [@shamoon](https://github.com/shamoon) ([#8100](https://github.com/paperless-ngx/paperless-ngx/pull/8100)) +- Fix: cf query dropdown styling affecting other components [@shamoon](https://github.com/shamoon) ([#8095](https://github.com/paperless-ngx/paperless-ngx/pull/8095)) ### All App Changes
2 changes -- Fix: remove auth tokens from export [@shamoon](https://github.com/shamoon) ([#8100](https://github.com/paperless-ngx/paperless-ngx/pull/8100)) -- Fix: cf query dropdown styling affecting other components [@shamoon](https://github.com/shamoon) ([#8095](https://github.com/paperless-ngx/paperless-ngx/pull/8095)) +- Fix: remove auth tokens from export [@shamoon](https://github.com/shamoon) ([#8100](https://github.com/paperless-ngx/paperless-ngx/pull/8100)) +- Fix: cf query dropdown styling affecting other components [@shamoon](https://github.com/shamoon) ([#8095](https://github.com/paperless-ngx/paperless-ngx/pull/8095))
## paperless-ngx 2.13.1 ### Bug Fixes -- Fix: allow removing dead document links from UI, validate via API [@shamoon](https://github.com/shamoon) ([#8081](https://github.com/paperless-ngx/paperless-ngx/pull/8081)) -- Fix: Removes whitenoise patches and upgrades it to 6.8.1 [@stumpylog](https://github.com/stumpylog) ([#8079](https://github.com/paperless-ngx/paperless-ngx/pull/8079)) -- Fix: Make all document related objects soft delete, fix filepath when deleted [@shamoon](https://github.com/shamoon) ([#8067](https://github.com/paperless-ngx/paperless-ngx/pull/8067)) -- Fix: handle uuid fields created under mariadb and Django 4 [@shamoon](https://github.com/shamoon) ([#8034](https://github.com/paperless-ngx/paperless-ngx/pull/8034)) -- Fix: Update filename correctly if the document is in the trash [@stumpylog](https://github.com/stumpylog) ([#8066](https://github.com/paperless-ngx/paperless-ngx/pull/8066)) -- Fix: Handle a special case where removing none marker could result in an absolute path [@stumpylog](https://github.com/stumpylog) ([#8060](https://github.com/paperless-ngx/paperless-ngx/pull/8060)) -- Fix: disable custom field signals during import in 2.13.0 [@shamoon](https://github.com/shamoon) ([#8065](https://github.com/paperless-ngx/paperless-ngx/pull/8065)) -- Fix: doc link documents search should exclude null [@shamoon](https://github.com/shamoon) ([#8064](https://github.com/paperless-ngx/paperless-ngx/pull/8064)) -- Fix: fix custom field query empty element removal [@shamoon](https://github.com/shamoon) ([#8056](https://github.com/paperless-ngx/paperless-ngx/pull/8056)) -- Fix / Enhancement: auto-rename document files when select type custom fields are changed [@shamoon](https://github.com/shamoon) ([#8045](https://github.com/paperless-ngx/paperless-ngx/pull/8045)) -- Fix: dont try to load PAPERLESS_MODEL_FILE as env from file [@shamoon](https://github.com/shamoon) ([#8040](https://github.com/paperless-ngx/paperless-ngx/pull/8040)) -- Fix: dont include all allauth urls [@shamoon](https://github.com/shamoon) ([#8010](https://github.com/paperless-ngx/paperless-ngx/pull/8010)) -- Fix: oauth settings without base url [@shamoon](https://github.com/shamoon) ([#8020](https://github.com/paperless-ngx/paperless-ngx/pull/8020)) -- Fix / Enhancement: include social accounts and api tokens in export [@shamoon](https://github.com/shamoon) ([#8016](https://github.com/paperless-ngx/paperless-ngx/pull/8016)) +- Fix: allow removing dead document links from UI, validate via API [@shamoon](https://github.com/shamoon) ([#8081](https://github.com/paperless-ngx/paperless-ngx/pull/8081)) +- Fix: Removes whitenoise patches and upgrades it to 6.8.1 [@stumpylog](https://github.com/stumpylog) ([#8079](https://github.com/paperless-ngx/paperless-ngx/pull/8079)) +- Fix: Make all document related objects soft delete, fix filepath when deleted [@shamoon](https://github.com/shamoon) ([#8067](https://github.com/paperless-ngx/paperless-ngx/pull/8067)) +- Fix: handle uuid fields created under mariadb and Django 4 [@shamoon](https://github.com/shamoon) ([#8034](https://github.com/paperless-ngx/paperless-ngx/pull/8034)) +- Fix: Update filename correctly if the document is in the trash [@stumpylog](https://github.com/stumpylog) ([#8066](https://github.com/paperless-ngx/paperless-ngx/pull/8066)) +- Fix: Handle a special case where removing none marker could result in an absolute path [@stumpylog](https://github.com/stumpylog) ([#8060](https://github.com/paperless-ngx/paperless-ngx/pull/8060)) +- Fix: disable custom field signals during import in 2.13.0 [@shamoon](https://github.com/shamoon) ([#8065](https://github.com/paperless-ngx/paperless-ngx/pull/8065)) +- Fix: doc link documents search should exclude null [@shamoon](https://github.com/shamoon) ([#8064](https://github.com/paperless-ngx/paperless-ngx/pull/8064)) +- Fix: fix custom field query empty element removal [@shamoon](https://github.com/shamoon) ([#8056](https://github.com/paperless-ngx/paperless-ngx/pull/8056)) +- Fix / Enhancement: auto-rename document files when select type custom fields are changed [@shamoon](https://github.com/shamoon) ([#8045](https://github.com/paperless-ngx/paperless-ngx/pull/8045)) +- Fix: dont try to load PAPERLESS_MODEL_FILE as env from file [@shamoon](https://github.com/shamoon) ([#8040](https://github.com/paperless-ngx/paperless-ngx/pull/8040)) +- Fix: dont include all allauth urls [@shamoon](https://github.com/shamoon) ([#8010](https://github.com/paperless-ngx/paperless-ngx/pull/8010)) +- Fix: oauth settings without base url [@shamoon](https://github.com/shamoon) ([#8020](https://github.com/paperless-ngx/paperless-ngx/pull/8020)) +- Fix / Enhancement: include social accounts and api tokens in export [@shamoon](https://github.com/shamoon) ([#8016](https://github.com/paperless-ngx/paperless-ngx/pull/8016)) ### Maintenance -- Fix: Removes whitenoise patches and upgrades it to 6.8.1 [@stumpylog](https://github.com/stumpylog) ([#8079](https://github.com/paperless-ngx/paperless-ngx/pull/8079)) +- Fix: Removes whitenoise patches and upgrades it to 6.8.1 [@stumpylog](https://github.com/stumpylog) ([#8079](https://github.com/paperless-ngx/paperless-ngx/pull/8079)) ### All App Changes
12 changes -- Fix: allow removing dead document links from UI, validate via API [@shamoon](https://github.com/shamoon) ([#8081](https://github.com/paperless-ngx/paperless-ngx/pull/8081)) -- Fix: Make all document related objects soft delete, fix filepath when deleted [@shamoon](https://github.com/shamoon) ([#8067](https://github.com/paperless-ngx/paperless-ngx/pull/8067)) -- Fix: handle uuid fields created under mariadb and Django 4 [@shamoon](https://github.com/shamoon) ([#8034](https://github.com/paperless-ngx/paperless-ngx/pull/8034)) -- Fix: Update filename correctly if the document is in the trash [@stumpylog](https://github.com/stumpylog) ([#8066](https://github.com/paperless-ngx/paperless-ngx/pull/8066)) -- Fix: Handle a special case where removing none marker could result in an absolute path [@stumpylog](https://github.com/stumpylog) ([#8060](https://github.com/paperless-ngx/paperless-ngx/pull/8060)) -- Fix: disable custom field signals during import in 2.13.0 [@shamoon](https://github.com/shamoon) ([#8065](https://github.com/paperless-ngx/paperless-ngx/pull/8065)) -- Fix: doc link documents search should exclude null [@shamoon](https://github.com/shamoon) ([#8064](https://github.com/paperless-ngx/paperless-ngx/pull/8064)) -- Enhancement: auto-rename document files when select type custom fields are changed [@shamoon](https://github.com/shamoon) ([#8045](https://github.com/paperless-ngx/paperless-ngx/pull/8045)) -- Fix: fix custom field query empty element removal [@shamoon](https://github.com/shamoon) ([#8056](https://github.com/paperless-ngx/paperless-ngx/pull/8056)) -- Fix: dont include all allauth urls [@shamoon](https://github.com/shamoon) ([#8010](https://github.com/paperless-ngx/paperless-ngx/pull/8010)) -- Enhancement / fix: include social accounts and api tokens in export [@shamoon](https://github.com/shamoon) ([#8016](https://github.com/paperless-ngx/paperless-ngx/pull/8016)) -- Fix: oauth settings without base url [@shamoon](https://github.com/shamoon) ([#8020](https://github.com/paperless-ngx/paperless-ngx/pull/8020)) +- Fix: allow removing dead document links from UI, validate via API [@shamoon](https://github.com/shamoon) ([#8081](https://github.com/paperless-ngx/paperless-ngx/pull/8081)) +- Fix: Make all document related objects soft delete, fix filepath when deleted [@shamoon](https://github.com/shamoon) ([#8067](https://github.com/paperless-ngx/paperless-ngx/pull/8067)) +- Fix: handle uuid fields created under mariadb and Django 4 [@shamoon](https://github.com/shamoon) ([#8034](https://github.com/paperless-ngx/paperless-ngx/pull/8034)) +- Fix: Update filename correctly if the document is in the trash [@stumpylog](https://github.com/stumpylog) ([#8066](https://github.com/paperless-ngx/paperless-ngx/pull/8066)) +- Fix: Handle a special case where removing none marker could result in an absolute path [@stumpylog](https://github.com/stumpylog) ([#8060](https://github.com/paperless-ngx/paperless-ngx/pull/8060)) +- Fix: disable custom field signals during import in 2.13.0 [@shamoon](https://github.com/shamoon) ([#8065](https://github.com/paperless-ngx/paperless-ngx/pull/8065)) +- Fix: doc link documents search should exclude null [@shamoon](https://github.com/shamoon) ([#8064](https://github.com/paperless-ngx/paperless-ngx/pull/8064)) +- Enhancement: auto-rename document files when select type custom fields are changed [@shamoon](https://github.com/shamoon) ([#8045](https://github.com/paperless-ngx/paperless-ngx/pull/8045)) +- Fix: fix custom field query empty element removal [@shamoon](https://github.com/shamoon) ([#8056](https://github.com/paperless-ngx/paperless-ngx/pull/8056)) +- Fix: dont include all allauth urls [@shamoon](https://github.com/shamoon) ([#8010](https://github.com/paperless-ngx/paperless-ngx/pull/8010)) +- Enhancement / fix: include social accounts and api tokens in export [@shamoon](https://github.com/shamoon) ([#8016](https://github.com/paperless-ngx/paperless-ngx/pull/8016)) +- Fix: oauth settings without base url [@shamoon](https://github.com/shamoon) ([#8020](https://github.com/paperless-ngx/paperless-ngx/pull/8020))
## paperless-ngx 2.13.0 ### Notable Changes -- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) -- Feature: Enhanced templating for filename format [@stumpylog](https://github.com/stumpylog) ([#7836](https://github.com/paperless-ngx/paperless-ngx/pull/7836)) -- Feature: custom fields queries [@shamoon](https://github.com/shamoon) ([#7761](https://github.com/paperless-ngx/paperless-ngx/pull/7761)) -- Chore: Drop Python 3.9 support [@stumpylog](https://github.com/stumpylog) ([#7774](https://github.com/paperless-ngx/paperless-ngx/pull/7774)) +- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) +- Feature: Enhanced templating for filename format [@stumpylog](https://github.com/stumpylog) ([#7836](https://github.com/paperless-ngx/paperless-ngx/pull/7836)) +- Feature: custom fields queries [@shamoon](https://github.com/shamoon) ([#7761](https://github.com/paperless-ngx/paperless-ngx/pull/7761)) +- Chore: Drop Python 3.9 support [@stumpylog](https://github.com/stumpylog) ([#7774](https://github.com/paperless-ngx/paperless-ngx/pull/7774)) ### Features -- Enhancement: QoL, auto-focus default select field in custom field dropdown [@shamoon](https://github.com/shamoon) ([#7961](https://github.com/paperless-ngx/paperless-ngx/pull/7961)) -- Change: open not edit [@shamoon](https://github.com/shamoon) ([#7942](https://github.com/paperless-ngx/paperless-ngx/pull/7942)) -- Enhancement: support retain barcode split pages [@shamoon](https://github.com/shamoon) ([#7912](https://github.com/paperless-ngx/paperless-ngx/pull/7912)) -- Enhancement: don't wait for doc API to load preview [@shamoon](https://github.com/shamoon) ([#7894](https://github.com/paperless-ngx/paperless-ngx/pull/7894)) -- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) -- Enhancement: live preview of storage path [@shamoon](https://github.com/shamoon) ([#7870](https://github.com/paperless-ngx/paperless-ngx/pull/7870)) -- Enhancement: management list button improvements [@shamoon](https://github.com/shamoon) ([#7848](https://github.com/paperless-ngx/paperless-ngx/pull/7848)) -- Enhancement: check for mail destination directory, log post-consume errors [@mrichtarsky](https://github.com/mrichtarsky) ([#7808](https://github.com/paperless-ngx/paperless-ngx/pull/7808)) -- Enhancement: workflow overview toggle enable button [@shamoon](https://github.com/shamoon) ([#7818](https://github.com/paperless-ngx/paperless-ngx/pull/7818)) -- Enhancement: disable-able mail rules, add toggle to overview [@shamoon](https://github.com/shamoon) ([#7810](https://github.com/paperless-ngx/paperless-ngx/pull/7810)) -- Feature: auto-clean some invalid pdfs [@shamoon](https://github.com/shamoon) ([#7651](https://github.com/paperless-ngx/paperless-ngx/pull/7651)) -- Feature: page count [@s0llvan](https://github.com/s0llvan) ([#7750](https://github.com/paperless-ngx/paperless-ngx/pull/7750)) -- Enhancement: use apt only when needed docker-entrypoint.sh [@gawa971](https://github.com/gawa971) ([#7756](https://github.com/paperless-ngx/paperless-ngx/pull/7756)) -- Enhancement: set Django SESSION_EXPIRE_AT_BROWSER_CLOSE from PAPERLESS_ACCOUNT_SESSION_REMEMBER [@shamoon](https://github.com/shamoon) ([#7748](https://github.com/paperless-ngx/paperless-ngx/pull/7748)) -- Enhancement: allow setting session cookie age [@shamoon](https://github.com/shamoon) ([#7743](https://github.com/paperless-ngx/paperless-ngx/pull/7743)) -- Feature: copy workflows and mail rules, improve layout [@shamoon](https://github.com/shamoon) ([#7727](https://github.com/paperless-ngx/paperless-ngx/pull/7727)) +- Enhancement: QoL, auto-focus default select field in custom field dropdown [@shamoon](https://github.com/shamoon) ([#7961](https://github.com/paperless-ngx/paperless-ngx/pull/7961)) +- Change: open not edit [@shamoon](https://github.com/shamoon) ([#7942](https://github.com/paperless-ngx/paperless-ngx/pull/7942)) +- Enhancement: support retain barcode split pages [@shamoon](https://github.com/shamoon) ([#7912](https://github.com/paperless-ngx/paperless-ngx/pull/7912)) +- Enhancement: don't wait for doc API to load preview [@shamoon](https://github.com/shamoon) ([#7894](https://github.com/paperless-ngx/paperless-ngx/pull/7894)) +- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) +- Enhancement: live preview of storage path [@shamoon](https://github.com/shamoon) ([#7870](https://github.com/paperless-ngx/paperless-ngx/pull/7870)) +- Enhancement: management list button improvements [@shamoon](https://github.com/shamoon) ([#7848](https://github.com/paperless-ngx/paperless-ngx/pull/7848)) +- Enhancement: check for mail destination directory, log post-consume errors [@mrichtarsky](https://github.com/mrichtarsky) ([#7808](https://github.com/paperless-ngx/paperless-ngx/pull/7808)) +- Enhancement: workflow overview toggle enable button [@shamoon](https://github.com/shamoon) ([#7818](https://github.com/paperless-ngx/paperless-ngx/pull/7818)) +- Enhancement: disable-able mail rules, add toggle to overview [@shamoon](https://github.com/shamoon) ([#7810](https://github.com/paperless-ngx/paperless-ngx/pull/7810)) +- Feature: auto-clean some invalid pdfs [@shamoon](https://github.com/shamoon) ([#7651](https://github.com/paperless-ngx/paperless-ngx/pull/7651)) +- Feature: page count [@s0llvan](https://github.com/s0llvan) ([#7750](https://github.com/paperless-ngx/paperless-ngx/pull/7750)) +- Enhancement: use apt only when needed docker-entrypoint.sh [@gawa971](https://github.com/gawa971) ([#7756](https://github.com/paperless-ngx/paperless-ngx/pull/7756)) +- Enhancement: set Django SESSION_EXPIRE_AT_BROWSER_CLOSE from PAPERLESS_ACCOUNT_SESSION_REMEMBER [@shamoon](https://github.com/shamoon) ([#7748](https://github.com/paperless-ngx/paperless-ngx/pull/7748)) +- Enhancement: allow setting session cookie age [@shamoon](https://github.com/shamoon) ([#7743](https://github.com/paperless-ngx/paperless-ngx/pull/7743)) +- Feature: copy workflows and mail rules, improve layout [@shamoon](https://github.com/shamoon) ([#7727](https://github.com/paperless-ngx/paperless-ngx/pull/7727)) ### Bug Fixes -- Fix: remove space before my profile button in dropdown [@tooomm](https://github.com/tooomm) ([#7963](https://github.com/paperless-ngx/paperless-ngx/pull/7963)) -- Fix: v2.13.0 RC1 - Handling of Nones when using custom fields in filepath templating [@stumpylog](https://github.com/stumpylog) ([#7933](https://github.com/paperless-ngx/paperless-ngx/pull/7933)) -- Fix: v2.13.0 RC1 - trigger move and rename after CustomFieldInstance saved [@shamoon](https://github.com/shamoon) ([#7927](https://github.com/paperless-ngx/paperless-ngx/pull/7927)) -- Fix: v2.13.0 RC1 - increase field max lengths to accommodate larger tokens [@shamoon](https://github.com/shamoon) ([#7916](https://github.com/paperless-ngx/paperless-ngx/pull/7916)) -- Fix: preserve text linebreaks in doc edit [@shamoon](https://github.com/shamoon) ([#7908](https://github.com/paperless-ngx/paperless-ngx/pull/7908)) -- Fix: only show colon on cards if correspondent and title shown [@shamoon](https://github.com/shamoon) ([#7893](https://github.com/paperless-ngx/paperless-ngx/pull/7893)) -- Fix: Allow ASN values of 0 from barcodes [@stumpylog](https://github.com/stumpylog) ([#7878](https://github.com/paperless-ngx/paperless-ngx/pull/7878)) -- Fix: fix auto-dismiss completed tasks on open document [@shamoon](https://github.com/shamoon) ([#7869](https://github.com/paperless-ngx/paperless-ngx/pull/7869)) -- Fix: trigger change warning for saved views with default fields if changed [@shamoon](https://github.com/shamoon) ([#7865](https://github.com/paperless-ngx/paperless-ngx/pull/7865)) -- Fix: hidden canvas element causes scroll bug [@shamoon](https://github.com/shamoon) ([#7770](https://github.com/paperless-ngx/paperless-ngx/pull/7770)) -- Fix: handle overflowing dropdowns on mobile [@shamoon](https://github.com/shamoon) ([#7758](https://github.com/paperless-ngx/paperless-ngx/pull/7758)) -- Fix: chrome scrolling in >= 129 [@shamoon](https://github.com/shamoon) ([#7738](https://github.com/paperless-ngx/paperless-ngx/pull/7738)) +- Fix: remove space before my profile button in dropdown [@tooomm](https://github.com/tooomm) ([#7963](https://github.com/paperless-ngx/paperless-ngx/pull/7963)) +- Fix: v2.13.0 RC1 - Handling of Nones when using custom fields in filepath templating [@stumpylog](https://github.com/stumpylog) ([#7933](https://github.com/paperless-ngx/paperless-ngx/pull/7933)) +- Fix: v2.13.0 RC1 - trigger move and rename after CustomFieldInstance saved [@shamoon](https://github.com/shamoon) ([#7927](https://github.com/paperless-ngx/paperless-ngx/pull/7927)) +- Fix: v2.13.0 RC1 - increase field max lengths to accommodate larger tokens [@shamoon](https://github.com/shamoon) ([#7916](https://github.com/paperless-ngx/paperless-ngx/pull/7916)) +- Fix: preserve text linebreaks in doc edit [@shamoon](https://github.com/shamoon) ([#7908](https://github.com/paperless-ngx/paperless-ngx/pull/7908)) +- Fix: only show colon on cards if correspondent and title shown [@shamoon](https://github.com/shamoon) ([#7893](https://github.com/paperless-ngx/paperless-ngx/pull/7893)) +- Fix: Allow ASN values of 0 from barcodes [@stumpylog](https://github.com/stumpylog) ([#7878](https://github.com/paperless-ngx/paperless-ngx/pull/7878)) +- Fix: fix auto-dismiss completed tasks on open document [@shamoon](https://github.com/shamoon) ([#7869](https://github.com/paperless-ngx/paperless-ngx/pull/7869)) +- Fix: trigger change warning for saved views with default fields if changed [@shamoon](https://github.com/shamoon) ([#7865](https://github.com/paperless-ngx/paperless-ngx/pull/7865)) +- Fix: hidden canvas element causes scroll bug [@shamoon](https://github.com/shamoon) ([#7770](https://github.com/paperless-ngx/paperless-ngx/pull/7770)) +- Fix: handle overflowing dropdowns on mobile [@shamoon](https://github.com/shamoon) ([#7758](https://github.com/paperless-ngx/paperless-ngx/pull/7758)) +- Fix: chrome scrolling in >= 129 [@shamoon](https://github.com/shamoon) ([#7738](https://github.com/paperless-ngx/paperless-ngx/pull/7738)) ### Maintenance -- Enhancement: use apt only when needed docker-entrypoint.sh [@gawa971](https://github.com/gawa971) ([#7756](https://github.com/paperless-ngx/paperless-ngx/pull/7756)) +- Enhancement: use apt only when needed docker-entrypoint.sh [@gawa971](https://github.com/gawa971) ([#7756](https://github.com/paperless-ngx/paperless-ngx/pull/7756)) ### Dependencies
10 changes -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.0.1 to 1.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7830](https://github.com/paperless-ngx/paperless-ngx/pull/7830)) -- Chore(deps-dev): Bump @types/node from 22.5.2 to 22.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7829](https://github.com/paperless-ngx/paperless-ngx/pull/7829)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7827](https://github.com/paperless-ngx/paperless-ngx/pull/7827)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#7826](https://github.com/paperless-ngx/paperless-ngx/pull/7826)) -- Chore(deps-dev): Bump @playwright/test from 1.46.1 to 1.47.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#7828](https://github.com/paperless-ngx/paperless-ngx/pull/7828)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7825](https://github.com/paperless-ngx/paperless-ngx/pull/7825)) -- Chore: Upgrades OCRMyPDF to v16 [@stumpylog](https://github.com/stumpylog) ([#7815](https://github.com/paperless-ngx/paperless-ngx/pull/7815)) -- Chore: Upgrades the Docker image to use Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#7796](https://github.com/paperless-ngx/paperless-ngx/pull/7796)) -- Chore: Upgrade Django to 5.1 [@stumpylog](https://github.com/stumpylog) ([#7795](https://github.com/paperless-ngx/paperless-ngx/pull/7795)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7723](https://github.com/paperless-ngx/paperless-ngx/pull/7723)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.0.1 to 1.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7830](https://github.com/paperless-ngx/paperless-ngx/pull/7830)) +- Chore(deps-dev): Bump @types/node from 22.5.2 to 22.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7829](https://github.com/paperless-ngx/paperless-ngx/pull/7829)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7827](https://github.com/paperless-ngx/paperless-ngx/pull/7827)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#7826](https://github.com/paperless-ngx/paperless-ngx/pull/7826)) +- Chore(deps-dev): Bump @playwright/test from 1.46.1 to 1.47.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#7828](https://github.com/paperless-ngx/paperless-ngx/pull/7828)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7825](https://github.com/paperless-ngx/paperless-ngx/pull/7825)) +- Chore: Upgrades OCRMyPDF to v16 [@stumpylog](https://github.com/stumpylog) ([#7815](https://github.com/paperless-ngx/paperless-ngx/pull/7815)) +- Chore: Upgrades the Docker image to use Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#7796](https://github.com/paperless-ngx/paperless-ngx/pull/7796)) +- Chore: Upgrade Django to 5.1 [@stumpylog](https://github.com/stumpylog) ([#7795](https://github.com/paperless-ngx/paperless-ngx/pull/7795)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7723](https://github.com/paperless-ngx/paperless-ngx/pull/7723))
### All App Changes @@ -1610,114 +2004,114 @@
43 changes -- Change: Use a TextField for the storage path field [@stumpylog](https://github.com/stumpylog) ([#7967](https://github.com/paperless-ngx/paperless-ngx/pull/7967)) -- Fix: remove space before my profile button in dropdown [@tooomm](https://github.com/tooomm) ([#7963](https://github.com/paperless-ngx/paperless-ngx/pull/7963)) -- Enhancement: QoL, auto-focus default select field in custom field dropdown [@shamoon](https://github.com/shamoon) ([#7961](https://github.com/paperless-ngx/paperless-ngx/pull/7961)) -- Change: open not edit [@shamoon](https://github.com/shamoon) ([#7942](https://github.com/paperless-ngx/paperless-ngx/pull/7942)) -- Fix: v2.13.0 RC1 - Handling of Nones when using custom fields in filepath templating [@stumpylog](https://github.com/stumpylog) ([#7933](https://github.com/paperless-ngx/paperless-ngx/pull/7933)) -- Fix: v2.13.0 RC1 - trigger move and rename after CustomFieldInstance saved [@shamoon](https://github.com/shamoon) ([#7927](https://github.com/paperless-ngx/paperless-ngx/pull/7927)) -- Fix: v2.13.0 RC1 - increase field max lengths to accommodate larger tokens [@shamoon](https://github.com/shamoon) ([#7916](https://github.com/paperless-ngx/paperless-ngx/pull/7916)) -- Enhancement: support retain barcode split pages [@shamoon](https://github.com/shamoon) ([#7912](https://github.com/paperless-ngx/paperless-ngx/pull/7912)) -- Fix: preserve text linebreaks in doc edit [@shamoon](https://github.com/shamoon) ([#7908](https://github.com/paperless-ngx/paperless-ngx/pull/7908)) -- Enhancement: don't wait for doc API to load preview [@shamoon](https://github.com/shamoon) ([#7894](https://github.com/paperless-ngx/paperless-ngx/pull/7894)) -- Fix: only show colon on cards if correspondent and title shown [@shamoon](https://github.com/shamoon) ([#7893](https://github.com/paperless-ngx/paperless-ngx/pull/7893)) -- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) -- Chore: Consolidate workflow logic [@shamoon](https://github.com/shamoon) ([#7880](https://github.com/paperless-ngx/paperless-ngx/pull/7880)) -- Enhancement: live preview of storage path [@shamoon](https://github.com/shamoon) ([#7870](https://github.com/paperless-ngx/paperless-ngx/pull/7870)) -- Fix: Allow ASN values of 0 from barcodes [@stumpylog](https://github.com/stumpylog) ([#7878](https://github.com/paperless-ngx/paperless-ngx/pull/7878)) -- Fix: fix auto-dismiss completed tasks on open document [@shamoon](https://github.com/shamoon) ([#7869](https://github.com/paperless-ngx/paperless-ngx/pull/7869)) -- Fix: trigger change warning for saved views with default fields if changed [@shamoon](https://github.com/shamoon) ([#7865](https://github.com/paperless-ngx/paperless-ngx/pull/7865)) -- Feature: Enhanced templating for filename format [@stumpylog](https://github.com/stumpylog) ([#7836](https://github.com/paperless-ngx/paperless-ngx/pull/7836)) -- Enhancement: management list button improvements [@shamoon](https://github.com/shamoon) ([#7848](https://github.com/paperless-ngx/paperless-ngx/pull/7848)) -- Enhancement: check for mail destination directory, log post-consume errors [@mrichtarsky](https://github.com/mrichtarsky) ([#7808](https://github.com/paperless-ngx/paperless-ngx/pull/7808)) -- Feature: custom fields queries [@shamoon](https://github.com/shamoon) ([#7761](https://github.com/paperless-ngx/paperless-ngx/pull/7761)) -- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.0.1 to 1.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7830](https://github.com/paperless-ngx/paperless-ngx/pull/7830)) -- Chore(deps-dev): Bump @types/node from 22.5.2 to 22.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7829](https://github.com/paperless-ngx/paperless-ngx/pull/7829)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7827](https://github.com/paperless-ngx/paperless-ngx/pull/7827)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#7826](https://github.com/paperless-ngx/paperless-ngx/pull/7826)) -- Chore(deps-dev): Bump @playwright/test from 1.46.1 to 1.47.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#7828](https://github.com/paperless-ngx/paperless-ngx/pull/7828)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7825](https://github.com/paperless-ngx/paperless-ngx/pull/7825)) -- Chore: Upgrades OCRMyPDF to v16 [@stumpylog](https://github.com/stumpylog) ([#7815](https://github.com/paperless-ngx/paperless-ngx/pull/7815)) -- Enhancement: workflow overview toggle enable button [@shamoon](https://github.com/shamoon) ([#7818](https://github.com/paperless-ngx/paperless-ngx/pull/7818)) -- Enhancement: disable-able mail rules, add toggle to overview [@shamoon](https://github.com/shamoon) ([#7810](https://github.com/paperless-ngx/paperless-ngx/pull/7810)) -- Chore: Upgrades the Docker image to use Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#7796](https://github.com/paperless-ngx/paperless-ngx/pull/7796)) -- Chore: Upgrade Django to 5.1 [@stumpylog](https://github.com/stumpylog) ([#7795](https://github.com/paperless-ngx/paperless-ngx/pull/7795)) -- Chore: Drop Python 3.9 support [@stumpylog](https://github.com/stumpylog) ([#7774](https://github.com/paperless-ngx/paperless-ngx/pull/7774)) -- Feature: auto-clean some invalid pdfs [@shamoon](https://github.com/shamoon) ([#7651](https://github.com/paperless-ngx/paperless-ngx/pull/7651)) -- Feature: page count [@s0llvan](https://github.com/s0llvan) ([#7750](https://github.com/paperless-ngx/paperless-ngx/pull/7750)) -- Fix: hidden canvas element causes scroll bug [@shamoon](https://github.com/shamoon) ([#7770](https://github.com/paperless-ngx/paperless-ngx/pull/7770)) -- Enhancement: compactify dates dropdown [@shamoon](https://github.com/shamoon) ([#7759](https://github.com/paperless-ngx/paperless-ngx/pull/7759)) -- Fix: handle overflowing dropdowns on mobile [@shamoon](https://github.com/shamoon) ([#7758](https://github.com/paperless-ngx/paperless-ngx/pull/7758)) -- Enhancement: set Django SESSION_EXPIRE_AT_BROWSER_CLOSE from PAPERLESS_ACCOUNT_SESSION_REMEMBER [@shamoon](https://github.com/shamoon) ([#7748](https://github.com/paperless-ngx/paperless-ngx/pull/7748)) -- Enhancement: allow setting session cookie age [@shamoon](https://github.com/shamoon) ([#7743](https://github.com/paperless-ngx/paperless-ngx/pull/7743)) -- Fix: chrome scrolling in >= 129 [@shamoon](https://github.com/shamoon) ([#7738](https://github.com/paperless-ngx/paperless-ngx/pull/7738)) -- Feature: copy workflows and mail rules, improve layout [@shamoon](https://github.com/shamoon) ([#7727](https://github.com/paperless-ngx/paperless-ngx/pull/7727)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7723](https://github.com/paperless-ngx/paperless-ngx/pull/7723)) +- Change: Use a TextField for the storage path field [@stumpylog](https://github.com/stumpylog) ([#7967](https://github.com/paperless-ngx/paperless-ngx/pull/7967)) +- Fix: remove space before my profile button in dropdown [@tooomm](https://github.com/tooomm) ([#7963](https://github.com/paperless-ngx/paperless-ngx/pull/7963)) +- Enhancement: QoL, auto-focus default select field in custom field dropdown [@shamoon](https://github.com/shamoon) ([#7961](https://github.com/paperless-ngx/paperless-ngx/pull/7961)) +- Change: open not edit [@shamoon](https://github.com/shamoon) ([#7942](https://github.com/paperless-ngx/paperless-ngx/pull/7942)) +- Fix: v2.13.0 RC1 - Handling of Nones when using custom fields in filepath templating [@stumpylog](https://github.com/stumpylog) ([#7933](https://github.com/paperless-ngx/paperless-ngx/pull/7933)) +- Fix: v2.13.0 RC1 - trigger move and rename after CustomFieldInstance saved [@shamoon](https://github.com/shamoon) ([#7927](https://github.com/paperless-ngx/paperless-ngx/pull/7927)) +- Fix: v2.13.0 RC1 - increase field max lengths to accommodate larger tokens [@shamoon](https://github.com/shamoon) ([#7916](https://github.com/paperless-ngx/paperless-ngx/pull/7916)) +- Enhancement: support retain barcode split pages [@shamoon](https://github.com/shamoon) ([#7912](https://github.com/paperless-ngx/paperless-ngx/pull/7912)) +- Fix: preserve text linebreaks in doc edit [@shamoon](https://github.com/shamoon) ([#7908](https://github.com/paperless-ngx/paperless-ngx/pull/7908)) +- Enhancement: don't wait for doc API to load preview [@shamoon](https://github.com/shamoon) ([#7894](https://github.com/paperless-ngx/paperless-ngx/pull/7894)) +- Fix: only show colon on cards if correspondent and title shown [@shamoon](https://github.com/shamoon) ([#7893](https://github.com/paperless-ngx/paperless-ngx/pull/7893)) +- Feature: OAuth2 Gmail and Outlook email support [@shamoon](https://github.com/shamoon) ([#7866](https://github.com/paperless-ngx/paperless-ngx/pull/7866)) +- Chore: Consolidate workflow logic [@shamoon](https://github.com/shamoon) ([#7880](https://github.com/paperless-ngx/paperless-ngx/pull/7880)) +- Enhancement: live preview of storage path [@shamoon](https://github.com/shamoon) ([#7870](https://github.com/paperless-ngx/paperless-ngx/pull/7870)) +- Fix: Allow ASN values of 0 from barcodes [@stumpylog](https://github.com/stumpylog) ([#7878](https://github.com/paperless-ngx/paperless-ngx/pull/7878)) +- Fix: fix auto-dismiss completed tasks on open document [@shamoon](https://github.com/shamoon) ([#7869](https://github.com/paperless-ngx/paperless-ngx/pull/7869)) +- Fix: trigger change warning for saved views with default fields if changed [@shamoon](https://github.com/shamoon) ([#7865](https://github.com/paperless-ngx/paperless-ngx/pull/7865)) +- Feature: Enhanced templating for filename format [@stumpylog](https://github.com/stumpylog) ([#7836](https://github.com/paperless-ngx/paperless-ngx/pull/7836)) +- Enhancement: management list button improvements [@shamoon](https://github.com/shamoon) ([#7848](https://github.com/paperless-ngx/paperless-ngx/pull/7848)) +- Enhancement: check for mail destination directory, log post-consume errors [@mrichtarsky](https://github.com/mrichtarsky) ([#7808](https://github.com/paperless-ngx/paperless-ngx/pull/7808)) +- Feature: custom fields queries [@shamoon](https://github.com/shamoon) ([#7761](https://github.com/paperless-ngx/paperless-ngx/pull/7761)) +- Chore(deps-dev): Bump @codecov/webpack-plugin from 1.0.1 to 1.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7830](https://github.com/paperless-ngx/paperless-ngx/pull/7830)) +- Chore(deps-dev): Bump @types/node from 22.5.2 to 22.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7829](https://github.com/paperless-ngx/paperless-ngx/pull/7829)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7827](https://github.com/paperless-ngx/paperless-ngx/pull/7827)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#7826](https://github.com/paperless-ngx/paperless-ngx/pull/7826)) +- Chore(deps-dev): Bump @playwright/test from 1.46.1 to 1.47.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#7828](https://github.com/paperless-ngx/paperless-ngx/pull/7828)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7825](https://github.com/paperless-ngx/paperless-ngx/pull/7825)) +- Chore: Upgrades OCRMyPDF to v16 [@stumpylog](https://github.com/stumpylog) ([#7815](https://github.com/paperless-ngx/paperless-ngx/pull/7815)) +- Enhancement: workflow overview toggle enable button [@shamoon](https://github.com/shamoon) ([#7818](https://github.com/paperless-ngx/paperless-ngx/pull/7818)) +- Enhancement: disable-able mail rules, add toggle to overview [@shamoon](https://github.com/shamoon) ([#7810](https://github.com/paperless-ngx/paperless-ngx/pull/7810)) +- Chore: Upgrades the Docker image to use Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#7796](https://github.com/paperless-ngx/paperless-ngx/pull/7796)) +- Chore: Upgrade Django to 5.1 [@stumpylog](https://github.com/stumpylog) ([#7795](https://github.com/paperless-ngx/paperless-ngx/pull/7795)) +- Chore: Drop Python 3.9 support [@stumpylog](https://github.com/stumpylog) ([#7774](https://github.com/paperless-ngx/paperless-ngx/pull/7774)) +- Feature: auto-clean some invalid pdfs [@shamoon](https://github.com/shamoon) ([#7651](https://github.com/paperless-ngx/paperless-ngx/pull/7651)) +- Feature: page count [@s0llvan](https://github.com/s0llvan) ([#7750](https://github.com/paperless-ngx/paperless-ngx/pull/7750)) +- Fix: hidden canvas element causes scroll bug [@shamoon](https://github.com/shamoon) ([#7770](https://github.com/paperless-ngx/paperless-ngx/pull/7770)) +- Enhancement: compactify dates dropdown [@shamoon](https://github.com/shamoon) ([#7759](https://github.com/paperless-ngx/paperless-ngx/pull/7759)) +- Fix: handle overflowing dropdowns on mobile [@shamoon](https://github.com/shamoon) ([#7758](https://github.com/paperless-ngx/paperless-ngx/pull/7758)) +- Enhancement: set Django SESSION_EXPIRE_AT_BROWSER_CLOSE from PAPERLESS_ACCOUNT_SESSION_REMEMBER [@shamoon](https://github.com/shamoon) ([#7748](https://github.com/paperless-ngx/paperless-ngx/pull/7748)) +- Enhancement: allow setting session cookie age [@shamoon](https://github.com/shamoon) ([#7743](https://github.com/paperless-ngx/paperless-ngx/pull/7743)) +- Fix: chrome scrolling in >= 129 [@shamoon](https://github.com/shamoon) ([#7738](https://github.com/paperless-ngx/paperless-ngx/pull/7738)) +- Feature: copy workflows and mail rules, improve layout [@shamoon](https://github.com/shamoon) ([#7727](https://github.com/paperless-ngx/paperless-ngx/pull/7727)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7723](https://github.com/paperless-ngx/paperless-ngx/pull/7723))
## paperless-ngx 2.12.1 ### Bug Fixes -- Fix: wait to apply tag changes until other changes saved with multiple workflow actions [@shamoon](https://github.com/shamoon) ([#7711](https://github.com/paperless-ngx/paperless-ngx/pull/7711)) -- Fix: delete_pages should require ownership (not just change perms) [@shamoon](https://github.com/shamoon) ([#7714](https://github.com/paperless-ngx/paperless-ngx/pull/7714)) -- Fix: filter out shown custom fields that have been deleted from saved… [@shamoon](https://github.com/shamoon) ([#7710](https://github.com/paperless-ngx/paperless-ngx/pull/7710)) -- Fix: only filter by string or number properties for filter pipe [@shamoon](https://github.com/shamoon) ([#7699](https://github.com/paperless-ngx/paperless-ngx/pull/7699)) -- Fix: saved view permissions fixes [@shamoon](https://github.com/shamoon) ([#7672](https://github.com/paperless-ngx/paperless-ngx/pull/7672)) -- Fix: add permissions for OPTIONS requests for notes [@shamoon](https://github.com/shamoon) ([#7661](https://github.com/paperless-ngx/paperless-ngx/pull/7661)) +- Fix: wait to apply tag changes until other changes saved with multiple workflow actions [@shamoon](https://github.com/shamoon) ([#7711](https://github.com/paperless-ngx/paperless-ngx/pull/7711)) +- Fix: delete_pages should require ownership (not just change perms) [@shamoon](https://github.com/shamoon) ([#7714](https://github.com/paperless-ngx/paperless-ngx/pull/7714)) +- Fix: filter out shown custom fields that have been deleted from saved… [@shamoon](https://github.com/shamoon) ([#7710](https://github.com/paperless-ngx/paperless-ngx/pull/7710)) +- Fix: only filter by string or number properties for filter pipe [@shamoon](https://github.com/shamoon) ([#7699](https://github.com/paperless-ngx/paperless-ngx/pull/7699)) +- Fix: saved view permissions fixes [@shamoon](https://github.com/shamoon) ([#7672](https://github.com/paperless-ngx/paperless-ngx/pull/7672)) +- Fix: add permissions for OPTIONS requests for notes [@shamoon](https://github.com/shamoon) ([#7661](https://github.com/paperless-ngx/paperless-ngx/pull/7661)) ### All App Changes
7 changes -- Fix: wait to apply tag changes until other changes saved with multiple workflow actions [@shamoon](https://github.com/shamoon) ([#7711](https://github.com/paperless-ngx/paperless-ngx/pull/7711)) -- Fix: delete_pages should require ownership (not just change perms) [@shamoon](https://github.com/shamoon) ([#7714](https://github.com/paperless-ngx/paperless-ngx/pull/7714)) -- Enhancement: improve text contrast for selected documents in list view dark mode [@shamoon](https://github.com/shamoon) ([#7712](https://github.com/paperless-ngx/paperless-ngx/pull/7712)) -- Fix: filter out shown custom fields that have been deleted from saved… [@shamoon](https://github.com/shamoon) ([#7710](https://github.com/paperless-ngx/paperless-ngx/pull/7710)) -- Fix: only filter by string or number properties for filter pipe [@shamoon](https://github.com/shamoon) ([#7699](https://github.com/paperless-ngx/paperless-ngx/pull/7699)) -- Fix: saved view permissions fixes [@shamoon](https://github.com/shamoon) ([#7672](https://github.com/paperless-ngx/paperless-ngx/pull/7672)) -- Fix: add permissions for OPTIONS requests for notes [@shamoon](https://github.com/shamoon) ([#7661](https://github.com/paperless-ngx/paperless-ngx/pull/7661)) +- Fix: wait to apply tag changes until other changes saved with multiple workflow actions [@shamoon](https://github.com/shamoon) ([#7711](https://github.com/paperless-ngx/paperless-ngx/pull/7711)) +- Fix: delete_pages should require ownership (not just change perms) [@shamoon](https://github.com/shamoon) ([#7714](https://github.com/paperless-ngx/paperless-ngx/pull/7714)) +- Enhancement: improve text contrast for selected documents in list view dark mode [@shamoon](https://github.com/shamoon) ([#7712](https://github.com/paperless-ngx/paperless-ngx/pull/7712)) +- Fix: filter out shown custom fields that have been deleted from saved… [@shamoon](https://github.com/shamoon) ([#7710](https://github.com/paperless-ngx/paperless-ngx/pull/7710)) +- Fix: only filter by string or number properties for filter pipe [@shamoon](https://github.com/shamoon) ([#7699](https://github.com/paperless-ngx/paperless-ngx/pull/7699)) +- Fix: saved view permissions fixes [@shamoon](https://github.com/shamoon) ([#7672](https://github.com/paperless-ngx/paperless-ngx/pull/7672)) +- Fix: add permissions for OPTIONS requests for notes [@shamoon](https://github.com/shamoon) ([#7661](https://github.com/paperless-ngx/paperless-ngx/pull/7661))
## paperless-ngx 2.12.0 ### Features / Enhancements -- Enhancement: re-work mail rule dialog, support multiple include patterns [@shamoon](https://github.com/shamoon) ([#7635](https://github.com/paperless-ngx/paperless-ngx/pull/7635)) -- Enhancement: add Korean language [@shamoon](https://github.com/shamoon) ([#7573](https://github.com/paperless-ngx/paperless-ngx/pull/7573)) -- Enhancement: allow multiple filename attachment exclusion patterns for a mail rule [@MelleD](https://github.com/MelleD) ([#5524](https://github.com/paperless-ngx/paperless-ngx/pull/5524)) -- Refactor: Use django-filter logic for filtering full text search queries [@yichi-yang](https://github.com/yichi-yang) ([#7507](https://github.com/paperless-ngx/paperless-ngx/pull/7507)) -- Refactor: Reduce number of SQL queries when serializing List[Document] [@yichi-yang](https://github.com/yichi-yang) ([#7505](https://github.com/paperless-ngx/paperless-ngx/pull/7505)) +- Enhancement: re-work mail rule dialog, support multiple include patterns [@shamoon](https://github.com/shamoon) ([#7635](https://github.com/paperless-ngx/paperless-ngx/pull/7635)) +- Enhancement: add Korean language [@shamoon](https://github.com/shamoon) ([#7573](https://github.com/paperless-ngx/paperless-ngx/pull/7573)) +- Enhancement: allow multiple filename attachment exclusion patterns for a mail rule [@MelleD](https://github.com/MelleD) ([#5524](https://github.com/paperless-ngx/paperless-ngx/pull/5524)) +- Refactor: Use django-filter logic for filtering full text search queries [@yichi-yang](https://github.com/yichi-yang) ([#7507](https://github.com/paperless-ngx/paperless-ngx/pull/7507)) +- Refactor: Reduce number of SQL queries when serializing List[Document] [@yichi-yang](https://github.com/yichi-yang) ([#7505](https://github.com/paperless-ngx/paperless-ngx/pull/7505)) ### Bug Fixes -- Fix: use JSON for note audit log entries [@shamoon](https://github.com/shamoon) ([#7650](https://github.com/paperless-ngx/paperless-ngx/pull/7650)) -- Fix: Rework system check so it won't crash if tesseract is not found [@stumpylog](https://github.com/stumpylog) ([#7640](https://github.com/paperless-ngx/paperless-ngx/pull/7640)) -- Fix: correct broken pdfjs worker src after upgrade to pdfjs v4 [@shamoon](https://github.com/shamoon) ([#7626](https://github.com/paperless-ngx/paperless-ngx/pull/7626)) -- Chore: remove unused frontend dependencies [@shamoon](https://github.com/shamoon) ([#7607](https://github.com/paperless-ngx/paperless-ngx/pull/7607)) -- Fix: fix non-clickable scroll wheel in file uploads list [@shamoon](https://github.com/shamoon) ([#7591](https://github.com/paperless-ngx/paperless-ngx/pull/7591)) -- Fix: deselect file tasks select all button on dismiss [@shamoon](https://github.com/shamoon) ([#7592](https://github.com/paperless-ngx/paperless-ngx/pull/7592)) -- Fix: saved view sidebar heading not always visible [@shamoon](https://github.com/shamoon) ([#7584](https://github.com/paperless-ngx/paperless-ngx/pull/7584)) -- Fix: correct select field wrapping with long text [@shamoon](https://github.com/shamoon) ([#7572](https://github.com/paperless-ngx/paperless-ngx/pull/7572)) -- Fix: update ng-bootstrap to fix datepicker bug [@shamoon](https://github.com/shamoon) ([#7567](https://github.com/paperless-ngx/paperless-ngx/pull/7567)) +- Fix: use JSON for note audit log entries [@shamoon](https://github.com/shamoon) ([#7650](https://github.com/paperless-ngx/paperless-ngx/pull/7650)) +- Fix: Rework system check so it won't crash if tesseract is not found [@stumpylog](https://github.com/stumpylog) ([#7640](https://github.com/paperless-ngx/paperless-ngx/pull/7640)) +- Fix: correct broken pdfjs worker src after upgrade to pdfjs v4 [@shamoon](https://github.com/shamoon) ([#7626](https://github.com/paperless-ngx/paperless-ngx/pull/7626)) +- Chore: remove unused frontend dependencies [@shamoon](https://github.com/shamoon) ([#7607](https://github.com/paperless-ngx/paperless-ngx/pull/7607)) +- Fix: fix non-clickable scroll wheel in file uploads list [@shamoon](https://github.com/shamoon) ([#7591](https://github.com/paperless-ngx/paperless-ngx/pull/7591)) +- Fix: deselect file tasks select all button on dismiss [@shamoon](https://github.com/shamoon) ([#7592](https://github.com/paperless-ngx/paperless-ngx/pull/7592)) +- Fix: saved view sidebar heading not always visible [@shamoon](https://github.com/shamoon) ([#7584](https://github.com/paperless-ngx/paperless-ngx/pull/7584)) +- Fix: correct select field wrapping with long text [@shamoon](https://github.com/shamoon) ([#7572](https://github.com/paperless-ngx/paperless-ngx/pull/7572)) +- Fix: update ng-bootstrap to fix datepicker bug [@shamoon](https://github.com/shamoon) ([#7567](https://github.com/paperless-ngx/paperless-ngx/pull/7567)) ### Dependencies
11 changes -- Chore(deps): Bump cryptography from 42.0.8 to 43.0.1 [@dependabot](https://github.com/dependabot) ([#7620](https://github.com/paperless-ngx/paperless-ngx/pull/7620)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7608](https://github.com/paperless-ngx/paperless-ngx/pull/7608)) -- Chore(deps): Bump rapidfuzz from 3.9.6 to 3.9.7 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7611](https://github.com/paperless-ngx/paperless-ngx/pull/7611)) -- Chore(deps): Bump tslib from 2.6.3 to 2.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7606](https://github.com/paperless-ngx/paperless-ngx/pull/7606)) -- Chore(deps-dev): Bump [@playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot) ([#7603](https://github.com/paperless-ngx/paperless-ngx/pull/7603)) -- Chore(deps-dev): Bump typescript from 5.4.5 to 5.5.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7604](https://github.com/paperless-ngx/paperless-ngx/pull/7604)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7600](https://github.com/paperless-ngx/paperless-ngx/pull/7600)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7599](https://github.com/paperless-ngx/paperless-ngx/pull/7599)) -- Chore(deps): Bump pathvalidate from 3.2.0 to 3.2.1 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7548](https://github.com/paperless-ngx/paperless-ngx/pull/7548)) -- Chore(deps): Bump micromatch from 4.0.5 to 4.0.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7551](https://github.com/paperless-ngx/paperless-ngx/pull/7551)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7545](https://github.com/paperless-ngx/paperless-ngx/pull/7545)) +- Chore(deps): Bump cryptography from 42.0.8 to 43.0.1 [@dependabot](https://github.com/dependabot) ([#7620](https://github.com/paperless-ngx/paperless-ngx/pull/7620)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7608](https://github.com/paperless-ngx/paperless-ngx/pull/7608)) +- Chore(deps): Bump rapidfuzz from 3.9.6 to 3.9.7 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7611](https://github.com/paperless-ngx/paperless-ngx/pull/7611)) +- Chore(deps): Bump tslib from 2.6.3 to 2.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7606](https://github.com/paperless-ngx/paperless-ngx/pull/7606)) +- Chore(deps-dev): Bump [@playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot) ([#7603](https://github.com/paperless-ngx/paperless-ngx/pull/7603)) +- Chore(deps-dev): Bump typescript from 5.4.5 to 5.5.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7604](https://github.com/paperless-ngx/paperless-ngx/pull/7604)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7600](https://github.com/paperless-ngx/paperless-ngx/pull/7600)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7599](https://github.com/paperless-ngx/paperless-ngx/pull/7599)) +- Chore(deps): Bump pathvalidate from 3.2.0 to 3.2.1 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7548](https://github.com/paperless-ngx/paperless-ngx/pull/7548)) +- Chore(deps): Bump micromatch from 4.0.5 to 4.0.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7551](https://github.com/paperless-ngx/paperless-ngx/pull/7551)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7545](https://github.com/paperless-ngx/paperless-ngx/pull/7545))
### All App Changes @@ -1725,66 +2119,66 @@
27 changes -- Chore: Update backend dependencies in bulk [@stumpylog](https://github.com/stumpylog) ([#7656](https://github.com/paperless-ngx/paperless-ngx/pull/7656)) -- Fix: Rework system check so it won't crash if tesseract is not found [@stumpylog](https://github.com/stumpylog) ([#7640](https://github.com/paperless-ngx/paperless-ngx/pull/7640)) -- Refactor: performance and storage optimization of barcode scanning [@loewexy](https://github.com/loewexy) ([#7646](https://github.com/paperless-ngx/paperless-ngx/pull/7646)) -- Fix: use JSON for note audit log entries [@shamoon](https://github.com/shamoon) ([#7650](https://github.com/paperless-ngx/paperless-ngx/pull/7650)) -- Enhancement: re-work mail rule dialog, support multiple include patterns [@shamoon](https://github.com/shamoon) ([#7635](https://github.com/paperless-ngx/paperless-ngx/pull/7635)) -- Fix: correct broken pdfjs worker src after upgrade to pdfjs v4 [@shamoon](https://github.com/shamoon) ([#7626](https://github.com/paperless-ngx/paperless-ngx/pull/7626)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7608](https://github.com/paperless-ngx/paperless-ngx/pull/7608)) -- Chore(deps): Bump rapidfuzz from 3.9.6 to 3.9.7 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7611](https://github.com/paperless-ngx/paperless-ngx/pull/7611)) -- Chore: remove unused frontend dependencies [@shamoon](https://github.com/shamoon) ([#7607](https://github.com/paperless-ngx/paperless-ngx/pull/7607)) -- Chore(deps): Bump tslib from 2.6.3 to 2.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7606](https://github.com/paperless-ngx/paperless-ngx/pull/7606)) -- Chore(deps-dev): Bump [@playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot) ([#7603](https://github.com/paperless-ngx/paperless-ngx/pull/7603)) -- Chore(deps-dev): Bump typescript from 5.4.5 to 5.5.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7604](https://github.com/paperless-ngx/paperless-ngx/pull/7604)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7600](https://github.com/paperless-ngx/paperless-ngx/pull/7600)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7599](https://github.com/paperless-ngx/paperless-ngx/pull/7599)) -- Fix: fix non-clickable scroll wheel in file uploads list [@shamoon](https://github.com/shamoon) ([#7591](https://github.com/paperless-ngx/paperless-ngx/pull/7591)) -- Fix: deselect file tasks select all button on dismiss [@shamoon](https://github.com/shamoon) ([#7592](https://github.com/paperless-ngx/paperless-ngx/pull/7592)) -- Fix: saved view sidebar heading not always visible [@shamoon](https://github.com/shamoon) ([#7584](https://github.com/paperless-ngx/paperless-ngx/pull/7584)) -- Enhancement: add Korean language [@shamoon](https://github.com/shamoon) ([#7573](https://github.com/paperless-ngx/paperless-ngx/pull/7573)) -- Enhancement: mail message preprocessor for gpg encrypted mails [@dbankmann](https://github.com/dbankmann) ([#7456](https://github.com/paperless-ngx/paperless-ngx/pull/7456)) -- Fix: correct select field wrapping with long text [@shamoon](https://github.com/shamoon) ([#7572](https://github.com/paperless-ngx/paperless-ngx/pull/7572)) -- Fix: update ng-bootstrap to fix datepicker bug [@shamoon](https://github.com/shamoon) ([#7567](https://github.com/paperless-ngx/paperless-ngx/pull/7567)) -- Enhancement: allow multiple filename attachment exclusion patterns for a mail rule [@MelleD](https://github.com/MelleD) ([#5524](https://github.com/paperless-ngx/paperless-ngx/pull/5524)) -- Chore(deps): Bump pathvalidate from 3.2.0 to 3.2.1 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7548](https://github.com/paperless-ngx/paperless-ngx/pull/7548)) -- Chore(deps): Bump micromatch from 4.0.5 to 4.0.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7551](https://github.com/paperless-ngx/paperless-ngx/pull/7551)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7545](https://github.com/paperless-ngx/paperless-ngx/pull/7545)) -- Refactor: Use django-filter logic for filtering full text search queries [@yichi-yang](https://github.com/yichi-yang) ([#7507](https://github.com/paperless-ngx/paperless-ngx/pull/7507)) -- Refactor: Reduce number of SQL queries when serializing List[Document] [@yichi-yang](https://github.com/yichi-yang) ([#7505](https://github.com/paperless-ngx/paperless-ngx/pull/7505)) +- Chore: Update backend dependencies in bulk [@stumpylog](https://github.com/stumpylog) ([#7656](https://github.com/paperless-ngx/paperless-ngx/pull/7656)) +- Fix: Rework system check so it won't crash if tesseract is not found [@stumpylog](https://github.com/stumpylog) ([#7640](https://github.com/paperless-ngx/paperless-ngx/pull/7640)) +- Refactor: performance and storage optimization of barcode scanning [@loewexy](https://github.com/loewexy) ([#7646](https://github.com/paperless-ngx/paperless-ngx/pull/7646)) +- Fix: use JSON for note audit log entries [@shamoon](https://github.com/shamoon) ([#7650](https://github.com/paperless-ngx/paperless-ngx/pull/7650)) +- Enhancement: re-work mail rule dialog, support multiple include patterns [@shamoon](https://github.com/shamoon) ([#7635](https://github.com/paperless-ngx/paperless-ngx/pull/7635)) +- Fix: correct broken pdfjs worker src after upgrade to pdfjs v4 [@shamoon](https://github.com/shamoon) ([#7626](https://github.com/paperless-ngx/paperless-ngx/pull/7626)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7608](https://github.com/paperless-ngx/paperless-ngx/pull/7608)) +- Chore(deps): Bump rapidfuzz from 3.9.6 to 3.9.7 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7611](https://github.com/paperless-ngx/paperless-ngx/pull/7611)) +- Chore: remove unused frontend dependencies [@shamoon](https://github.com/shamoon) ([#7607](https://github.com/paperless-ngx/paperless-ngx/pull/7607)) +- Chore(deps): Bump tslib from 2.6.3 to 2.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7606](https://github.com/paperless-ngx/paperless-ngx/pull/7606)) +- Chore(deps-dev): Bump [@playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.45.3 to 1.46.1 in /src-ui @dependabot) ([#7603](https://github.com/paperless-ngx/paperless-ngx/pull/7603)) +- Chore(deps-dev): Bump typescript from 5.4.5 to 5.5.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7604](https://github.com/paperless-ngx/paperless-ngx/pull/7604)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7600](https://github.com/paperless-ngx/paperless-ngx/pull/7600)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 21 updates [@dependabot](https://github.com/dependabot) ([#7599](https://github.com/paperless-ngx/paperless-ngx/pull/7599)) +- Fix: fix non-clickable scroll wheel in file uploads list [@shamoon](https://github.com/shamoon) ([#7591](https://github.com/paperless-ngx/paperless-ngx/pull/7591)) +- Fix: deselect file tasks select all button on dismiss [@shamoon](https://github.com/shamoon) ([#7592](https://github.com/paperless-ngx/paperless-ngx/pull/7592)) +- Fix: saved view sidebar heading not always visible [@shamoon](https://github.com/shamoon) ([#7584](https://github.com/paperless-ngx/paperless-ngx/pull/7584)) +- Enhancement: add Korean language [@shamoon](https://github.com/shamoon) ([#7573](https://github.com/paperless-ngx/paperless-ngx/pull/7573)) +- Enhancement: mail message preprocessor for gpg encrypted mails [@dbankmann](https://github.com/dbankmann) ([#7456](https://github.com/paperless-ngx/paperless-ngx/pull/7456)) +- Fix: correct select field wrapping with long text [@shamoon](https://github.com/shamoon) ([#7572](https://github.com/paperless-ngx/paperless-ngx/pull/7572)) +- Fix: update ng-bootstrap to fix datepicker bug [@shamoon](https://github.com/shamoon) ([#7567](https://github.com/paperless-ngx/paperless-ngx/pull/7567)) +- Enhancement: allow multiple filename attachment exclusion patterns for a mail rule [@MelleD](https://github.com/MelleD) ([#5524](https://github.com/paperless-ngx/paperless-ngx/pull/5524)) +- Chore(deps): Bump pathvalidate from 3.2.0 to 3.2.1 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7548](https://github.com/paperless-ngx/paperless-ngx/pull/7548)) +- Chore(deps): Bump micromatch from 4.0.5 to 4.0.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7551](https://github.com/paperless-ngx/paperless-ngx/pull/7551)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7545](https://github.com/paperless-ngx/paperless-ngx/pull/7545)) +- Refactor: Use django-filter logic for filtering full text search queries [@yichi-yang](https://github.com/yichi-yang) ([#7507](https://github.com/paperless-ngx/paperless-ngx/pull/7507)) +- Refactor: Reduce number of SQL queries when serializing List[Document] [@yichi-yang](https://github.com/yichi-yang) ([#7505](https://github.com/paperless-ngx/paperless-ngx/pull/7505))
## paperless-ngx 2.11.6 ### Bug Fixes -- Fix: fix nltk tokenizer breaking change [@shamoon](https://github.com/shamoon) ([#7522](https://github.com/paperless-ngx/paperless-ngx/pull/7522)) +- Fix: fix nltk tokenizer breaking change [@shamoon](https://github.com/shamoon) ([#7522](https://github.com/paperless-ngx/paperless-ngx/pull/7522)) ### All App Changes
1 change -- Fix: fix nltk tokenizer breaking change [@shamoon](https://github.com/shamoon) ([#7522](https://github.com/paperless-ngx/paperless-ngx/pull/7522)) +- Fix: fix nltk tokenizer breaking change [@shamoon](https://github.com/shamoon) ([#7522](https://github.com/paperless-ngx/paperless-ngx/pull/7522))
## paperless-ngx 2.11.5 ### Bug Fixes -- Fix: use JSON for update archive file auditlog entries [@shamoon](https://github.com/shamoon) ([#7503](https://github.com/paperless-ngx/paperless-ngx/pull/7503)) -- Fix: respect deskew / rotate pages from AppConfig if set [@shamoon](https://github.com/shamoon) ([#7501](https://github.com/paperless-ngx/paperless-ngx/pull/7501)) +- Fix: use JSON for update archive file auditlog entries [@shamoon](https://github.com/shamoon) ([#7503](https://github.com/paperless-ngx/paperless-ngx/pull/7503)) +- Fix: respect deskew / rotate pages from AppConfig if set [@shamoon](https://github.com/shamoon) ([#7501](https://github.com/paperless-ngx/paperless-ngx/pull/7501)) ### Dependencies
5 changes -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates [@dependabot](https://github.com/dependabot) ([#7502](https://github.com/paperless-ngx/paperless-ngx/pull/7502)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7497](https://github.com/paperless-ngx/paperless-ngx/pull/7497)) -- Chore(deps-dev): Bump axios from 1.6.7 to 1.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7472](https://github.com/paperless-ngx/paperless-ngx/pull/7472)) -- Chore(deps-dev): Bump ruff from 0.5.6 to 0.5.7 in the development group [@dependabot](https://github.com/dependabot) ([#7457](https://github.com/paperless-ngx/paperless-ngx/pull/7457)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#7460](https://github.com/paperless-ngx/paperless-ngx/pull/7460)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates [@dependabot](https://github.com/dependabot) ([#7502](https://github.com/paperless-ngx/paperless-ngx/pull/7502)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7497](https://github.com/paperless-ngx/paperless-ngx/pull/7497)) +- Chore(deps-dev): Bump axios from 1.6.7 to 1.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7472](https://github.com/paperless-ngx/paperless-ngx/pull/7472)) +- Chore(deps-dev): Bump ruff from 0.5.6 to 0.5.7 in the development group [@dependabot](https://github.com/dependabot) ([#7457](https://github.com/paperless-ngx/paperless-ngx/pull/7457)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#7460](https://github.com/paperless-ngx/paperless-ngx/pull/7460))
### All App Changes @@ -1792,59 +2186,59 @@
7 changes -- Fix: use JSON for update archive file auditlog entries [@shamoon](https://github.com/shamoon) ([#7503](https://github.com/paperless-ngx/paperless-ngx/pull/7503)) -- Chore(deps): Bump the small-changes group across 1 directory with 6 updates [@dependabot](https://github.com/dependabot) ([#7502](https://github.com/paperless-ngx/paperless-ngx/pull/7502)) -- Fix: respect deskew / rotate pages from AppConfig if set [@shamoon](https://github.com/shamoon) ([#7501](https://github.com/paperless-ngx/paperless-ngx/pull/7501)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7497](https://github.com/paperless-ngx/paperless-ngx/pull/7497)) -- Chore(deps-dev): Bump axios from 1.6.7 to 1.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7472](https://github.com/paperless-ngx/paperless-ngx/pull/7472)) -- Chore(deps-dev): Bump ruff from 0.5.6 to 0.5.7 in the development group [@dependabot](https://github.com/dependabot) ([#7457](https://github.com/paperless-ngx/paperless-ngx/pull/7457)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#7460](https://github.com/paperless-ngx/paperless-ngx/pull/7460)) +- Fix: use JSON for update archive file auditlog entries [@shamoon](https://github.com/shamoon) ([#7503](https://github.com/paperless-ngx/paperless-ngx/pull/7503)) +- Chore(deps): Bump the small-changes group across 1 directory with 6 updates [@dependabot](https://github.com/dependabot) ([#7502](https://github.com/paperless-ngx/paperless-ngx/pull/7502)) +- Fix: respect deskew / rotate pages from AppConfig if set [@shamoon](https://github.com/shamoon) ([#7501](https://github.com/paperless-ngx/paperless-ngx/pull/7501)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7497](https://github.com/paperless-ngx/paperless-ngx/pull/7497)) +- Chore(deps-dev): Bump axios from 1.6.7 to 1.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#7472](https://github.com/paperless-ngx/paperless-ngx/pull/7472)) +- Chore(deps-dev): Bump ruff from 0.5.6 to 0.5.7 in the development group [@dependabot](https://github.com/dependabot) ([#7457](https://github.com/paperless-ngx/paperless-ngx/pull/7457)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#7460](https://github.com/paperless-ngx/paperless-ngx/pull/7460))
## paperless-ngx 2.11.4 ### Bug Fixes -- Fix: initial upload message not being dismissed [@shamoon](https://github.com/shamoon) ([#7438](https://github.com/paperless-ngx/paperless-ngx/pull/7438)) +- Fix: initial upload message not being dismissed [@shamoon](https://github.com/shamoon) ([#7438](https://github.com/paperless-ngx/paperless-ngx/pull/7438)) ### All App Changes -- Fix: initial upload message not being dismissed [@shamoon](https://github.com/shamoon) ([#7438](https://github.com/paperless-ngx/paperless-ngx/pull/7438)) +- Fix: initial upload message not being dismissed [@shamoon](https://github.com/shamoon) ([#7438](https://github.com/paperless-ngx/paperless-ngx/pull/7438)) ## paperless-ngx 2.11.3 ### Features -- Enhancement: optimize tasks / stats reload [@shamoon](https://github.com/shamoon) ([#7402](https://github.com/paperless-ngx/paperless-ngx/pull/7402)) -- Enhancement: allow specifying default currency for Monetary custom field [@shamoon](https://github.com/shamoon) ([#7381](https://github.com/paperless-ngx/paperless-ngx/pull/7381)) -- Enhancement: specify when pre-check fails for documents in trash [@shamoon](https://github.com/shamoon) ([#7355](https://github.com/paperless-ngx/paperless-ngx/pull/7355)) +- Enhancement: optimize tasks / stats reload [@shamoon](https://github.com/shamoon) ([#7402](https://github.com/paperless-ngx/paperless-ngx/pull/7402)) +- Enhancement: allow specifying default currency for Monetary custom field [@shamoon](https://github.com/shamoon) ([#7381](https://github.com/paperless-ngx/paperless-ngx/pull/7381)) +- Enhancement: specify when pre-check fails for documents in trash [@shamoon](https://github.com/shamoon) ([#7355](https://github.com/paperless-ngx/paperless-ngx/pull/7355)) ### Bug Fixes -- Fix: clear selection after reload for management lists [@shamoon](https://github.com/shamoon) ([#7421](https://github.com/paperless-ngx/paperless-ngx/pull/7421)) -- Fix: disable inline create buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#7401](https://github.com/paperless-ngx/paperless-ngx/pull/7401)) -- Fix: use entire document for dropzone [@shamoon](https://github.com/shamoon) ([#7342](https://github.com/paperless-ngx/paperless-ngx/pull/7342)) +- Fix: clear selection after reload for management lists [@shamoon](https://github.com/shamoon) ([#7421](https://github.com/paperless-ngx/paperless-ngx/pull/7421)) +- Fix: disable inline create buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#7401](https://github.com/paperless-ngx/paperless-ngx/pull/7401)) +- Fix: use entire document for dropzone [@shamoon](https://github.com/shamoon) ([#7342](https://github.com/paperless-ngx/paperless-ngx/pull/7342)) ### Maintenance -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.7.0 to 0.8.0 in the actions group [@dependabot](https://github.com/dependabot) ([#7371](https://github.com/paperless-ngx/paperless-ngx/pull/7371)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.7.0 to 0.8.0 in the actions group [@dependabot](https://github.com/dependabot) ([#7371](https://github.com/paperless-ngx/paperless-ngx/pull/7371)) ### Dependencies
11 changes -- Chore(deps): Bump django from 4.2.14 to 4.2.15 [@dependabot](https://github.com/dependabot) ([#7412](https://github.com/paperless-ngx/paperless-ngx/pull/7412)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7394](https://github.com/paperless-ngx/paperless-ngx/pull/7394)) -- Chore(deps): Bump the small-changes group with 5 updates [@dependabot](https://github.com/dependabot) ([#7397](https://github.com/paperless-ngx/paperless-ngx/pull/7397)) -- Chore(deps-dev): Bump [@playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot) ([#7367](https://github.com/paperless-ngx/paperless-ngx/pull/7367)) -- Chore(deps-dev): Bump [@types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot](https://github.com/types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot) ([#7366](https://github.com/paperless-ngx/paperless-ngx/pull/7366)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7365](https://github.com/paperless-ngx/paperless-ngx/pull/7365)) -- Chore(deps): Bump uuid from 9.0.1 to 10.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7370](https://github.com/paperless-ngx/paperless-ngx/pull/7370)) -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.7.0 to 0.8.0 in the actions group [@dependabot](https://github.com/dependabot) ([#7371](https://github.com/paperless-ngx/paperless-ngx/pull/7371)) -- Chore(deps): Bump zone.js from 0.14.4 to 0.14.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7368](https://github.com/paperless-ngx/paperless-ngx/pull/7368)) -- Chore(deps-dev): Bump jest-preset-angular from 14.1.1 to 14.2.2 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#7364](https://github.com/paperless-ngx/paperless-ngx/pull/7364)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates [@dependabot](https://github.com/dependabot) ([#7363](https://github.com/paperless-ngx/paperless-ngx/pull/7363)) +- Chore(deps): Bump django from 4.2.14 to 4.2.15 [@dependabot](https://github.com/dependabot) ([#7412](https://github.com/paperless-ngx/paperless-ngx/pull/7412)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7394](https://github.com/paperless-ngx/paperless-ngx/pull/7394)) +- Chore(deps): Bump the small-changes group with 5 updates [@dependabot](https://github.com/dependabot) ([#7397](https://github.com/paperless-ngx/paperless-ngx/pull/7397)) +- Chore(deps-dev): Bump [@playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot) ([#7367](https://github.com/paperless-ngx/paperless-ngx/pull/7367)) +- Chore(deps-dev): Bump [@types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot](https://github.com/types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot) ([#7366](https://github.com/paperless-ngx/paperless-ngx/pull/7366)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7365](https://github.com/paperless-ngx/paperless-ngx/pull/7365)) +- Chore(deps): Bump uuid from 9.0.1 to 10.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7370](https://github.com/paperless-ngx/paperless-ngx/pull/7370)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.7.0 to 0.8.0 in the actions group [@dependabot](https://github.com/dependabot) ([#7371](https://github.com/paperless-ngx/paperless-ngx/pull/7371)) +- Chore(deps): Bump zone.js from 0.14.4 to 0.14.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7368](https://github.com/paperless-ngx/paperless-ngx/pull/7368)) +- Chore(deps-dev): Bump jest-preset-angular from 14.1.1 to 14.2.2 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#7364](https://github.com/paperless-ngx/paperless-ngx/pull/7364)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates [@dependabot](https://github.com/dependabot) ([#7363](https://github.com/paperless-ngx/paperless-ngx/pull/7363))
### All App Changes @@ -1852,129 +2246,129 @@
15 changes -- Fix: clear selection after reload for management lists [@shamoon](https://github.com/shamoon) ([#7421](https://github.com/paperless-ngx/paperless-ngx/pull/7421)) -- Enhancement: optimize tasks / stats reload [@shamoon](https://github.com/shamoon) ([#7402](https://github.com/paperless-ngx/paperless-ngx/pull/7402)) -- Enhancement: allow specifying default currency for Monetary custom field [@shamoon](https://github.com/shamoon) ([#7381](https://github.com/paperless-ngx/paperless-ngx/pull/7381)) -- Enhancement: specify when pre-check fails for documents in trash [@shamoon](https://github.com/shamoon) ([#7355](https://github.com/paperless-ngx/paperless-ngx/pull/7355)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7394](https://github.com/paperless-ngx/paperless-ngx/pull/7394)) -- Fix: disable inline create buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#7401](https://github.com/paperless-ngx/paperless-ngx/pull/7401)) -- Chore(deps): Bump the small-changes group with 5 updates [@dependabot](https://github.com/dependabot) ([#7397](https://github.com/paperless-ngx/paperless-ngx/pull/7397)) -- Chore(deps-dev): Bump [@playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot) ([#7367](https://github.com/paperless-ngx/paperless-ngx/pull/7367)) -- Chore(deps-dev): Bump [@types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot](https://github.com/types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot) ([#7366](https://github.com/paperless-ngx/paperless-ngx/pull/7366)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7365](https://github.com/paperless-ngx/paperless-ngx/pull/7365)) -- Chore(deps): Bump uuid from 9.0.1 to 10.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7370](https://github.com/paperless-ngx/paperless-ngx/pull/7370)) -- Chore(deps): Bump zone.js from 0.14.4 to 0.14.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7368](https://github.com/paperless-ngx/paperless-ngx/pull/7368)) -- Chore(deps-dev): Bump jest-preset-angular from 14.1.1 to 14.2.2 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#7364](https://github.com/paperless-ngx/paperless-ngx/pull/7364)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates [@dependabot](https://github.com/dependabot) ([#7363](https://github.com/paperless-ngx/paperless-ngx/pull/7363)) -- Fix: use entire document for dropzone [@shamoon](https://github.com/shamoon) ([#7342](https://github.com/paperless-ngx/paperless-ngx/pull/7342)) +- Fix: clear selection after reload for management lists [@shamoon](https://github.com/shamoon) ([#7421](https://github.com/paperless-ngx/paperless-ngx/pull/7421)) +- Enhancement: optimize tasks / stats reload [@shamoon](https://github.com/shamoon) ([#7402](https://github.com/paperless-ngx/paperless-ngx/pull/7402)) +- Enhancement: allow specifying default currency for Monetary custom field [@shamoon](https://github.com/shamoon) ([#7381](https://github.com/paperless-ngx/paperless-ngx/pull/7381)) +- Enhancement: specify when pre-check fails for documents in trash [@shamoon](https://github.com/shamoon) ([#7355](https://github.com/paperless-ngx/paperless-ngx/pull/7355)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#7394](https://github.com/paperless-ngx/paperless-ngx/pull/7394)) +- Fix: disable inline create buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#7401](https://github.com/paperless-ngx/paperless-ngx/pull/7401)) +- Chore(deps): Bump the small-changes group with 5 updates [@dependabot](https://github.com/dependabot) ([#7397](https://github.com/paperless-ngx/paperless-ngx/pull/7397)) +- Chore(deps-dev): Bump [@playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.1 to 1.45.3 in /src-ui @dependabot) ([#7367](https://github.com/paperless-ngx/paperless-ngx/pull/7367)) +- Chore(deps-dev): Bump [@types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot](https://github.com/types/node from 20.12.2 to 22.0.2 in /src-ui @dependabot) ([#7366](https://github.com/paperless-ngx/paperless-ngx/pull/7366)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#7365](https://github.com/paperless-ngx/paperless-ngx/pull/7365)) +- Chore(deps): Bump uuid from 9.0.1 to 10.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#7370](https://github.com/paperless-ngx/paperless-ngx/pull/7370)) +- Chore(deps): Bump zone.js from 0.14.4 to 0.14.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#7368](https://github.com/paperless-ngx/paperless-ngx/pull/7368)) +- Chore(deps-dev): Bump jest-preset-angular from 14.1.1 to 14.2.2 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#7364](https://github.com/paperless-ngx/paperless-ngx/pull/7364)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 20 updates [@dependabot](https://github.com/dependabot) ([#7363](https://github.com/paperless-ngx/paperless-ngx/pull/7363)) +- Fix: use entire document for dropzone [@shamoon](https://github.com/shamoon) ([#7342](https://github.com/paperless-ngx/paperless-ngx/pull/7342))
## paperless-ngx 2.11.2 ### Changes -- Change: more clearly handle init permissions error [@shamoon](https://github.com/shamoon) ([#7334](https://github.com/paperless-ngx/paperless-ngx/pull/7334)) -- Chore: add permissions info link from webUI [@shamoon](https://github.com/shamoon) ([#7310](https://github.com/paperless-ngx/paperless-ngx/pull/7310)) -- Fix: increase search input text contrast with light custom theme colors [@JayBkr](https://github.com/JayBkr) ([#7303](https://github.com/paperless-ngx/paperless-ngx/pull/7303)) +- Change: more clearly handle init permissions error [@shamoon](https://github.com/shamoon) ([#7334](https://github.com/paperless-ngx/paperless-ngx/pull/7334)) +- Chore: add permissions info link from webUI [@shamoon](https://github.com/shamoon) ([#7310](https://github.com/paperless-ngx/paperless-ngx/pull/7310)) +- Fix: increase search input text contrast with light custom theme colors [@JayBkr](https://github.com/JayBkr) ([#7303](https://github.com/paperless-ngx/paperless-ngx/pull/7303)) ### Dependencies -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7296](https://github.com/paperless-ngx/paperless-ngx/pull/7296)) -- Chore(deps): Bump tika-client from 0.5.0 to 0.6.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7297](https://github.com/paperless-ngx/paperless-ngx/pull/7297)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7296](https://github.com/paperless-ngx/paperless-ngx/pull/7296)) +- Chore(deps): Bump tika-client from 0.5.0 to 0.6.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7297](https://github.com/paperless-ngx/paperless-ngx/pull/7297)) ### All App Changes
5 changes -- Change: more clearly handle init permissions error [@shamoon](https://github.com/shamoon) ([#7334](https://github.com/paperless-ngx/paperless-ngx/pull/7334)) -- Chore: add permissions info link from webUI [@shamoon](https://github.com/shamoon) ([#7310](https://github.com/paperless-ngx/paperless-ngx/pull/7310)) -- Fix: increase search input text contrast with light custom theme colors [@JayBkr](https://github.com/JayBkr) ([#7303](https://github.com/paperless-ngx/paperless-ngx/pull/7303)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7296](https://github.com/paperless-ngx/paperless-ngx/pull/7296)) -- Chore(deps): Bump tika-client from 0.5.0 to 0.6.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7297](https://github.com/paperless-ngx/paperless-ngx/pull/7297)) +- Change: more clearly handle init permissions error [@shamoon](https://github.com/shamoon) ([#7334](https://github.com/paperless-ngx/paperless-ngx/pull/7334)) +- Chore: add permissions info link from webUI [@shamoon](https://github.com/shamoon) ([#7310](https://github.com/paperless-ngx/paperless-ngx/pull/7310)) +- Fix: increase search input text contrast with light custom theme colors [@JayBkr](https://github.com/JayBkr) ([#7303](https://github.com/paperless-ngx/paperless-ngx/pull/7303)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7296](https://github.com/paperless-ngx/paperless-ngx/pull/7296)) +- Chore(deps): Bump tika-client from 0.5.0 to 0.6.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#7297](https://github.com/paperless-ngx/paperless-ngx/pull/7297))
## paperless-ngx 2.11.1 ### Features -- Enhancement: include owner username in post-consumption variables [@Freddy-0](https://github.com/Freddy-0) ([#7270](https://github.com/paperless-ngx/paperless-ngx/pull/7270)) +- Enhancement: include owner username in post-consumption variables [@Freddy-0](https://github.com/Freddy-0) ([#7270](https://github.com/paperless-ngx/paperless-ngx/pull/7270)) ### Bug Fixes -- Fix: support multiple inbox tags from stats widget [@shamoon](https://github.com/shamoon) ([#7281](https://github.com/paperless-ngx/paperless-ngx/pull/7281)) -- Fix: Removes Turkish from the NLTK languages [@stumpylog](https://github.com/stumpylog) ([#7246](https://github.com/paperless-ngx/paperless-ngx/pull/7246)) -- Fix: include trashed docs in existing doc check [@shamoon](https://github.com/shamoon) ([#7229](https://github.com/paperless-ngx/paperless-ngx/pull/7229)) +- Fix: support multiple inbox tags from stats widget [@shamoon](https://github.com/shamoon) ([#7281](https://github.com/paperless-ngx/paperless-ngx/pull/7281)) +- Fix: Removes Turkish from the NLTK languages [@stumpylog](https://github.com/stumpylog) ([#7246](https://github.com/paperless-ngx/paperless-ngx/pull/7246)) +- Fix: include trashed docs in existing doc check [@shamoon](https://github.com/shamoon) ([#7229](https://github.com/paperless-ngx/paperless-ngx/pull/7229)) ### Dependencies -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7261](https://github.com/paperless-ngx/paperless-ngx/pull/7261)) -- Chore(deps): Bump the small-changes group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#7266](https://github.com/paperless-ngx/paperless-ngx/pull/7266)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7261](https://github.com/paperless-ngx/paperless-ngx/pull/7261)) +- Chore(deps): Bump the small-changes group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#7266](https://github.com/paperless-ngx/paperless-ngx/pull/7266)) ### All App Changes
7 changes -- Fix: support multiple inbox tags from stats widget [@shamoon](https://github.com/shamoon) ([#7281](https://github.com/paperless-ngx/paperless-ngx/pull/7281)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7261](https://github.com/paperless-ngx/paperless-ngx/pull/7261)) -- Chore(deps): Bump the small-changes group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#7266](https://github.com/paperless-ngx/paperless-ngx/pull/7266)) -- Enhancement: include owner username in post-consumption variables [@Freddy-0](https://github.com/Freddy-0) ([#7270](https://github.com/paperless-ngx/paperless-ngx/pull/7270)) -- Chore: Squash older automatic migrations [@stumpylog](https://github.com/stumpylog) ([#7267](https://github.com/paperless-ngx/paperless-ngx/pull/7267)) -- Fix: Removes Turkish from the NLTK languages [@stumpylog](https://github.com/stumpylog) ([#7246](https://github.com/paperless-ngx/paperless-ngx/pull/7246)) -- Fix: include trashed docs in existing doc check [@shamoon](https://github.com/shamoon) ([#7229](https://github.com/paperless-ngx/paperless-ngx/pull/7229)) +- Fix: support multiple inbox tags from stats widget [@shamoon](https://github.com/shamoon) ([#7281](https://github.com/paperless-ngx/paperless-ngx/pull/7281)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7261](https://github.com/paperless-ngx/paperless-ngx/pull/7261)) +- Chore(deps): Bump the small-changes group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#7266](https://github.com/paperless-ngx/paperless-ngx/pull/7266)) +- Enhancement: include owner username in post-consumption variables [@Freddy-0](https://github.com/Freddy-0) ([#7270](https://github.com/paperless-ngx/paperless-ngx/pull/7270)) +- Chore: Squash older automatic migrations [@stumpylog](https://github.com/stumpylog) ([#7267](https://github.com/paperless-ngx/paperless-ngx/pull/7267)) +- Fix: Removes Turkish from the NLTK languages [@stumpylog](https://github.com/stumpylog) ([#7246](https://github.com/paperless-ngx/paperless-ngx/pull/7246)) +- Fix: include trashed docs in existing doc check [@shamoon](https://github.com/shamoon) ([#7229](https://github.com/paperless-ngx/paperless-ngx/pull/7229))
## paperless-ngx 2.11.0 ### Breaking Changes -- Feature: Upgrade Gotenberg to v8 [@stumpylog](https://github.com/stumpylog) ([#7094](https://github.com/paperless-ngx/paperless-ngx/pull/7094)) +- Feature: Upgrade Gotenberg to v8 [@stumpylog](https://github.com/stumpylog) ([#7094](https://github.com/paperless-ngx/paperless-ngx/pull/7094)) ### Features -- Enhancement: disable add split button when appropriate [@shamoon](https://github.com/shamoon) ([#7215](https://github.com/paperless-ngx/paperless-ngx/pull/7215)) -- Enhancement: wrapping of saved view fields d-n-d UI [@shamoon](https://github.com/shamoon) ([#7216](https://github.com/paperless-ngx/paperless-ngx/pull/7216)) -- Enhancement: support custom field icontains filter for select type [@shamoon](https://github.com/shamoon) ([#7199](https://github.com/paperless-ngx/paperless-ngx/pull/7199)) -- Feature: select custom field type [@shamoon](https://github.com/shamoon) ([#7167](https://github.com/paperless-ngx/paperless-ngx/pull/7167)) -- Feature: automatic sso redirect [@shamoon](https://github.com/shamoon) ([#7168](https://github.com/paperless-ngx/paperless-ngx/pull/7168)) -- Enhancement: show more columns in mail frontend admin [@shamoon](https://github.com/shamoon) ([#7158](https://github.com/paperless-ngx/paperless-ngx/pull/7158)) -- Enhancement: use request user as owner of split / merge docs [@shamoon](https://github.com/shamoon) ([#7112](https://github.com/paperless-ngx/paperless-ngx/pull/7112)) -- Enhancement: improve date parsing with accented characters [@fdubuy](https://github.com/fdubuy) ([#7100](https://github.com/paperless-ngx/paperless-ngx/pull/7100)) -- Feature: improve history display of object names etc [@shamoon](https://github.com/shamoon) ([#7102](https://github.com/paperless-ngx/paperless-ngx/pull/7102)) -- Feature: Upgrade Gotenberg to v8 [@stumpylog](https://github.com/stumpylog) ([#7094](https://github.com/paperless-ngx/paperless-ngx/pull/7094)) +- Enhancement: disable add split button when appropriate [@shamoon](https://github.com/shamoon) ([#7215](https://github.com/paperless-ngx/paperless-ngx/pull/7215)) +- Enhancement: wrapping of saved view fields d-n-d UI [@shamoon](https://github.com/shamoon) ([#7216](https://github.com/paperless-ngx/paperless-ngx/pull/7216)) +- Enhancement: support custom field icontains filter for select type [@shamoon](https://github.com/shamoon) ([#7199](https://github.com/paperless-ngx/paperless-ngx/pull/7199)) +- Feature: select custom field type [@shamoon](https://github.com/shamoon) ([#7167](https://github.com/paperless-ngx/paperless-ngx/pull/7167)) +- Feature: automatic sso redirect [@shamoon](https://github.com/shamoon) ([#7168](https://github.com/paperless-ngx/paperless-ngx/pull/7168)) +- Enhancement: show more columns in mail frontend admin [@shamoon](https://github.com/shamoon) ([#7158](https://github.com/paperless-ngx/paperless-ngx/pull/7158)) +- Enhancement: use request user as owner of split / merge docs [@shamoon](https://github.com/shamoon) ([#7112](https://github.com/paperless-ngx/paperless-ngx/pull/7112)) +- Enhancement: improve date parsing with accented characters [@fdubuy](https://github.com/fdubuy) ([#7100](https://github.com/paperless-ngx/paperless-ngx/pull/7100)) +- Feature: improve history display of object names etc [@shamoon](https://github.com/shamoon) ([#7102](https://github.com/paperless-ngx/paperless-ngx/pull/7102)) +- Feature: Upgrade Gotenberg to v8 [@stumpylog](https://github.com/stumpylog) ([#7094](https://github.com/paperless-ngx/paperless-ngx/pull/7094)) ### Bug Fixes -- Fix: include documents in trash for existing asn check [@shamoon](https://github.com/shamoon) ([#7189](https://github.com/paperless-ngx/paperless-ngx/pull/7189)) -- Fix: include documents in trash in sanity check [@shamoon](https://github.com/shamoon) ([#7133](https://github.com/paperless-ngx/paperless-ngx/pull/7133)) -- Fix: handle errors for trash actions and only show documents user can restore or delete [@shamoon](https://github.com/shamoon) ([#7119](https://github.com/paperless-ngx/paperless-ngx/pull/7119)) -- Fix: dont include documents in trash in counts [@shamoon](https://github.com/shamoon) ([#7111](https://github.com/paperless-ngx/paperless-ngx/pull/7111)) -- Fix: use temp dir for split / merge [@shamoon](https://github.com/shamoon) ([#7105](https://github.com/paperless-ngx/paperless-ngx/pull/7105)) +- Fix: include documents in trash for existing asn check [@shamoon](https://github.com/shamoon) ([#7189](https://github.com/paperless-ngx/paperless-ngx/pull/7189)) +- Fix: include documents in trash in sanity check [@shamoon](https://github.com/shamoon) ([#7133](https://github.com/paperless-ngx/paperless-ngx/pull/7133)) +- Fix: handle errors for trash actions and only show documents user can restore or delete [@shamoon](https://github.com/shamoon) ([#7119](https://github.com/paperless-ngx/paperless-ngx/pull/7119)) +- Fix: dont include documents in trash in counts [@shamoon](https://github.com/shamoon) ([#7111](https://github.com/paperless-ngx/paperless-ngx/pull/7111)) +- Fix: use temp dir for split / merge [@shamoon](https://github.com/shamoon) ([#7105](https://github.com/paperless-ngx/paperless-ngx/pull/7105)) ### Maintenance -- Chore: upgrade to DRF 3.15 [@shamoon](https://github.com/shamoon) ([#7134](https://github.com/paperless-ngx/paperless-ngx/pull/7134)) -- Chore(deps): Bump docker/build-push-action from 5 to 6 in the actions group [@dependabot](https://github.com/dependabot) ([#7125](https://github.com/paperless-ngx/paperless-ngx/pull/7125)) -- Chore: Ignores DRF 3.15.2 [@stumpylog](https://github.com/stumpylog) ([#7122](https://github.com/paperless-ngx/paperless-ngx/pull/7122)) -- Chore: show docker tag in UI for ci test builds [@shamoon](https://github.com/shamoon) ([#7083](https://github.com/paperless-ngx/paperless-ngx/pull/7083)) +- Chore: upgrade to DRF 3.15 [@shamoon](https://github.com/shamoon) ([#7134](https://github.com/paperless-ngx/paperless-ngx/pull/7134)) +- Chore(deps): Bump docker/build-push-action from 5 to 6 in the actions group [@dependabot](https://github.com/dependabot) ([#7125](https://github.com/paperless-ngx/paperless-ngx/pull/7125)) +- Chore: Ignores DRF 3.15.2 [@stumpylog](https://github.com/stumpylog) ([#7122](https://github.com/paperless-ngx/paperless-ngx/pull/7122)) +- Chore: show docker tag in UI for ci test builds [@shamoon](https://github.com/shamoon) ([#7083](https://github.com/paperless-ngx/paperless-ngx/pull/7083)) ### Dependencies
11 changes -- Chore: Bulk backend updates [@stumpylog](https://github.com/stumpylog) ([#7209](https://github.com/paperless-ngx/paperless-ngx/pull/7209)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#7200](https://github.com/paperless-ngx/paperless-ngx/pull/7200)) -- Chore(deps): Bump certifi from 2024.6.2 to 2024.7.4 [@dependabot](https://github.com/dependabot) ([#7166](https://github.com/paperless-ngx/paperless-ngx/pull/7166)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 6 updates [@dependabot](https://github.com/dependabot) ([#7148](https://github.com/paperless-ngx/paperless-ngx/pull/7148)) -- Chore(deps): Bump django-multiselectfield from 0.1.12 to 0.1.13 in the django group [@dependabot](https://github.com/dependabot) ([#7147](https://github.com/paperless-ngx/paperless-ngx/pull/7147)) -- Chore(deps): Bump docker/build-push-action from 5 to 6 in the actions group [@dependabot](https://github.com/dependabot) ([#7125](https://github.com/paperless-ngx/paperless-ngx/pull/7125)) -- Chore(deps): Bump the small-changes group across 1 directory with 4 updates [@dependabot](https://github.com/dependabot) ([#7128](https://github.com/paperless-ngx/paperless-ngx/pull/7128)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#7126](https://github.com/paperless-ngx/paperless-ngx/pull/7126)) -- Chore(deps-dev): Bump ruff from 0.4.9 to 0.5.0 in the development group across 1 directory [@dependabot](https://github.com/dependabot) ([#7120](https://github.com/paperless-ngx/paperless-ngx/pull/7120)) -- Chore(deps-dev): Bump ws from 8.17.0 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7114](https://github.com/paperless-ngx/paperless-ngx/pull/7114)) -- Chore: update to Angular v18 [@shamoon](https://github.com/shamoon) ([#7106](https://github.com/paperless-ngx/paperless-ngx/pull/7106)) +- Chore: Bulk backend updates [@stumpylog](https://github.com/stumpylog) ([#7209](https://github.com/paperless-ngx/paperless-ngx/pull/7209)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#7200](https://github.com/paperless-ngx/paperless-ngx/pull/7200)) +- Chore(deps): Bump certifi from 2024.6.2 to 2024.7.4 [@dependabot](https://github.com/dependabot) ([#7166](https://github.com/paperless-ngx/paperless-ngx/pull/7166)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 6 updates [@dependabot](https://github.com/dependabot) ([#7148](https://github.com/paperless-ngx/paperless-ngx/pull/7148)) +- Chore(deps): Bump django-multiselectfield from 0.1.12 to 0.1.13 in the django group [@dependabot](https://github.com/dependabot) ([#7147](https://github.com/paperless-ngx/paperless-ngx/pull/7147)) +- Chore(deps): Bump docker/build-push-action from 5 to 6 in the actions group [@dependabot](https://github.com/dependabot) ([#7125](https://github.com/paperless-ngx/paperless-ngx/pull/7125)) +- Chore(deps): Bump the small-changes group across 1 directory with 4 updates [@dependabot](https://github.com/dependabot) ([#7128](https://github.com/paperless-ngx/paperless-ngx/pull/7128)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#7126](https://github.com/paperless-ngx/paperless-ngx/pull/7126)) +- Chore(deps-dev): Bump ruff from 0.4.9 to 0.5.0 in the development group across 1 directory [@dependabot](https://github.com/dependabot) ([#7120](https://github.com/paperless-ngx/paperless-ngx/pull/7120)) +- Chore(deps-dev): Bump ws from 8.17.0 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7114](https://github.com/paperless-ngx/paperless-ngx/pull/7114)) +- Chore: update to Angular v18 [@shamoon](https://github.com/shamoon) ([#7106](https://github.com/paperless-ngx/paperless-ngx/pull/7106))
### All App Changes @@ -1982,102 +2376,102 @@
25 changes -- Enhancement: disable add split button when appropriate [@shamoon](https://github.com/shamoon) ([#7215](https://github.com/paperless-ngx/paperless-ngx/pull/7215)) -- Enhancement: wrapping of saved view fields d-n-d UI [@shamoon](https://github.com/shamoon) ([#7216](https://github.com/paperless-ngx/paperless-ngx/pull/7216)) -- Chore: Bulk backend updates [@stumpylog](https://github.com/stumpylog) ([#7209](https://github.com/paperless-ngx/paperless-ngx/pull/7209)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#7200](https://github.com/paperless-ngx/paperless-ngx/pull/7200)) -- Enhancement: support custom field icontains filter for select type [@shamoon](https://github.com/shamoon) ([#7199](https://github.com/paperless-ngx/paperless-ngx/pull/7199)) -- Chore: upgrade to DRF 3.15 [@shamoon](https://github.com/shamoon) ([#7134](https://github.com/paperless-ngx/paperless-ngx/pull/7134)) -- Feature: select custom field type [@shamoon](https://github.com/shamoon) ([#7167](https://github.com/paperless-ngx/paperless-ngx/pull/7167)) -- Feature: automatic sso redirect [@shamoon](https://github.com/shamoon) ([#7168](https://github.com/paperless-ngx/paperless-ngx/pull/7168)) -- Fix: include documents in trash for existing asn check [@shamoon](https://github.com/shamoon) ([#7189](https://github.com/paperless-ngx/paperless-ngx/pull/7189)) -- Chore: Initial conversion to pytest fixtures [@stumpylog](https://github.com/stumpylog) ([#7110](https://github.com/paperless-ngx/paperless-ngx/pull/7110)) -- Enhancement: show more columns in mail frontend admin [@shamoon](https://github.com/shamoon) ([#7158](https://github.com/paperless-ngx/paperless-ngx/pull/7158)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 6 updates [@dependabot](https://github.com/dependabot) ([#7148](https://github.com/paperless-ngx/paperless-ngx/pull/7148)) -- Chore(deps): Bump django-multiselectfield from 0.1.12 to 0.1.13 in the django group [@dependabot](https://github.com/dependabot) ([#7147](https://github.com/paperless-ngx/paperless-ngx/pull/7147)) -- Fix: include documents in trash in sanity check [@shamoon](https://github.com/shamoon) ([#7133](https://github.com/paperless-ngx/paperless-ngx/pull/7133)) -- Chore(deps): Bump the small-changes group across 1 directory with 4 updates [@dependabot](https://github.com/dependabot) ([#7128](https://github.com/paperless-ngx/paperless-ngx/pull/7128)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#7126](https://github.com/paperless-ngx/paperless-ngx/pull/7126)) -- Enhancement: use request user as owner of split / merge docs [@shamoon](https://github.com/shamoon) ([#7112](https://github.com/paperless-ngx/paperless-ngx/pull/7112)) -- Fix: handle errors for trash actions and only show documents user can restore or delete [@shamoon](https://github.com/shamoon) ([#7119](https://github.com/paperless-ngx/paperless-ngx/pull/7119)) -- Chore(deps-dev): Bump ruff from 0.4.9 to 0.5.0 in the development group across 1 directory [@dependabot](https://github.com/dependabot) ([#7120](https://github.com/paperless-ngx/paperless-ngx/pull/7120)) -- Chore(deps-dev): Bump ws from 8.17.0 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7114](https://github.com/paperless-ngx/paperless-ngx/pull/7114)) -- Chore: update to Angular v18 [@shamoon](https://github.com/shamoon) ([#7106](https://github.com/paperless-ngx/paperless-ngx/pull/7106)) -- Enhancement: improve date parsing with accented characters [@fdubuy](https://github.com/fdubuy) ([#7100](https://github.com/paperless-ngx/paperless-ngx/pull/7100)) -- Feature: improve history display of object names etc [@shamoon](https://github.com/shamoon) ([#7102](https://github.com/paperless-ngx/paperless-ngx/pull/7102)) -- Fix: dont include documents in trash in counts [@shamoon](https://github.com/shamoon) ([#7111](https://github.com/paperless-ngx/paperless-ngx/pull/7111)) -- Fix: use temp dir for split / merge [@shamoon](https://github.com/shamoon) ([#7105](https://github.com/paperless-ngx/paperless-ngx/pull/7105)) +- Enhancement: disable add split button when appropriate [@shamoon](https://github.com/shamoon) ([#7215](https://github.com/paperless-ngx/paperless-ngx/pull/7215)) +- Enhancement: wrapping of saved view fields d-n-d UI [@shamoon](https://github.com/shamoon) ([#7216](https://github.com/paperless-ngx/paperless-ngx/pull/7216)) +- Chore: Bulk backend updates [@stumpylog](https://github.com/stumpylog) ([#7209](https://github.com/paperless-ngx/paperless-ngx/pull/7209)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#7200](https://github.com/paperless-ngx/paperless-ngx/pull/7200)) +- Enhancement: support custom field icontains filter for select type [@shamoon](https://github.com/shamoon) ([#7199](https://github.com/paperless-ngx/paperless-ngx/pull/7199)) +- Chore: upgrade to DRF 3.15 [@shamoon](https://github.com/shamoon) ([#7134](https://github.com/paperless-ngx/paperless-ngx/pull/7134)) +- Feature: select custom field type [@shamoon](https://github.com/shamoon) ([#7167](https://github.com/paperless-ngx/paperless-ngx/pull/7167)) +- Feature: automatic sso redirect [@shamoon](https://github.com/shamoon) ([#7168](https://github.com/paperless-ngx/paperless-ngx/pull/7168)) +- Fix: include documents in trash for existing asn check [@shamoon](https://github.com/shamoon) ([#7189](https://github.com/paperless-ngx/paperless-ngx/pull/7189)) +- Chore: Initial conversion to pytest fixtures [@stumpylog](https://github.com/stumpylog) ([#7110](https://github.com/paperless-ngx/paperless-ngx/pull/7110)) +- Enhancement: show more columns in mail frontend admin [@shamoon](https://github.com/shamoon) ([#7158](https://github.com/paperless-ngx/paperless-ngx/pull/7158)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 6 updates [@dependabot](https://github.com/dependabot) ([#7148](https://github.com/paperless-ngx/paperless-ngx/pull/7148)) +- Chore(deps): Bump django-multiselectfield from 0.1.12 to 0.1.13 in the django group [@dependabot](https://github.com/dependabot) ([#7147](https://github.com/paperless-ngx/paperless-ngx/pull/7147)) +- Fix: include documents in trash in sanity check [@shamoon](https://github.com/shamoon) ([#7133](https://github.com/paperless-ngx/paperless-ngx/pull/7133)) +- Chore(deps): Bump the small-changes group across 1 directory with 4 updates [@dependabot](https://github.com/dependabot) ([#7128](https://github.com/paperless-ngx/paperless-ngx/pull/7128)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#7126](https://github.com/paperless-ngx/paperless-ngx/pull/7126)) +- Enhancement: use request user as owner of split / merge docs [@shamoon](https://github.com/shamoon) ([#7112](https://github.com/paperless-ngx/paperless-ngx/pull/7112)) +- Fix: handle errors for trash actions and only show documents user can restore or delete [@shamoon](https://github.com/shamoon) ([#7119](https://github.com/paperless-ngx/paperless-ngx/pull/7119)) +- Chore(deps-dev): Bump ruff from 0.4.9 to 0.5.0 in the development group across 1 directory [@dependabot](https://github.com/dependabot) ([#7120](https://github.com/paperless-ngx/paperless-ngx/pull/7120)) +- Chore(deps-dev): Bump ws from 8.17.0 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7114](https://github.com/paperless-ngx/paperless-ngx/pull/7114)) +- Chore: update to Angular v18 [@shamoon](https://github.com/shamoon) ([#7106](https://github.com/paperless-ngx/paperless-ngx/pull/7106)) +- Enhancement: improve date parsing with accented characters [@fdubuy](https://github.com/fdubuy) ([#7100](https://github.com/paperless-ngx/paperless-ngx/pull/7100)) +- Feature: improve history display of object names etc [@shamoon](https://github.com/shamoon) ([#7102](https://github.com/paperless-ngx/paperless-ngx/pull/7102)) +- Fix: dont include documents in trash in counts [@shamoon](https://github.com/shamoon) ([#7111](https://github.com/paperless-ngx/paperless-ngx/pull/7111)) +- Fix: use temp dir for split / merge [@shamoon](https://github.com/shamoon) ([#7105](https://github.com/paperless-ngx/paperless-ngx/pull/7105))
## paperless-ngx 2.10.2 ### Bug Fixes -- Fix: always update document modified property on bulk edit operations [@shamoon](https://github.com/shamoon) ([#7079](https://github.com/paperless-ngx/paperless-ngx/pull/7079)) -- Fix: correct frontend retrieval of trash delay setting [@shamoon](https://github.com/shamoon) ([#7067](https://github.com/paperless-ngx/paperless-ngx/pull/7067)) -- Fix: index fresh document data after update archive file [@shamoon](https://github.com/shamoon) ([#7057](https://github.com/paperless-ngx/paperless-ngx/pull/7057)) -- Fix: Safari browser PDF viewer not loading in 2.10.x [@shamoon](https://github.com/shamoon) ([#7056](https://github.com/paperless-ngx/paperless-ngx/pull/7056)) -- Fix: Prefer the exporter metadata JSON file over the version JSON file [@stumpylog](https://github.com/stumpylog) ([#7048](https://github.com/paperless-ngx/paperless-ngx/pull/7048)) +- Fix: always update document modified property on bulk edit operations [@shamoon](https://github.com/shamoon) ([#7079](https://github.com/paperless-ngx/paperless-ngx/pull/7079)) +- Fix: correct frontend retrieval of trash delay setting [@shamoon](https://github.com/shamoon) ([#7067](https://github.com/paperless-ngx/paperless-ngx/pull/7067)) +- Fix: index fresh document data after update archive file [@shamoon](https://github.com/shamoon) ([#7057](https://github.com/paperless-ngx/paperless-ngx/pull/7057)) +- Fix: Safari browser PDF viewer not loading in 2.10.x [@shamoon](https://github.com/shamoon) ([#7056](https://github.com/paperless-ngx/paperless-ngx/pull/7056)) +- Fix: Prefer the exporter metadata JSON file over the version JSON file [@stumpylog](https://github.com/stumpylog) ([#7048](https://github.com/paperless-ngx/paperless-ngx/pull/7048)) ### All App Changes
5 changes -- Fix: always update document modified property on bulk edit operations [@shamoon](https://github.com/shamoon) ([#7079](https://github.com/paperless-ngx/paperless-ngx/pull/7079)) -- Fix: correct frontend retrieval of trash delay setting [@shamoon](https://github.com/shamoon) ([#7067](https://github.com/paperless-ngx/paperless-ngx/pull/7067)) -- Fix: index fresh document data after update archive file [@shamoon](https://github.com/shamoon) ([#7057](https://github.com/paperless-ngx/paperless-ngx/pull/7057)) -- Fix: Safari browser PDF viewer not loading in 2.10.x [@shamoon](https://github.com/shamoon) ([#7056](https://github.com/paperless-ngx/paperless-ngx/pull/7056)) -- Fix: Prefer the exporter metadata JSON file over the version JSON file [@stumpylog](https://github.com/stumpylog) ([#7048](https://github.com/paperless-ngx/paperless-ngx/pull/7048)) +- Fix: always update document modified property on bulk edit operations [@shamoon](https://github.com/shamoon) ([#7079](https://github.com/paperless-ngx/paperless-ngx/pull/7079)) +- Fix: correct frontend retrieval of trash delay setting [@shamoon](https://github.com/shamoon) ([#7067](https://github.com/paperless-ngx/paperless-ngx/pull/7067)) +- Fix: index fresh document data after update archive file [@shamoon](https://github.com/shamoon) ([#7057](https://github.com/paperless-ngx/paperless-ngx/pull/7057)) +- Fix: Safari browser PDF viewer not loading in 2.10.x [@shamoon](https://github.com/shamoon) ([#7056](https://github.com/paperless-ngx/paperless-ngx/pull/7056)) +- Fix: Prefer the exporter metadata JSON file over the version JSON file [@stumpylog](https://github.com/stumpylog) ([#7048](https://github.com/paperless-ngx/paperless-ngx/pull/7048))
## paperless-ngx 2.10.1 ### Bug Fixes -- Fix: dont require admin perms to view trash on frontend @shamoon ([#7028](https://github.com/paperless-ngx/paperless-ngx/pull/7028)) +- Fix: dont require admin perms to view trash on frontend @shamoon ([#7028](https://github.com/paperless-ngx/paperless-ngx/pull/7028)) ## paperless-ngx 2.10.0 ### Features -- Feature: documents trash aka soft delete [@shamoon](https://github.com/shamoon) ([#6944](https://github.com/paperless-ngx/paperless-ngx/pull/6944)) -- Enhancement: better boolean custom field display [@shamoon](https://github.com/shamoon) ([#7001](https://github.com/paperless-ngx/paperless-ngx/pull/7001)) -- Feature: Allow encrypting sensitive fields in export [@stumpylog](https://github.com/stumpylog) ([#6927](https://github.com/paperless-ngx/paperless-ngx/pull/6927)) -- Enhancement: allow consumption of odg files [@daniel-boehme](https://github.com/daniel-boehme) ([#6940](https://github.com/paperless-ngx/paperless-ngx/pull/6940)) +- Feature: documents trash aka soft delete [@shamoon](https://github.com/shamoon) ([#6944](https://github.com/paperless-ngx/paperless-ngx/pull/6944)) +- Enhancement: better boolean custom field display [@shamoon](https://github.com/shamoon) ([#7001](https://github.com/paperless-ngx/paperless-ngx/pull/7001)) +- Feature: Allow encrypting sensitive fields in export [@stumpylog](https://github.com/stumpylog) ([#6927](https://github.com/paperless-ngx/paperless-ngx/pull/6927)) +- Enhancement: allow consumption of odg files [@daniel-boehme](https://github.com/daniel-boehme) ([#6940](https://github.com/paperless-ngx/paperless-ngx/pull/6940)) ### Bug Fixes -- Fix: Document history could include extra fields [@stumpylog](https://github.com/stumpylog) ([#6989](https://github.com/paperless-ngx/paperless-ngx/pull/6989)) -- Fix: use local pdf worker js [@shamoon](https://github.com/shamoon) ([#6990](https://github.com/paperless-ngx/paperless-ngx/pull/6990)) -- Fix: Revert masking the content field from auditlog [@tribut](https://github.com/tribut) ([#6981](https://github.com/paperless-ngx/paperless-ngx/pull/6981)) -- Fix: respect model permissions for tasks API endpoint [@shamoon](https://github.com/shamoon) ([#6958](https://github.com/paperless-ngx/paperless-ngx/pull/6958)) -- Fix: Make the logging of an email message to be something useful [@stumpylog](https://github.com/stumpylog) ([#6901](https://github.com/paperless-ngx/paperless-ngx/pull/6901)) +- Fix: Document history could include extra fields [@stumpylog](https://github.com/stumpylog) ([#6989](https://github.com/paperless-ngx/paperless-ngx/pull/6989)) +- Fix: use local pdf worker js [@shamoon](https://github.com/shamoon) ([#6990](https://github.com/paperless-ngx/paperless-ngx/pull/6990)) +- Fix: Revert masking the content field from auditlog [@tribut](https://github.com/tribut) ([#6981](https://github.com/paperless-ngx/paperless-ngx/pull/6981)) +- Fix: respect model permissions for tasks API endpoint [@shamoon](https://github.com/shamoon) ([#6958](https://github.com/paperless-ngx/paperless-ngx/pull/6958)) +- Fix: Make the logging of an email message to be something useful [@stumpylog](https://github.com/stumpylog) ([#6901](https://github.com/paperless-ngx/paperless-ngx/pull/6901)) ### Documentation -- Documentation: Corrections and clarifications for Python support [@stumpylog](https://github.com/stumpylog) ([#6995](https://github.com/paperless-ngx/paperless-ngx/pull/6995)) +- Documentation: Corrections and clarifications for Python support [@stumpylog](https://github.com/stumpylog) ([#6995](https://github.com/paperless-ngx/paperless-ngx/pull/6995)) ### Maintenance -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.6.0 to 0.7.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6968](https://github.com/paperless-ngx/paperless-ngx/pull/6968)) -- Chore: Configures dependabot to ignore djangorestframework [@stumpylog](https://github.com/stumpylog) ([#6967](https://github.com/paperless-ngx/paperless-ngx/pull/6967)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.6.0 to 0.7.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6968](https://github.com/paperless-ngx/paperless-ngx/pull/6968)) +- Chore: Configures dependabot to ignore djangorestframework [@stumpylog](https://github.com/stumpylog) ([#6967](https://github.com/paperless-ngx/paperless-ngx/pull/6967)) ### Dependencies
10 changes -- Chore(deps): Bump pipenv from 2023.12.1 to 2024.0.1 [@stumpylog](https://github.com/stumpylog) ([#7019](https://github.com/paperless-ngx/paperless-ngx/pull/7019)) -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#7013](https://github.com/paperless-ngx/paperless-ngx/pull/7013)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7012](https://github.com/paperless-ngx/paperless-ngx/pull/7012)) -- Chore(deps-dev): Bump ws from 8.15.1 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7015](https://github.com/paperless-ngx/paperless-ngx/pull/7015)) -- Chore(deps): Bump urllib3 from 2.2.1 to 2.2.2 [@dependabot](https://github.com/dependabot) ([#7014](https://github.com/paperless-ngx/paperless-ngx/pull/7014)) -- Chore: update packages used by mail parser html template [@shamoon](https://github.com/shamoon) ([#6970](https://github.com/paperless-ngx/paperless-ngx/pull/6970)) -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.6.0 to 0.7.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6968](https://github.com/paperless-ngx/paperless-ngx/pull/6968)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6953](https://github.com/paperless-ngx/paperless-ngx/pull/6953)) -- Chore: Updates to latest Trixie version of Ghostscript 10.03.1 [@stumpylog](https://github.com/stumpylog) ([#6956](https://github.com/paperless-ngx/paperless-ngx/pull/6956)) -- Chore(deps): Bump tornado from 6.4 to 6.4.1 [@dependabot](https://github.com/dependabot) ([#6930](https://github.com/paperless-ngx/paperless-ngx/pull/6930)) +- Chore(deps): Bump pipenv from 2023.12.1 to 2024.0.1 [@stumpylog](https://github.com/stumpylog) ([#7019](https://github.com/paperless-ngx/paperless-ngx/pull/7019)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#7013](https://github.com/paperless-ngx/paperless-ngx/pull/7013)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7012](https://github.com/paperless-ngx/paperless-ngx/pull/7012)) +- Chore(deps-dev): Bump ws from 8.15.1 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7015](https://github.com/paperless-ngx/paperless-ngx/pull/7015)) +- Chore(deps): Bump urllib3 from 2.2.1 to 2.2.2 [@dependabot](https://github.com/dependabot) ([#7014](https://github.com/paperless-ngx/paperless-ngx/pull/7014)) +- Chore: update packages used by mail parser html template [@shamoon](https://github.com/shamoon) ([#6970](https://github.com/paperless-ngx/paperless-ngx/pull/6970)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.6.0 to 0.7.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6968](https://github.com/paperless-ngx/paperless-ngx/pull/6968)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6953](https://github.com/paperless-ngx/paperless-ngx/pull/6953)) +- Chore: Updates to latest Trixie version of Ghostscript 10.03.1 [@stumpylog](https://github.com/stumpylog) ([#6956](https://github.com/paperless-ngx/paperless-ngx/pull/6956)) +- Chore(deps): Bump tornado from 6.4 to 6.4.1 [@dependabot](https://github.com/dependabot) ([#6930](https://github.com/paperless-ngx/paperless-ngx/pull/6930))
### All App Changes @@ -2085,66 +2479,66 @@
17 changes -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#7013](https://github.com/paperless-ngx/paperless-ngx/pull/7013)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7012](https://github.com/paperless-ngx/paperless-ngx/pull/7012)) -- Chore(deps-dev): Bump ws from 8.15.1 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7015](https://github.com/paperless-ngx/paperless-ngx/pull/7015)) -- Feature: documents trash aka soft delete [@shamoon](https://github.com/shamoon) ([#6944](https://github.com/paperless-ngx/paperless-ngx/pull/6944)) -- Enhancement: better boolean custom field display [@shamoon](https://github.com/shamoon) ([#7001](https://github.com/paperless-ngx/paperless-ngx/pull/7001)) -- Fix: default order of documents gets lost in QuerySet pipeline [@madduck](https://github.com/madduck) ([#6982](https://github.com/paperless-ngx/paperless-ngx/pull/6982)) -- Fix: Document history could include extra fields [@stumpylog](https://github.com/stumpylog) ([#6989](https://github.com/paperless-ngx/paperless-ngx/pull/6989)) -- Fix: use local pdf worker js [@shamoon](https://github.com/shamoon) ([#6990](https://github.com/paperless-ngx/paperless-ngx/pull/6990)) -- Fix: Revert masking the content field from auditlog [@tribut](https://github.com/tribut) ([#6981](https://github.com/paperless-ngx/paperless-ngx/pull/6981)) -- Chore: update packages used by mail parser html template [@shamoon](https://github.com/shamoon) ([#6970](https://github.com/paperless-ngx/paperless-ngx/pull/6970)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6953](https://github.com/paperless-ngx/paperless-ngx/pull/6953)) -- Fix: respect model permissions for tasks API endpoint [@shamoon](https://github.com/shamoon) ([#6958](https://github.com/paperless-ngx/paperless-ngx/pull/6958)) -- Feature: Allow encrypting sensitive fields in export [@stumpylog](https://github.com/stumpylog) ([#6927](https://github.com/paperless-ngx/paperless-ngx/pull/6927)) -- Enhancement: allow consumption of odg files [@daniel-boehme](https://github.com/daniel-boehme) ([#6940](https://github.com/paperless-ngx/paperless-ngx/pull/6940)) -- Enhancement: use note model permissions for notes [@shamoon](https://github.com/shamoon) ([#6913](https://github.com/paperless-ngx/paperless-ngx/pull/6913)) -- Chore: Resolves test issues with Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#6902](https://github.com/paperless-ngx/paperless-ngx/pull/6902)) -- Fix: Make the logging of an email message to be something useful [@stumpylog](https://github.com/stumpylog) ([#6901](https://github.com/paperless-ngx/paperless-ngx/pull/6901)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#7013](https://github.com/paperless-ngx/paperless-ngx/pull/7013)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#7012](https://github.com/paperless-ngx/paperless-ngx/pull/7012)) +- Chore(deps-dev): Bump ws from 8.15.1 to 8.17.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#7015](https://github.com/paperless-ngx/paperless-ngx/pull/7015)) +- Feature: documents trash aka soft delete [@shamoon](https://github.com/shamoon) ([#6944](https://github.com/paperless-ngx/paperless-ngx/pull/6944)) +- Enhancement: better boolean custom field display [@shamoon](https://github.com/shamoon) ([#7001](https://github.com/paperless-ngx/paperless-ngx/pull/7001)) +- Fix: default order of documents gets lost in QuerySet pipeline [@madduck](https://github.com/madduck) ([#6982](https://github.com/paperless-ngx/paperless-ngx/pull/6982)) +- Fix: Document history could include extra fields [@stumpylog](https://github.com/stumpylog) ([#6989](https://github.com/paperless-ngx/paperless-ngx/pull/6989)) +- Fix: use local pdf worker js [@shamoon](https://github.com/shamoon) ([#6990](https://github.com/paperless-ngx/paperless-ngx/pull/6990)) +- Fix: Revert masking the content field from auditlog [@tribut](https://github.com/tribut) ([#6981](https://github.com/paperless-ngx/paperless-ngx/pull/6981)) +- Chore: update packages used by mail parser html template [@shamoon](https://github.com/shamoon) ([#6970](https://github.com/paperless-ngx/paperless-ngx/pull/6970)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6953](https://github.com/paperless-ngx/paperless-ngx/pull/6953)) +- Fix: respect model permissions for tasks API endpoint [@shamoon](https://github.com/shamoon) ([#6958](https://github.com/paperless-ngx/paperless-ngx/pull/6958)) +- Feature: Allow encrypting sensitive fields in export [@stumpylog](https://github.com/stumpylog) ([#6927](https://github.com/paperless-ngx/paperless-ngx/pull/6927)) +- Enhancement: allow consumption of odg files [@daniel-boehme](https://github.com/daniel-boehme) ([#6940](https://github.com/paperless-ngx/paperless-ngx/pull/6940)) +- Enhancement: use note model permissions for notes [@shamoon](https://github.com/shamoon) ([#6913](https://github.com/paperless-ngx/paperless-ngx/pull/6913)) +- Chore: Resolves test issues with Python 3.12 [@stumpylog](https://github.com/stumpylog) ([#6902](https://github.com/paperless-ngx/paperless-ngx/pull/6902)) +- Fix: Make the logging of an email message to be something useful [@stumpylog](https://github.com/stumpylog) ([#6901](https://github.com/paperless-ngx/paperless-ngx/pull/6901))
## paperless-ngx 2.9.0 ### Features -- Feature: Allow a data only export/import cycle [@stumpylog](https://github.com/stumpylog) ([#6871](https://github.com/paperless-ngx/paperless-ngx/pull/6871)) -- Change: rename 'redo OCR' to 'reprocess' to clarify behavior [@shamoon](https://github.com/shamoon) ([#6866](https://github.com/paperless-ngx/paperless-ngx/pull/6866)) -- Enhancement: Support custom path for the classification file [@lino-b](https://github.com/lino-b) ([#6858](https://github.com/paperless-ngx/paperless-ngx/pull/6858)) -- Enhancement: default to title/content search, allow choosing full search link from global search [@shamoon](https://github.com/shamoon) ([#6805](https://github.com/paperless-ngx/paperless-ngx/pull/6805)) -- Enhancement: only include correspondent 'last_correspondence' if requested [@shamoon](https://github.com/shamoon) ([#6792](https://github.com/paperless-ngx/paperless-ngx/pull/6792)) -- Enhancement: delete pages PDF action [@shamoon](https://github.com/shamoon) ([#6772](https://github.com/paperless-ngx/paperless-ngx/pull/6772)) -- Enhancement: support custom logo / title on login page [@shamoon](https://github.com/shamoon) ([#6775](https://github.com/paperless-ngx/paperless-ngx/pull/6775)) +- Feature: Allow a data only export/import cycle [@stumpylog](https://github.com/stumpylog) ([#6871](https://github.com/paperless-ngx/paperless-ngx/pull/6871)) +- Change: rename 'redo OCR' to 'reprocess' to clarify behavior [@shamoon](https://github.com/shamoon) ([#6866](https://github.com/paperless-ngx/paperless-ngx/pull/6866)) +- Enhancement: Support custom path for the classification file [@lino-b](https://github.com/lino-b) ([#6858](https://github.com/paperless-ngx/paperless-ngx/pull/6858)) +- Enhancement: default to title/content search, allow choosing full search link from global search [@shamoon](https://github.com/shamoon) ([#6805](https://github.com/paperless-ngx/paperless-ngx/pull/6805)) +- Enhancement: only include correspondent 'last_correspondence' if requested [@shamoon](https://github.com/shamoon) ([#6792](https://github.com/paperless-ngx/paperless-ngx/pull/6792)) +- Enhancement: delete pages PDF action [@shamoon](https://github.com/shamoon) ([#6772](https://github.com/paperless-ngx/paperless-ngx/pull/6772)) +- Enhancement: support custom logo / title on login page [@shamoon](https://github.com/shamoon) ([#6775](https://github.com/paperless-ngx/paperless-ngx/pull/6775)) ### Bug Fixes -- Fix: including ordering param for id\_\_in retrievals [@shamoon](https://github.com/shamoon) ([#6875](https://github.com/paperless-ngx/paperless-ngx/pull/6875)) -- Fix: Don't allow the workflow save to override other process updates [@stumpylog](https://github.com/stumpylog) ([#6849](https://github.com/paperless-ngx/paperless-ngx/pull/6849)) -- Fix: consistently use created_date for doc display [@shamoon](https://github.com/shamoon) ([#6758](https://github.com/paperless-ngx/paperless-ngx/pull/6758)) +- Fix: including ordering param for id\_\_in retrievals [@shamoon](https://github.com/shamoon) ([#6875](https://github.com/paperless-ngx/paperless-ngx/pull/6875)) +- Fix: Don't allow the workflow save to override other process updates [@stumpylog](https://github.com/stumpylog) ([#6849](https://github.com/paperless-ngx/paperless-ngx/pull/6849)) +- Fix: consistently use created_date for doc display [@shamoon](https://github.com/shamoon) ([#6758](https://github.com/paperless-ngx/paperless-ngx/pull/6758)) ### Maintenance -- Chore: Change the code formatter to Ruff [@stumpylog](https://github.com/stumpylog) ([#6756](https://github.com/paperless-ngx/paperless-ngx/pull/6756)) -- Chore: Backend updates [@stumpylog](https://github.com/stumpylog) ([#6755](https://github.com/paperless-ngx/paperless-ngx/pull/6755)) -- Chore(deps): Bump crowdin/github-action from 1 to 2 in the actions group [@dependabot](https://github.com/dependabot) ([#6881](https://github.com/paperless-ngx/paperless-ngx/pull/6881)) +- Chore: Change the code formatter to Ruff [@stumpylog](https://github.com/stumpylog) ([#6756](https://github.com/paperless-ngx/paperless-ngx/pull/6756)) +- Chore: Backend updates [@stumpylog](https://github.com/stumpylog) ([#6755](https://github.com/paperless-ngx/paperless-ngx/pull/6755)) +- Chore(deps): Bump crowdin/github-action from 1 to 2 in the actions group [@dependabot](https://github.com/dependabot) ([#6881](https://github.com/paperless-ngx/paperless-ngx/pull/6881)) ### Dependencies
12 changes -- Chore(deps-dev): Bump jest-preset-angular from 14.0.4 to 14.1.0 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#6879](https://github.com/paperless-ngx/paperless-ngx/pull/6879)) -- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#6892](https://github.com/paperless-ngx/paperless-ngx/pull/6892)) -- Chore(deps): Bump crowdin/github-action from 1 to 2 in the actions group [@dependabot](https://github.com/dependabot) ([#6881](https://github.com/paperless-ngx/paperless-ngx/pull/6881)) -- Chore: Updates Ghostscript to 10.03.1 [@stumpylog](https://github.com/stumpylog) ([#6854](https://github.com/paperless-ngx/paperless-ngx/pull/6854)) -- Chore(deps-dev): Bump the development group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#6851](https://github.com/paperless-ngx/paperless-ngx/pull/6851)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6843](https://github.com/paperless-ngx/paperless-ngx/pull/6843)) -- Chore(deps): Use psycopg as recommended [@stumpylog](https://github.com/stumpylog) ([#6811](https://github.com/paperless-ngx/paperless-ngx/pull/6811)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6793](https://github.com/paperless-ngx/paperless-ngx/pull/6793)) -- Chore(deps): Bump requests from 2.31.0 to 2.32.0 [@dependabot](https://github.com/dependabot) ([#6795](https://github.com/paperless-ngx/paperless-ngx/pull/6795)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#6761](https://github.com/paperless-ngx/paperless-ngx/pull/6761)) -- Chore: Backend updates [@stumpylog](https://github.com/stumpylog) ([#6755](https://github.com/paperless-ngx/paperless-ngx/pull/6755)) -- Chore: revert pngx pdf viewer to third party package [@shamoon](https://github.com/shamoon) ([#6741](https://github.com/paperless-ngx/paperless-ngx/pull/6741)) +- Chore(deps-dev): Bump jest-preset-angular from 14.0.4 to 14.1.0 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#6879](https://github.com/paperless-ngx/paperless-ngx/pull/6879)) +- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#6892](https://github.com/paperless-ngx/paperless-ngx/pull/6892)) +- Chore(deps): Bump crowdin/github-action from 1 to 2 in the actions group [@dependabot](https://github.com/dependabot) ([#6881](https://github.com/paperless-ngx/paperless-ngx/pull/6881)) +- Chore: Updates Ghostscript to 10.03.1 [@stumpylog](https://github.com/stumpylog) ([#6854](https://github.com/paperless-ngx/paperless-ngx/pull/6854)) +- Chore(deps-dev): Bump the development group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#6851](https://github.com/paperless-ngx/paperless-ngx/pull/6851)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6843](https://github.com/paperless-ngx/paperless-ngx/pull/6843)) +- Chore(deps): Use psycopg as recommended [@stumpylog](https://github.com/stumpylog) ([#6811](https://github.com/paperless-ngx/paperless-ngx/pull/6811)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6793](https://github.com/paperless-ngx/paperless-ngx/pull/6793)) +- Chore(deps): Bump requests from 2.31.0 to 2.32.0 [@dependabot](https://github.com/dependabot) ([#6795](https://github.com/paperless-ngx/paperless-ngx/pull/6795)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#6761](https://github.com/paperless-ngx/paperless-ngx/pull/6761)) +- Chore: Backend updates [@stumpylog](https://github.com/stumpylog) ([#6755](https://github.com/paperless-ngx/paperless-ngx/pull/6755)) +- Chore: revert pngx pdf viewer to third party package [@shamoon](https://github.com/shamoon) ([#6741](https://github.com/paperless-ngx/paperless-ngx/pull/6741))
### All App Changes @@ -2152,225 +2546,225 @@
19 changes -- Chore(deps-dev): Bump jest-preset-angular from 14.0.4 to 14.1.0 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#6879](https://github.com/paperless-ngx/paperless-ngx/pull/6879)) -- Fix: including ordering param for id\_\_in retrievals [@shamoon](https://github.com/shamoon) ([#6875](https://github.com/paperless-ngx/paperless-ngx/pull/6875)) -- Feature: Allow a data only export/import cycle [@stumpylog](https://github.com/stumpylog) ([#6871](https://github.com/paperless-ngx/paperless-ngx/pull/6871)) -- Change: rename 'redo OCR' to 'reprocess' to clarify behavior [@shamoon](https://github.com/shamoon) ([#6866](https://github.com/paperless-ngx/paperless-ngx/pull/6866)) -- Enhancement: Support custom path for the classification file [@lino-b](https://github.com/lino-b) ([#6858](https://github.com/paperless-ngx/paperless-ngx/pull/6858)) -- Chore(deps-dev): Bump the development group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#6851](https://github.com/paperless-ngx/paperless-ngx/pull/6851)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6843](https://github.com/paperless-ngx/paperless-ngx/pull/6843)) -- Fix: Don't allow the workflow save to override other process updates [@stumpylog](https://github.com/stumpylog) ([#6849](https://github.com/paperless-ngx/paperless-ngx/pull/6849)) -- Chore(deps): Use psycopg as recommended [@stumpylog](https://github.com/stumpylog) ([#6811](https://github.com/paperless-ngx/paperless-ngx/pull/6811)) -- Enhancement: default to title/content search, allow choosing full search link from global search [@shamoon](https://github.com/shamoon) ([#6805](https://github.com/paperless-ngx/paperless-ngx/pull/6805)) -- Enhancement: only include correspondent 'last_correspondence' if requested [@shamoon](https://github.com/shamoon) ([#6792](https://github.com/paperless-ngx/paperless-ngx/pull/6792)) -- Enhancement: accessibility improvements for tags, doc links, dashboard views [@shamoon](https://github.com/shamoon) ([#6786](https://github.com/paperless-ngx/paperless-ngx/pull/6786)) -- Enhancement: delete pages PDF action [@shamoon](https://github.com/shamoon) ([#6772](https://github.com/paperless-ngx/paperless-ngx/pull/6772)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6793](https://github.com/paperless-ngx/paperless-ngx/pull/6793)) -- Enhancement: support custom logo / title on login page [@shamoon](https://github.com/shamoon) ([#6775](https://github.com/paperless-ngx/paperless-ngx/pull/6775)) -- Chore: Change the code formatter to Ruff [@stumpylog](https://github.com/stumpylog) ([#6756](https://github.com/paperless-ngx/paperless-ngx/pull/6756)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#6761](https://github.com/paperless-ngx/paperless-ngx/pull/6761)) -- Fix: consistently use created_date for doc display [@shamoon](https://github.com/shamoon) ([#6758](https://github.com/paperless-ngx/paperless-ngx/pull/6758)) -- Chore: revert pngx pdf viewer to third party package [@shamoon](https://github.com/shamoon) ([#6741](https://github.com/paperless-ngx/paperless-ngx/pull/6741)) +- Chore(deps-dev): Bump jest-preset-angular from 14.0.4 to 14.1.0 in /src-ui in the frontend-jest-dependencies group [@dependabot](https://github.com/dependabot) ([#6879](https://github.com/paperless-ngx/paperless-ngx/pull/6879)) +- Fix: including ordering param for id\_\_in retrievals [@shamoon](https://github.com/shamoon) ([#6875](https://github.com/paperless-ngx/paperless-ngx/pull/6875)) +- Feature: Allow a data only export/import cycle [@stumpylog](https://github.com/stumpylog) ([#6871](https://github.com/paperless-ngx/paperless-ngx/pull/6871)) +- Change: rename 'redo OCR' to 'reprocess' to clarify behavior [@shamoon](https://github.com/shamoon) ([#6866](https://github.com/paperless-ngx/paperless-ngx/pull/6866)) +- Enhancement: Support custom path for the classification file [@lino-b](https://github.com/lino-b) ([#6858](https://github.com/paperless-ngx/paperless-ngx/pull/6858)) +- Chore(deps-dev): Bump the development group across 1 directory with 2 updates [@dependabot](https://github.com/dependabot) ([#6851](https://github.com/paperless-ngx/paperless-ngx/pull/6851)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6843](https://github.com/paperless-ngx/paperless-ngx/pull/6843)) +- Fix: Don't allow the workflow save to override other process updates [@stumpylog](https://github.com/stumpylog) ([#6849](https://github.com/paperless-ngx/paperless-ngx/pull/6849)) +- Chore(deps): Use psycopg as recommended [@stumpylog](https://github.com/stumpylog) ([#6811](https://github.com/paperless-ngx/paperless-ngx/pull/6811)) +- Enhancement: default to title/content search, allow choosing full search link from global search [@shamoon](https://github.com/shamoon) ([#6805](https://github.com/paperless-ngx/paperless-ngx/pull/6805)) +- Enhancement: only include correspondent 'last_correspondence' if requested [@shamoon](https://github.com/shamoon) ([#6792](https://github.com/paperless-ngx/paperless-ngx/pull/6792)) +- Enhancement: accessibility improvements for tags, doc links, dashboard views [@shamoon](https://github.com/shamoon) ([#6786](https://github.com/paperless-ngx/paperless-ngx/pull/6786)) +- Enhancement: delete pages PDF action [@shamoon](https://github.com/shamoon) ([#6772](https://github.com/paperless-ngx/paperless-ngx/pull/6772)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6793](https://github.com/paperless-ngx/paperless-ngx/pull/6793)) +- Enhancement: support custom logo / title on login page [@shamoon](https://github.com/shamoon) ([#6775](https://github.com/paperless-ngx/paperless-ngx/pull/6775)) +- Chore: Change the code formatter to Ruff [@stumpylog](https://github.com/stumpylog) ([#6756](https://github.com/paperless-ngx/paperless-ngx/pull/6756)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#6761](https://github.com/paperless-ngx/paperless-ngx/pull/6761)) +- Fix: consistently use created_date for doc display [@shamoon](https://github.com/shamoon) ([#6758](https://github.com/paperless-ngx/paperless-ngx/pull/6758)) +- Chore: revert pngx pdf viewer to third party package [@shamoon](https://github.com/shamoon) ([#6741](https://github.com/paperless-ngx/paperless-ngx/pull/6741))
## paperless-ngx 2.8.6 ### Bug Fixes -- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) -- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737)) +- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) +- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737)) ### All App Changes
2 changes -- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) -- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737)) +- Security: disallow API remote-user auth if disabled [@shamoon](https://github.com/shamoon) ([#6739](https://github.com/paperless-ngx/paperless-ngx/pull/6739)) +- Fix: retain sort field from global search filtering, use FILTER_HAS_TAGS_ALL [@shamoon](https://github.com/shamoon) ([#6737](https://github.com/paperless-ngx/paperless-ngx/pull/6737))
## paperless-ngx 2.8.5 ### Bug Fixes -- Fix: restore search highlighting on large cards results [@shamoon](https://github.com/shamoon) ([#6728](https://github.com/paperless-ngx/paperless-ngx/pull/6728)) -- Fix: global search filtering links broken in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6726](https://github.com/paperless-ngx/paperless-ngx/pull/6726)) -- Fix: some buttons incorrectly aligned in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6715](https://github.com/paperless-ngx/paperless-ngx/pull/6715)) -- Fix: don't format ASN as number on dashboard [@shamoon](https://github.com/shamoon) ([#6708](https://github.com/paperless-ngx/paperless-ngx/pull/6708)) +- Fix: restore search highlighting on large cards results [@shamoon](https://github.com/shamoon) ([#6728](https://github.com/paperless-ngx/paperless-ngx/pull/6728)) +- Fix: global search filtering links broken in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6726](https://github.com/paperless-ngx/paperless-ngx/pull/6726)) +- Fix: some buttons incorrectly aligned in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6715](https://github.com/paperless-ngx/paperless-ngx/pull/6715)) +- Fix: don't format ASN as number on dashboard [@shamoon](https://github.com/shamoon) ([#6708](https://github.com/paperless-ngx/paperless-ngx/pull/6708)) ### All App Changes
4 changes -- Fix: restore search highlighting on large cards results [@shamoon](https://github.com/shamoon) ([#6728](https://github.com/paperless-ngx/paperless-ngx/pull/6728)) -- Fix: global search filtering links broken in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6726](https://github.com/paperless-ngx/paperless-ngx/pull/6726)) -- Fix: some buttons incorrectly aligned in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6715](https://github.com/paperless-ngx/paperless-ngx/pull/6715)) -- Fix: don't format ASN as number on dashboard [@shamoon](https://github.com/shamoon) ([#6708](https://github.com/paperless-ngx/paperless-ngx/pull/6708)) +- Fix: restore search highlighting on large cards results [@shamoon](https://github.com/shamoon) ([#6728](https://github.com/paperless-ngx/paperless-ngx/pull/6728)) +- Fix: global search filtering links broken in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6726](https://github.com/paperless-ngx/paperless-ngx/pull/6726)) +- Fix: some buttons incorrectly aligned in 2.8.4 [@shamoon](https://github.com/shamoon) ([#6715](https://github.com/paperless-ngx/paperless-ngx/pull/6715)) +- Fix: don't format ASN as number on dashboard [@shamoon](https://github.com/shamoon) ([#6708](https://github.com/paperless-ngx/paperless-ngx/pull/6708))
## paperless-ngx 2.8.4 ### Features -- Enhancement: display current ASN in statistics [@darmiel](https://github.com/darmiel) ([#6692](https://github.com/paperless-ngx/paperless-ngx/pull/6692)) -- Enhancement: global search tweaks [@shamoon](https://github.com/shamoon) ([#6674](https://github.com/paperless-ngx/paperless-ngx/pull/6674)) +- Enhancement: display current ASN in statistics [@darmiel](https://github.com/darmiel) ([#6692](https://github.com/paperless-ngx/paperless-ngx/pull/6692)) +- Enhancement: global search tweaks [@shamoon](https://github.com/shamoon) ([#6674](https://github.com/paperless-ngx/paperless-ngx/pull/6674)) ### Bug Fixes -- Security: Correctly disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6702](https://github.com/paperless-ngx/paperless-ngx/pull/6702)) -- Fix: history timestamp tooltip illegible in dark mode [@shamoon](https://github.com/shamoon) ([#6696](https://github.com/paperless-ngx/paperless-ngx/pull/6696)) -- Fix: only count inbox documents from inbox tags with permissions [@shamoon](https://github.com/shamoon) ([#6670](https://github.com/paperless-ngx/paperless-ngx/pull/6670)) +- Security: Correctly disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6702](https://github.com/paperless-ngx/paperless-ngx/pull/6702)) +- Fix: history timestamp tooltip illegible in dark mode [@shamoon](https://github.com/shamoon) ([#6696](https://github.com/paperless-ngx/paperless-ngx/pull/6696)) +- Fix: only count inbox documents from inbox tags with permissions [@shamoon](https://github.com/shamoon) ([#6670](https://github.com/paperless-ngx/paperless-ngx/pull/6670)) ### All App Changes
5 changes -- Enhancement: global search tweaks [@shamoon](https://github.com/shamoon) ([#6674](https://github.com/paperless-ngx/paperless-ngx/pull/6674)) -- Security: Correctly disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6702](https://github.com/paperless-ngx/paperless-ngx/pull/6702)) -- Fix: history timestamp tooltip illegible in dark mode [@shamoon](https://github.com/shamoon) ([#6696](https://github.com/paperless-ngx/paperless-ngx/pull/6696)) -- Enhancement: display current ASN in statistics [@darmiel](https://github.com/darmiel) ([#6692](https://github.com/paperless-ngx/paperless-ngx/pull/6692)) -- Fix: only count inbox documents from inbox tags with permissions [@shamoon](https://github.com/shamoon) ([#6670](https://github.com/paperless-ngx/paperless-ngx/pull/6670)) +- Enhancement: global search tweaks [@shamoon](https://github.com/shamoon) ([#6674](https://github.com/paperless-ngx/paperless-ngx/pull/6674)) +- Security: Correctly disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6702](https://github.com/paperless-ngx/paperless-ngx/pull/6702)) +- Fix: history timestamp tooltip illegible in dark mode [@shamoon](https://github.com/shamoon) ([#6696](https://github.com/paperless-ngx/paperless-ngx/pull/6696)) +- Enhancement: display current ASN in statistics [@darmiel](https://github.com/darmiel) ([#6692](https://github.com/paperless-ngx/paperless-ngx/pull/6692)) +- Fix: only count inbox documents from inbox tags with permissions [@shamoon](https://github.com/shamoon) ([#6670](https://github.com/paperless-ngx/paperless-ngx/pull/6670))
## paperless-ngx 2.8.3 ### Bug Fixes -- Fix: respect superuser for document history [@shamoon](https://github.com/shamoon) ([#6661](https://github.com/paperless-ngx/paperless-ngx/pull/6661)) -- Fix: allow 0 in monetary field [@shamoon](https://github.com/shamoon) ([#6658](https://github.com/paperless-ngx/paperless-ngx/pull/6658)) -- Fix: custom field removal doesn't always trigger change detection [@shamoon](https://github.com/shamoon) ([#6653](https://github.com/paperless-ngx/paperless-ngx/pull/6653)) -- Fix: Downgrade and lock lxml [@stumpylog](https://github.com/stumpylog) ([#6655](https://github.com/paperless-ngx/paperless-ngx/pull/6655)) -- Fix: correctly handle global search esc key when open and button foucsed [@shamoon](https://github.com/shamoon) ([#6644](https://github.com/paperless-ngx/paperless-ngx/pull/6644)) -- Fix: consistent monetary field display in list and cards [@shamoon](https://github.com/shamoon) ([#6645](https://github.com/paperless-ngx/paperless-ngx/pull/6645)) -- Fix: doc links and more illegible in light mode [@shamoon](https://github.com/shamoon) ([#6643](https://github.com/paperless-ngx/paperless-ngx/pull/6643)) -- Fix: Allow auditlog to be disabled [@stumpylog](https://github.com/stumpylog) ([#6638](https://github.com/paperless-ngx/paperless-ngx/pull/6638)) +- Fix: respect superuser for document history [@shamoon](https://github.com/shamoon) ([#6661](https://github.com/paperless-ngx/paperless-ngx/pull/6661)) +- Fix: allow 0 in monetary field [@shamoon](https://github.com/shamoon) ([#6658](https://github.com/paperless-ngx/paperless-ngx/pull/6658)) +- Fix: custom field removal doesn't always trigger change detection [@shamoon](https://github.com/shamoon) ([#6653](https://github.com/paperless-ngx/paperless-ngx/pull/6653)) +- Fix: Downgrade and lock lxml [@stumpylog](https://github.com/stumpylog) ([#6655](https://github.com/paperless-ngx/paperless-ngx/pull/6655)) +- Fix: correctly handle global search esc key when open and button foucsed [@shamoon](https://github.com/shamoon) ([#6644](https://github.com/paperless-ngx/paperless-ngx/pull/6644)) +- Fix: consistent monetary field display in list and cards [@shamoon](https://github.com/shamoon) ([#6645](https://github.com/paperless-ngx/paperless-ngx/pull/6645)) +- Fix: doc links and more illegible in light mode [@shamoon](https://github.com/shamoon) ([#6643](https://github.com/paperless-ngx/paperless-ngx/pull/6643)) +- Fix: Allow auditlog to be disabled [@stumpylog](https://github.com/stumpylog) ([#6638](https://github.com/paperless-ngx/paperless-ngx/pull/6638)) ### Documentation -- Chore(docs): Update the sample Compose file to latest database [@stumpylog](https://github.com/stumpylog) ([#6639](https://github.com/paperless-ngx/paperless-ngx/pull/6639)) +- Chore(docs): Update the sample Compose file to latest database [@stumpylog](https://github.com/stumpylog) ([#6639](https://github.com/paperless-ngx/paperless-ngx/pull/6639)) ### All App Changes
7 changes -- Fix: respect superuser for document history [@shamoon](https://github.com/shamoon) ([#6661](https://github.com/paperless-ngx/paperless-ngx/pull/6661)) -- Fix: allow 0 in monetary field [@shamoon](https://github.com/shamoon) ([#6658](https://github.com/paperless-ngx/paperless-ngx/pull/6658)) -- Fix: custom field removal doesn't always trigger change detection [@shamoon](https://github.com/shamoon) ([#6653](https://github.com/paperless-ngx/paperless-ngx/pull/6653)) -- Fix: correctly handle global search esc key when open and button foucsed [@shamoon](https://github.com/shamoon) ([#6644](https://github.com/paperless-ngx/paperless-ngx/pull/6644)) -- Fix: consistent monetary field display in list and cards [@shamoon](https://github.com/shamoon) ([#6645](https://github.com/paperless-ngx/paperless-ngx/pull/6645)) -- Fix: doc links and more illegible in light mode [@shamoon](https://github.com/shamoon) ([#6643](https://github.com/paperless-ngx/paperless-ngx/pull/6643)) -- Fix: Allow auditlog to be disabled [@stumpylog](https://github.com/stumpylog) ([#6638](https://github.com/paperless-ngx/paperless-ngx/pull/6638)) +- Fix: respect superuser for document history [@shamoon](https://github.com/shamoon) ([#6661](https://github.com/paperless-ngx/paperless-ngx/pull/6661)) +- Fix: allow 0 in monetary field [@shamoon](https://github.com/shamoon) ([#6658](https://github.com/paperless-ngx/paperless-ngx/pull/6658)) +- Fix: custom field removal doesn't always trigger change detection [@shamoon](https://github.com/shamoon) ([#6653](https://github.com/paperless-ngx/paperless-ngx/pull/6653)) +- Fix: correctly handle global search esc key when open and button foucsed [@shamoon](https://github.com/shamoon) ([#6644](https://github.com/paperless-ngx/paperless-ngx/pull/6644)) +- Fix: consistent monetary field display in list and cards [@shamoon](https://github.com/shamoon) ([#6645](https://github.com/paperless-ngx/paperless-ngx/pull/6645)) +- Fix: doc links and more illegible in light mode [@shamoon](https://github.com/shamoon) ([#6643](https://github.com/paperless-ngx/paperless-ngx/pull/6643)) +- Fix: Allow auditlog to be disabled [@stumpylog](https://github.com/stumpylog) ([#6638](https://github.com/paperless-ngx/paperless-ngx/pull/6638))
## paperless-ngx 2.8.2 ### Bug Fixes -- Fix: Restore the compression of static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#6627](https://github.com/paperless-ngx/paperless-ngx/pull/6627)) -- Fix: make backend monetary validation accept unpadded decimals [@shamoon](https://github.com/shamoon) ([#6626](https://github.com/paperless-ngx/paperless-ngx/pull/6626)) -- Fix: allow bulk edit with existing fields [@shamoon](https://github.com/shamoon) ([#6625](https://github.com/paperless-ngx/paperless-ngx/pull/6625)) -- Fix: table view doesn't immediately display custom fields on app startup [@shamoon](https://github.com/shamoon) ([#6600](https://github.com/paperless-ngx/paperless-ngx/pull/6600)) -- Fix: dont use limit in subqueries in global search for mariadb compatibility [@shamoon](https://github.com/shamoon) ([#6611](https://github.com/paperless-ngx/paperless-ngx/pull/6611)) -- Fix: exclude admin perms from group permissions serializer [@shamoon](https://github.com/shamoon) ([#6608](https://github.com/paperless-ngx/paperless-ngx/pull/6608)) -- Fix: global search text illegible in light mode [@shamoon](https://github.com/shamoon) ([#6602](https://github.com/paperless-ngx/paperless-ngx/pull/6602)) -- Fix: document history text color illegible in light mode [@shamoon](https://github.com/shamoon) ([#6601](https://github.com/paperless-ngx/paperless-ngx/pull/6601)) +- Fix: Restore the compression of static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#6627](https://github.com/paperless-ngx/paperless-ngx/pull/6627)) +- Fix: make backend monetary validation accept unpadded decimals [@shamoon](https://github.com/shamoon) ([#6626](https://github.com/paperless-ngx/paperless-ngx/pull/6626)) +- Fix: allow bulk edit with existing fields [@shamoon](https://github.com/shamoon) ([#6625](https://github.com/paperless-ngx/paperless-ngx/pull/6625)) +- Fix: table view doesn't immediately display custom fields on app startup [@shamoon](https://github.com/shamoon) ([#6600](https://github.com/paperless-ngx/paperless-ngx/pull/6600)) +- Fix: dont use limit in subqueries in global search for mariadb compatibility [@shamoon](https://github.com/shamoon) ([#6611](https://github.com/paperless-ngx/paperless-ngx/pull/6611)) +- Fix: exclude admin perms from group permissions serializer [@shamoon](https://github.com/shamoon) ([#6608](https://github.com/paperless-ngx/paperless-ngx/pull/6608)) +- Fix: global search text illegible in light mode [@shamoon](https://github.com/shamoon) ([#6602](https://github.com/paperless-ngx/paperless-ngx/pull/6602)) +- Fix: document history text color illegible in light mode [@shamoon](https://github.com/shamoon) ([#6601](https://github.com/paperless-ngx/paperless-ngx/pull/6601)) ### All App Changes
10 changes -- Fix: Restore the compression of static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#6627](https://github.com/paperless-ngx/paperless-ngx/pull/6627)) -- Fix: make backend monetary validation accept unpadded decimals [@shamoon](https://github.com/shamoon) ([#6626](https://github.com/paperless-ngx/paperless-ngx/pull/6626)) -- Fix: allow bulk edit with existing fields [@shamoon](https://github.com/shamoon) ([#6625](https://github.com/paperless-ngx/paperless-ngx/pull/6625)) -- Enhancement: show custom field name on cards if empty, add tooltip [@shamoon](https://github.com/shamoon) ([#6620](https://github.com/paperless-ngx/paperless-ngx/pull/6620)) -- Security: Disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6615](https://github.com/paperless-ngx/paperless-ngx/pull/6615)) -- Fix: table view doesn't immediately display custom fields on app startup [@shamoon](https://github.com/shamoon) ([#6600](https://github.com/paperless-ngx/paperless-ngx/pull/6600)) -- Fix: dont use limit in subqueries in global search for mariadb compatibility [@shamoon](https://github.com/shamoon) ([#6611](https://github.com/paperless-ngx/paperless-ngx/pull/6611)) -- Fix: exclude admin perms from group permissions serializer [@shamoon](https://github.com/shamoon) ([#6608](https://github.com/paperless-ngx/paperless-ngx/pull/6608)) -- Fix: global search text illegible in light mode [@shamoon](https://github.com/shamoon) ([#6602](https://github.com/paperless-ngx/paperless-ngx/pull/6602)) -- Fix: document history text color illegible in light mode [@shamoon](https://github.com/shamoon) ([#6601](https://github.com/paperless-ngx/paperless-ngx/pull/6601)) +- Fix: Restore the compression of static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#6627](https://github.com/paperless-ngx/paperless-ngx/pull/6627)) +- Fix: make backend monetary validation accept unpadded decimals [@shamoon](https://github.com/shamoon) ([#6626](https://github.com/paperless-ngx/paperless-ngx/pull/6626)) +- Fix: allow bulk edit with existing fields [@shamoon](https://github.com/shamoon) ([#6625](https://github.com/paperless-ngx/paperless-ngx/pull/6625)) +- Enhancement: show custom field name on cards if empty, add tooltip [@shamoon](https://github.com/shamoon) ([#6620](https://github.com/paperless-ngx/paperless-ngx/pull/6620)) +- Security: Disable in pdfjs [@shamoon](https://github.com/shamoon) ([#6615](https://github.com/paperless-ngx/paperless-ngx/pull/6615)) +- Fix: table view doesn't immediately display custom fields on app startup [@shamoon](https://github.com/shamoon) ([#6600](https://github.com/paperless-ngx/paperless-ngx/pull/6600)) +- Fix: dont use limit in subqueries in global search for mariadb compatibility [@shamoon](https://github.com/shamoon) ([#6611](https://github.com/paperless-ngx/paperless-ngx/pull/6611)) +- Fix: exclude admin perms from group permissions serializer [@shamoon](https://github.com/shamoon) ([#6608](https://github.com/paperless-ngx/paperless-ngx/pull/6608)) +- Fix: global search text illegible in light mode [@shamoon](https://github.com/shamoon) ([#6602](https://github.com/paperless-ngx/paperless-ngx/pull/6602)) +- Fix: document history text color illegible in light mode [@shamoon](https://github.com/shamoon) ([#6601](https://github.com/paperless-ngx/paperless-ngx/pull/6601))
## paperless-ngx 2.8.1 ### Bug Fixes -- Fix: saved views dont immediately display custom fields in table view [@shamoon](https://github.com/shamoon) ([#6594](https://github.com/paperless-ngx/paperless-ngx/pull/6594)) -- Fix: bulk edit custom fields should support multiple items [@shamoon](https://github.com/shamoon) ([#6589](https://github.com/paperless-ngx/paperless-ngx/pull/6589)) +- Fix: saved views dont immediately display custom fields in table view [@shamoon](https://github.com/shamoon) ([#6594](https://github.com/paperless-ngx/paperless-ngx/pull/6594)) +- Fix: bulk edit custom fields should support multiple items [@shamoon](https://github.com/shamoon) ([#6589](https://github.com/paperless-ngx/paperless-ngx/pull/6589)) ### Dependencies -- Chore(deps-dev): Bump jinja2 from 3.1.3 to 3.1.4 [@dependabot](https://github.com/dependabot) ([#6579](https://github.com/paperless-ngx/paperless-ngx/pull/6579)) -- Chore(deps-dev): Bump mkdocs-glightbox from 0.3.7 to 0.4.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#6581](https://github.com/paperless-ngx/paperless-ngx/pull/6581)) +- Chore(deps-dev): Bump jinja2 from 3.1.3 to 3.1.4 [@dependabot](https://github.com/dependabot) ([#6579](https://github.com/paperless-ngx/paperless-ngx/pull/6579)) +- Chore(deps-dev): Bump mkdocs-glightbox from 0.3.7 to 0.4.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#6581](https://github.com/paperless-ngx/paperless-ngx/pull/6581)) ### All App Changes
3 changes -- Fix: saved views dont immediately display custom fields in table view [@shamoon](https://github.com/shamoon) ([#6594](https://github.com/paperless-ngx/paperless-ngx/pull/6594)) -- Chore(deps-dev): Bump mkdocs-glightbox from 0.3.7 to 0.4.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#6581](https://github.com/paperless-ngx/paperless-ngx/pull/6581)) -- Fix: bulk edit custom fields should support multiple items [@shamoon](https://github.com/shamoon) ([#6589](https://github.com/paperless-ngx/paperless-ngx/pull/6589)) +- Fix: saved views dont immediately display custom fields in table view [@shamoon](https://github.com/shamoon) ([#6594](https://github.com/paperless-ngx/paperless-ngx/pull/6594)) +- Chore(deps-dev): Bump mkdocs-glightbox from 0.3.7 to 0.4.0 in the small-changes group [@dependabot](https://github.com/dependabot) ([#6581](https://github.com/paperless-ngx/paperless-ngx/pull/6581)) +- Fix: bulk edit custom fields should support multiple items [@shamoon](https://github.com/shamoon) ([#6589](https://github.com/paperless-ngx/paperless-ngx/pull/6589))
## paperless-ngx 2.8.0 ### Breaking Changes -- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) +- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) ### Notable Changes -- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) -- Feature: custom fields filtering \& bulk editing [@shamoon](https://github.com/shamoon) ([#6484](https://github.com/paperless-ngx/paperless-ngx/pull/6484)) -- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) -- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) -- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) +- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) +- Feature: custom fields filtering \& bulk editing [@shamoon](https://github.com/shamoon) ([#6484](https://github.com/paperless-ngx/paperless-ngx/pull/6484)) +- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) +- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) +- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) ### Features -- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) -- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) -- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) -- Enhancement: refactor monetary field [@shamoon](https://github.com/shamoon) ([#6370](https://github.com/paperless-ngx/paperless-ngx/pull/6370)) -- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) +- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) +- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) +- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) +- Enhancement: refactor monetary field [@shamoon](https://github.com/shamoon) ([#6370](https://github.com/paperless-ngx/paperless-ngx/pull/6370)) +- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) ### Bug Fixes -- Fix: always check workflow if set [@shamoon](https://github.com/shamoon) ([#6474](https://github.com/paperless-ngx/paperless-ngx/pull/6474)) -- Fix: use responsive tables for management lists [@DlieBG](https://github.com/DlieBG) ([#6460](https://github.com/paperless-ngx/paperless-ngx/pull/6460)) -- Fix: password reset done template [@shamoon](https://github.com/shamoon) ([#6444](https://github.com/paperless-ngx/paperless-ngx/pull/6444)) -- Fix: show message on empty group list [@DlieBG](https://github.com/DlieBG) ([#6393](https://github.com/paperless-ngx/paperless-ngx/pull/6393)) -- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) -- Fix: dont dismiss active alerts on dismiss completed [@shamoon](https://github.com/shamoon) ([#6364](https://github.com/paperless-ngx/paperless-ngx/pull/6364)) -- Fix: Allow lowercase letters in monetary currency code field [@shamoon](https://github.com/shamoon) ([#6359](https://github.com/paperless-ngx/paperless-ngx/pull/6359)) -- Fix: Allow negative monetary values with a current code [@stumpylog](https://github.com/stumpylog) ([#6358](https://github.com/paperless-ngx/paperless-ngx/pull/6358)) -- Fix: add timezone fallback to install script [@Harald-Berghoff](https://github.com/Harald-Berghoff) ([#6336](https://github.com/paperless-ngx/paperless-ngx/pull/6336)) +- Fix: always check workflow if set [@shamoon](https://github.com/shamoon) ([#6474](https://github.com/paperless-ngx/paperless-ngx/pull/6474)) +- Fix: use responsive tables for management lists [@DlieBG](https://github.com/DlieBG) ([#6460](https://github.com/paperless-ngx/paperless-ngx/pull/6460)) +- Fix: password reset done template [@shamoon](https://github.com/shamoon) ([#6444](https://github.com/paperless-ngx/paperless-ngx/pull/6444)) +- Fix: show message on empty group list [@DlieBG](https://github.com/DlieBG) ([#6393](https://github.com/paperless-ngx/paperless-ngx/pull/6393)) +- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) +- Fix: dont dismiss active alerts on dismiss completed [@shamoon](https://github.com/shamoon) ([#6364](https://github.com/paperless-ngx/paperless-ngx/pull/6364)) +- Fix: Allow lowercase letters in monetary currency code field [@shamoon](https://github.com/shamoon) ([#6359](https://github.com/paperless-ngx/paperless-ngx/pull/6359)) +- Fix: Allow negative monetary values with a current code [@stumpylog](https://github.com/stumpylog) ([#6358](https://github.com/paperless-ngx/paperless-ngx/pull/6358)) +- Fix: add timezone fallback to install script [@Harald-Berghoff](https://github.com/Harald-Berghoff) ([#6336](https://github.com/paperless-ngx/paperless-ngx/pull/6336)) ### Maintenance -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.5.0 to 0.6.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6541](https://github.com/paperless-ngx/paperless-ngx/pull/6541)) -- Chore(deps): Bump all allowed backend packages [@stumpylog](https://github.com/stumpylog) ([#6562](https://github.com/paperless-ngx/paperless-ngx/pull/6562)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.5.0 to 0.6.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6541](https://github.com/paperless-ngx/paperless-ngx/pull/6541)) +- Chore(deps): Bump all allowed backend packages [@stumpylog](https://github.com/stumpylog) ([#6562](https://github.com/paperless-ngx/paperless-ngx/pull/6562)) ### Dependencies
10 changes -- Chore(deps): Bump stumpylog/image-cleaner-action from 0.5.0 to 0.6.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6541](https://github.com/paperless-ngx/paperless-ngx/pull/6541)) -- Chore(deps-dev): Bump ejs from 3.1.9 to 3.1.10 in /src-ui [@dependabot](https://github.com/dependabot) ([#6540](https://github.com/paperless-ngx/paperless-ngx/pull/6540)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates [@dependabot](https://github.com/dependabot) ([#6539](https://github.com/paperless-ngx/paperless-ngx/pull/6539)) -- Chore(deps): Bump python-ipware from 2.0.3 to 3.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#6468](https://github.com/paperless-ngx/paperless-ngx/pull/6468)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6466](https://github.com/paperless-ngx/paperless-ngx/pull/6466)) -- Chore: Updates Docker bundled QPDF to 11.9.0 [@stumpylog](https://github.com/stumpylog) ([#6423](https://github.com/paperless-ngx/paperless-ngx/pull/6423)) -- Chore(deps): Bump gunicorn from 21.2.0 to 22.0.0 [@dependabot](https://github.com/dependabot) ([#6416](https://github.com/paperless-ngx/paperless-ngx/pull/6416)) -- Chore(deps): Bump the small-changes group with 11 updates [@dependabot](https://github.com/dependabot) ([#6405](https://github.com/paperless-ngx/paperless-ngx/pull/6405)) -- Chore(deps): Bump idna from 3.6 to 3.7 [@dependabot](https://github.com/dependabot) ([#6377](https://github.com/paperless-ngx/paperless-ngx/pull/6377)) -- Chore(deps): Bump tar from 6.2.0 to 6.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#6373](https://github.com/paperless-ngx/paperless-ngx/pull/6373)) +- Chore(deps): Bump stumpylog/image-cleaner-action from 0.5.0 to 0.6.0 in the actions group [@dependabot](https://github.com/dependabot) ([#6541](https://github.com/paperless-ngx/paperless-ngx/pull/6541)) +- Chore(deps-dev): Bump ejs from 3.1.9 to 3.1.10 in /src-ui [@dependabot](https://github.com/dependabot) ([#6540](https://github.com/paperless-ngx/paperless-ngx/pull/6540)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates [@dependabot](https://github.com/dependabot) ([#6539](https://github.com/paperless-ngx/paperless-ngx/pull/6539)) +- Chore(deps): Bump python-ipware from 2.0.3 to 3.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#6468](https://github.com/paperless-ngx/paperless-ngx/pull/6468)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6466](https://github.com/paperless-ngx/paperless-ngx/pull/6466)) +- Chore: Updates Docker bundled QPDF to 11.9.0 [@stumpylog](https://github.com/stumpylog) ([#6423](https://github.com/paperless-ngx/paperless-ngx/pull/6423)) +- Chore(deps): Bump gunicorn from 21.2.0 to 22.0.0 [@dependabot](https://github.com/dependabot) ([#6416](https://github.com/paperless-ngx/paperless-ngx/pull/6416)) +- Chore(deps): Bump the small-changes group with 11 updates [@dependabot](https://github.com/dependabot) ([#6405](https://github.com/paperless-ngx/paperless-ngx/pull/6405)) +- Chore(deps): Bump idna from 3.6 to 3.7 [@dependabot](https://github.com/dependabot) ([#6377](https://github.com/paperless-ngx/paperless-ngx/pull/6377)) +- Chore(deps): Bump tar from 6.2.0 to 6.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#6373](https://github.com/paperless-ngx/paperless-ngx/pull/6373))
### All App Changes @@ -2378,110 +2772,110 @@
23 changes -- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) -- Chore(deps-dev): Bump ejs from 3.1.9 to 3.1.10 in /src-ui [@dependabot](https://github.com/dependabot) ([#6540](https://github.com/paperless-ngx/paperless-ngx/pull/6540)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates [@dependabot](https://github.com/dependabot) ([#6539](https://github.com/paperless-ngx/paperless-ngx/pull/6539)) -- Chore: Hand craft SQL queries [@stumpylog](https://github.com/stumpylog) ([#6489](https://github.com/paperless-ngx/paperless-ngx/pull/6489)) -- Feature: custom fields filtering \& bulk editing [@shamoon](https://github.com/shamoon) ([#6484](https://github.com/paperless-ngx/paperless-ngx/pull/6484)) -- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) -- Chore(deps): Bump python-ipware from 2.0.3 to 3.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#6468](https://github.com/paperless-ngx/paperless-ngx/pull/6468)) -- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6466](https://github.com/paperless-ngx/paperless-ngx/pull/6466)) -- Fix: always check workflow if set [@shamoon](https://github.com/shamoon) ([#6474](https://github.com/paperless-ngx/paperless-ngx/pull/6474)) -- Fix: use responsive tables for management lists [@DlieBG](https://github.com/DlieBG) ([#6460](https://github.com/paperless-ngx/paperless-ngx/pull/6460)) -- Fix: password reset done template [@shamoon](https://github.com/shamoon) ([#6444](https://github.com/paperless-ngx/paperless-ngx/pull/6444)) -- Enhancement: refactor monetary field [@shamoon](https://github.com/shamoon) ([#6370](https://github.com/paperless-ngx/paperless-ngx/pull/6370)) -- Enhancement: improve layout, button labels for custom fields dropdown [@shamoon](https://github.com/shamoon) ([#6362](https://github.com/paperless-ngx/paperless-ngx/pull/6362)) -- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) -- Chore(deps): Bump the small-changes group with 11 updates [@dependabot](https://github.com/dependabot) ([#6405](https://github.com/paperless-ngx/paperless-ngx/pull/6405)) -- Enhancement: Hide columns in document list if user does not have permissions [@theomega](https://github.com/theomega) ([#6415](https://github.com/paperless-ngx/paperless-ngx/pull/6415)) -- Fix: show message on empty group list [@DlieBG](https://github.com/DlieBG) ([#6393](https://github.com/paperless-ngx/paperless-ngx/pull/6393)) -- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) -- Chore(deps): Bump tar from 6.2.0 to 6.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#6373](https://github.com/paperless-ngx/paperless-ngx/pull/6373)) -- Fix: dont dismiss active alerts on dismiss completed [@shamoon](https://github.com/shamoon) ([#6364](https://github.com/paperless-ngx/paperless-ngx/pull/6364)) -- Fix: Allow lowercase letters in monetary currency code field [@shamoon](https://github.com/shamoon) ([#6359](https://github.com/paperless-ngx/paperless-ngx/pull/6359)) -- Fix: Allow negative monetary values with a current code [@stumpylog](https://github.com/stumpylog) ([#6358](https://github.com/paperless-ngx/paperless-ngx/pull/6358)) +- Feature: global search, keyboard shortcuts / hotkey support [@shamoon](https://github.com/shamoon) ([#6449](https://github.com/paperless-ngx/paperless-ngx/pull/6449)) +- Chore(deps-dev): Bump ejs from 3.1.9 to 3.1.10 in /src-ui [@dependabot](https://github.com/dependabot) ([#6540](https://github.com/paperless-ngx/paperless-ngx/pull/6540)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 13 updates [@dependabot](https://github.com/dependabot) ([#6539](https://github.com/paperless-ngx/paperless-ngx/pull/6539)) +- Chore: Hand craft SQL queries [@stumpylog](https://github.com/stumpylog) ([#6489](https://github.com/paperless-ngx/paperless-ngx/pull/6489)) +- Feature: custom fields filtering \& bulk editing [@shamoon](https://github.com/shamoon) ([#6484](https://github.com/paperless-ngx/paperless-ngx/pull/6484)) +- Feature: customizable fields display for documents, saved views \& dashboard widgets [@shamoon](https://github.com/shamoon) ([#6439](https://github.com/paperless-ngx/paperless-ngx/pull/6439)) +- Chore(deps): Bump python-ipware from 2.0.3 to 3.0.0 in the major-versions group [@dependabot](https://github.com/dependabot) ([#6468](https://github.com/paperless-ngx/paperless-ngx/pull/6468)) +- Feature: document history (audit log UI) [@shamoon](https://github.com/shamoon) ([#6388](https://github.com/paperless-ngx/paperless-ngx/pull/6388)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6466](https://github.com/paperless-ngx/paperless-ngx/pull/6466)) +- Fix: always check workflow if set [@shamoon](https://github.com/shamoon) ([#6474](https://github.com/paperless-ngx/paperless-ngx/pull/6474)) +- Fix: use responsive tables for management lists [@DlieBG](https://github.com/DlieBG) ([#6460](https://github.com/paperless-ngx/paperless-ngx/pull/6460)) +- Fix: password reset done template [@shamoon](https://github.com/shamoon) ([#6444](https://github.com/paperless-ngx/paperless-ngx/pull/6444)) +- Enhancement: refactor monetary field [@shamoon](https://github.com/shamoon) ([#6370](https://github.com/paperless-ngx/paperless-ngx/pull/6370)) +- Enhancement: improve layout, button labels for custom fields dropdown [@shamoon](https://github.com/shamoon) ([#6362](https://github.com/paperless-ngx/paperless-ngx/pull/6362)) +- Chore: Convert the consumer to a plugin [@stumpylog](https://github.com/stumpylog) ([#6361](https://github.com/paperless-ngx/paperless-ngx/pull/6361)) +- Chore(deps): Bump the small-changes group with 11 updates [@dependabot](https://github.com/dependabot) ([#6405](https://github.com/paperless-ngx/paperless-ngx/pull/6405)) +- Enhancement: Hide columns in document list if user does not have permissions [@theomega](https://github.com/theomega) ([#6415](https://github.com/paperless-ngx/paperless-ngx/pull/6415)) +- Fix: show message on empty group list [@DlieBG](https://github.com/DlieBG) ([#6393](https://github.com/paperless-ngx/paperless-ngx/pull/6393)) +- Fix: remove admin.logentry perm, use admin (staff) status [@shamoon](https://github.com/shamoon) ([#6380](https://github.com/paperless-ngx/paperless-ngx/pull/6380)) +- Chore(deps): Bump tar from 6.2.0 to 6.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#6373](https://github.com/paperless-ngx/paperless-ngx/pull/6373)) +- Fix: dont dismiss active alerts on dismiss completed [@shamoon](https://github.com/shamoon) ([#6364](https://github.com/paperless-ngx/paperless-ngx/pull/6364)) +- Fix: Allow lowercase letters in monetary currency code field [@shamoon](https://github.com/shamoon) ([#6359](https://github.com/paperless-ngx/paperless-ngx/pull/6359)) +- Fix: Allow negative monetary values with a current code [@stumpylog](https://github.com/stumpylog) ([#6358](https://github.com/paperless-ngx/paperless-ngx/pull/6358))
## paperless-ngx 2.7.2 ### Bug Fixes -- Fix: select dropdown background colors not visible in light mode [@shamoon](https://github.com/shamoon) ([#6323](https://github.com/paperless-ngx/paperless-ngx/pull/6323)) -- Fix: spacing in reset and incorrect display in saved views [@shamoon](https://github.com/shamoon) ([#6324](https://github.com/paperless-ngx/paperless-ngx/pull/6324)) -- Fix: disable invalid create endpoints [@shamoon](https://github.com/shamoon) ([#6320](https://github.com/paperless-ngx/paperless-ngx/pull/6320)) -- Fix: dont initialize page numbers, allow split with browser pdf viewer [@shamoon](https://github.com/shamoon) ([#6314](https://github.com/paperless-ngx/paperless-ngx/pull/6314)) +- Fix: select dropdown background colors not visible in light mode [@shamoon](https://github.com/shamoon) ([#6323](https://github.com/paperless-ngx/paperless-ngx/pull/6323)) +- Fix: spacing in reset and incorrect display in saved views [@shamoon](https://github.com/shamoon) ([#6324](https://github.com/paperless-ngx/paperless-ngx/pull/6324)) +- Fix: disable invalid create endpoints [@shamoon](https://github.com/shamoon) ([#6320](https://github.com/paperless-ngx/paperless-ngx/pull/6320)) +- Fix: dont initialize page numbers, allow split with browser pdf viewer [@shamoon](https://github.com/shamoon) ([#6314](https://github.com/paperless-ngx/paperless-ngx/pull/6314)) ### All App Changes
4 changes -- Fix: select dropdown background colors not visible in light mode [@shamoon](https://github.com/shamoon) ([#6323](https://github.com/paperless-ngx/paperless-ngx/pull/6323)) -- Fix: spacing in reset and incorrect display in saved views [@shamoon](https://github.com/shamoon) ([#6324](https://github.com/paperless-ngx/paperless-ngx/pull/6324)) -- Fix: disable invalid create endpoints [@shamoon](https://github.com/shamoon) ([#6320](https://github.com/paperless-ngx/paperless-ngx/pull/6320)) -- Fix: dont initialize page numbers, allow split with browser pdf viewer [@shamoon](https://github.com/shamoon) ([#6314](https://github.com/paperless-ngx/paperless-ngx/pull/6314)) +- Fix: select dropdown background colors not visible in light mode [@shamoon](https://github.com/shamoon) ([#6323](https://github.com/paperless-ngx/paperless-ngx/pull/6323)) +- Fix: spacing in reset and incorrect display in saved views [@shamoon](https://github.com/shamoon) ([#6324](https://github.com/paperless-ngx/paperless-ngx/pull/6324)) +- Fix: disable invalid create endpoints [@shamoon](https://github.com/shamoon) ([#6320](https://github.com/paperless-ngx/paperless-ngx/pull/6320)) +- Fix: dont initialize page numbers, allow split with browser pdf viewer [@shamoon](https://github.com/shamoon) ([#6314](https://github.com/paperless-ngx/paperless-ngx/pull/6314))
## paperless-ngx 2.7.1 ### Bug Fixes -- Fix: Only disable split button if pages = 1 [@shamoon](https://github.com/shamoon) ([#6304](https://github.com/paperless-ngx/paperless-ngx/pull/6304)) -- Fix: Use correct custom field id when splitting [@shamoon](https://github.com/shamoon) ([#6303](https://github.com/paperless-ngx/paperless-ngx/pull/6303)) -- Fix: Rotation fails due to celery chord [@stumpylog](https://github.com/stumpylog) ([#6306](https://github.com/paperless-ngx/paperless-ngx/pull/6306)) -- Fix: split user / group objects error [@shamoon](https://github.com/shamoon) ([#6302](https://github.com/paperless-ngx/paperless-ngx/pull/6302)) +- Fix: Only disable split button if pages = 1 [@shamoon](https://github.com/shamoon) ([#6304](https://github.com/paperless-ngx/paperless-ngx/pull/6304)) +- Fix: Use correct custom field id when splitting [@shamoon](https://github.com/shamoon) ([#6303](https://github.com/paperless-ngx/paperless-ngx/pull/6303)) +- Fix: Rotation fails due to celery chord [@stumpylog](https://github.com/stumpylog) ([#6306](https://github.com/paperless-ngx/paperless-ngx/pull/6306)) +- Fix: split user / group objects error [@shamoon](https://github.com/shamoon) ([#6302](https://github.com/paperless-ngx/paperless-ngx/pull/6302)) ### All App Changes
4 changes -- Fix: Only disable split button if pages = 1 [@shamoon](https://github.com/shamoon) ([#6304](https://github.com/paperless-ngx/paperless-ngx/pull/6304)) -- Fix: Use correct custom field id when splitting [@shamoon](https://github.com/shamoon) ([#6303](https://github.com/paperless-ngx/paperless-ngx/pull/6303)) -- Fix: Rotation fails due to celery chord [@stumpylog](https://github.com/stumpylog) ([#6306](https://github.com/paperless-ngx/paperless-ngx/pull/6306)) -- Fix: split user / group objects error [@shamoon](https://github.com/shamoon) ([#6302](https://github.com/paperless-ngx/paperless-ngx/pull/6302)) +- Fix: Only disable split button if pages = 1 [@shamoon](https://github.com/shamoon) ([#6304](https://github.com/paperless-ngx/paperless-ngx/pull/6304)) +- Fix: Use correct custom field id when splitting [@shamoon](https://github.com/shamoon) ([#6303](https://github.com/paperless-ngx/paperless-ngx/pull/6303)) +- Fix: Rotation fails due to celery chord [@stumpylog](https://github.com/stumpylog) ([#6306](https://github.com/paperless-ngx/paperless-ngx/pull/6306)) +- Fix: split user / group objects error [@shamoon](https://github.com/shamoon) ([#6302](https://github.com/paperless-ngx/paperless-ngx/pull/6302))
## paperless-ngx 2.7.0 ### Notable Changes -- Feature: PDF actions - merge, split \& rotate @shamoon ([#6094](https://github.com/paperless-ngx/paperless-ngx/pull/6094)) -- Change: enable auditlog by default, fix import / export @shamoon ([#6267](https://github.com/paperless-ngx/paperless-ngx/pull/6267)) +- Feature: PDF actions - merge, split \& rotate @shamoon ([#6094](https://github.com/paperless-ngx/paperless-ngx/pull/6094)) +- Change: enable auditlog by default, fix import / export @shamoon ([#6267](https://github.com/paperless-ngx/paperless-ngx/pull/6267)) ### Enhancements -- Enhancement: always place search term first in autocomplete results @shamoon ([#6142](https://github.com/paperless-ngx/paperless-ngx/pull/6142)) +- Enhancement: always place search term first in autocomplete results @shamoon ([#6142](https://github.com/paperless-ngx/paperless-ngx/pull/6142)) ### Maintenance -- Chore: Standardize subprocess running and logging [@stumpylog](https://github.com/stumpylog) ([#6275](https://github.com/paperless-ngx/paperless-ngx/pull/6275)) +- Chore: Standardize subprocess running and logging [@stumpylog](https://github.com/stumpylog) ([#6275](https://github.com/paperless-ngx/paperless-ngx/pull/6275)) ### Bug Fixes -- Fix: Escape the secret key when writing it to the env file [@stumpylog](https://github.com/stumpylog) ([#6243](https://github.com/paperless-ngx/paperless-ngx/pull/6243)) -- Fix: Hide sidebar labels if group is empty [@shamoon](https://github.com/shamoon) ([#6254](https://github.com/paperless-ngx/paperless-ngx/pull/6254)) -- Fix: management list clear all should clear header checkbox [@shamoon](https://github.com/shamoon) ([#6253](https://github.com/paperless-ngx/paperless-ngx/pull/6253)) -- Fix: start-align object names in some UI lists [@shamoon](https://github.com/shamoon) ([#6188](https://github.com/paperless-ngx/paperless-ngx/pull/6188)) -- Fix: allow scroll long upload files alerts list [@shamoon](https://github.com/shamoon) ([#6184](https://github.com/paperless-ngx/paperless-ngx/pull/6184)) -- Fix: document_renamer fails with audit_log enabled [@shamoon](https://github.com/shamoon) ([#6175](https://github.com/paperless-ngx/paperless-ngx/pull/6175)) -- Fix: catch sessionStorage errors for large documents [@shamoon](https://github.com/shamoon) ([#6150](https://github.com/paperless-ngx/paperless-ngx/pull/6150)) +- Fix: Escape the secret key when writing it to the env file [@stumpylog](https://github.com/stumpylog) ([#6243](https://github.com/paperless-ngx/paperless-ngx/pull/6243)) +- Fix: Hide sidebar labels if group is empty [@shamoon](https://github.com/shamoon) ([#6254](https://github.com/paperless-ngx/paperless-ngx/pull/6254)) +- Fix: management list clear all should clear header checkbox [@shamoon](https://github.com/shamoon) ([#6253](https://github.com/paperless-ngx/paperless-ngx/pull/6253)) +- Fix: start-align object names in some UI lists [@shamoon](https://github.com/shamoon) ([#6188](https://github.com/paperless-ngx/paperless-ngx/pull/6188)) +- Fix: allow scroll long upload files alerts list [@shamoon](https://github.com/shamoon) ([#6184](https://github.com/paperless-ngx/paperless-ngx/pull/6184)) +- Fix: document_renamer fails with audit_log enabled [@shamoon](https://github.com/shamoon) ([#6175](https://github.com/paperless-ngx/paperless-ngx/pull/6175)) +- Fix: catch sessionStorage errors for large documents [@shamoon](https://github.com/shamoon) ([#6150](https://github.com/paperless-ngx/paperless-ngx/pull/6150)) ### Dependencies
9 changes -- Chore(deps): Bump pillow from 10.2.0 to 10.3.0 [@dependabot](https://github.com/dependabot) ([#6268](https://github.com/paperless-ngx/paperless-ngx/pull/6268)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6276](https://github.com/paperless-ngx/paperless-ngx/pull/6276)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates [@dependabot](https://github.com/dependabot) ([#6248](https://github.com/paperless-ngx/paperless-ngx/pull/6248)) -- Chore(deps-dev): Bump [@playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot) ([#6250](https://github.com/paperless-ngx/paperless-ngx/pull/6250)) -- Chore(deps-dev): Bump [@types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot](https://github.com/types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot) ([#6251](https://github.com/paperless-ngx/paperless-ngx/pull/6251)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#6249](https://github.com/paperless-ngx/paperless-ngx/pull/6249)) -- Chore(deps-dev): Bump express from 4.18.3 to 4.19.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#6207](https://github.com/paperless-ngx/paperless-ngx/pull/6207)) -- Chore(deps-dev): Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#6161](https://github.com/paperless-ngx/paperless-ngx/pull/6161)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#6131](https://github.com/paperless-ngx/paperless-ngx/pull/6131)) +- Chore(deps): Bump pillow from 10.2.0 to 10.3.0 [@dependabot](https://github.com/dependabot) ([#6268](https://github.com/paperless-ngx/paperless-ngx/pull/6268)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6276](https://github.com/paperless-ngx/paperless-ngx/pull/6276)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates [@dependabot](https://github.com/dependabot) ([#6248](https://github.com/paperless-ngx/paperless-ngx/pull/6248)) +- Chore(deps-dev): Bump [@playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot) ([#6250](https://github.com/paperless-ngx/paperless-ngx/pull/6250)) +- Chore(deps-dev): Bump [@types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot](https://github.com/types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot) ([#6251](https://github.com/paperless-ngx/paperless-ngx/pull/6251)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#6249](https://github.com/paperless-ngx/paperless-ngx/pull/6249)) +- Chore(deps-dev): Bump express from 4.18.3 to 4.19.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#6207](https://github.com/paperless-ngx/paperless-ngx/pull/6207)) +- Chore(deps-dev): Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#6161](https://github.com/paperless-ngx/paperless-ngx/pull/6161)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#6131](https://github.com/paperless-ngx/paperless-ngx/pull/6131))
### All App Changes @@ -2489,44 +2883,44 @@
20 changes -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6276](https://github.com/paperless-ngx/paperless-ngx/pull/6276)) -- Chore: Standardize subprocess running and logging [@stumpylog](https://github.com/stumpylog) ([#6275](https://github.com/paperless-ngx/paperless-ngx/pull/6275)) -- Change: enable auditlog by default, fix import / export [@shamoon](https://github.com/shamoon) ([#6267](https://github.com/paperless-ngx/paperless-ngx/pull/6267)) -- Fix: Hide sidebar labels if group is empty [@shamoon](https://github.com/shamoon) ([#6254](https://github.com/paperless-ngx/paperless-ngx/pull/6254)) -- Fix: management list clear all should clear header checkbox [@shamoon](https://github.com/shamoon) ([#6253](https://github.com/paperless-ngx/paperless-ngx/pull/6253)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates [@dependabot](https://github.com/dependabot) ([#6248](https://github.com/paperless-ngx/paperless-ngx/pull/6248)) -- Chore(deps-dev): Bump [@playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot) ([#6250](https://github.com/paperless-ngx/paperless-ngx/pull/6250)) -- Chore(deps-dev): Bump [@types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot](https://github.com/types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot) ([#6251](https://github.com/paperless-ngx/paperless-ngx/pull/6251)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#6249](https://github.com/paperless-ngx/paperless-ngx/pull/6249)) -- Enhancement: support custom fields in post_document endpoint [@shamoon](https://github.com/shamoon) ([#6222](https://github.com/paperless-ngx/paperless-ngx/pull/6222)) -- Enhancement: add ASN to consume rejection message [@eliasp](https://github.com/eliasp) ([#6217](https://github.com/paperless-ngx/paperless-ngx/pull/6217)) -- Chore(deps-dev): Bump express from 4.18.3 to 4.19.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#6207](https://github.com/paperless-ngx/paperless-ngx/pull/6207)) -- Feature: PDF actions - merge, split \& rotate [@shamoon](https://github.com/shamoon) ([#6094](https://github.com/paperless-ngx/paperless-ngx/pull/6094)) -- Fix: start-align object names in some UI lists [@shamoon](https://github.com/shamoon) ([#6188](https://github.com/paperless-ngx/paperless-ngx/pull/6188)) -- Fix: allow scroll long upload files alerts list [@shamoon](https://github.com/shamoon) ([#6184](https://github.com/paperless-ngx/paperless-ngx/pull/6184)) -- Fix: document_renamer fails with audit_log enabled [@shamoon](https://github.com/shamoon) ([#6175](https://github.com/paperless-ngx/paperless-ngx/pull/6175)) -- Chore(deps-dev): Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#6161](https://github.com/paperless-ngx/paperless-ngx/pull/6161)) -- Enhancement: always place search term first in autocomplete results [@shamoon](https://github.com/shamoon) ([#6142](https://github.com/paperless-ngx/paperless-ngx/pull/6142)) -- Fix: catch sessionStorage errors for large documents [@shamoon](https://github.com/shamoon) ([#6150](https://github.com/paperless-ngx/paperless-ngx/pull/6150)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#6131](https://github.com/paperless-ngx/paperless-ngx/pull/6131)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#6276](https://github.com/paperless-ngx/paperless-ngx/pull/6276)) +- Chore: Standardize subprocess running and logging [@stumpylog](https://github.com/stumpylog) ([#6275](https://github.com/paperless-ngx/paperless-ngx/pull/6275)) +- Change: enable auditlog by default, fix import / export [@shamoon](https://github.com/shamoon) ([#6267](https://github.com/paperless-ngx/paperless-ngx/pull/6267)) +- Fix: Hide sidebar labels if group is empty [@shamoon](https://github.com/shamoon) ([#6254](https://github.com/paperless-ngx/paperless-ngx/pull/6254)) +- Fix: management list clear all should clear header checkbox [@shamoon](https://github.com/shamoon) ([#6253](https://github.com/paperless-ngx/paperless-ngx/pull/6253)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 17 updates [@dependabot](https://github.com/dependabot) ([#6248](https://github.com/paperless-ngx/paperless-ngx/pull/6248)) +- Chore(deps-dev): Bump [@playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.42.0 to 1.42.1 in /src-ui @dependabot) ([#6250](https://github.com/paperless-ngx/paperless-ngx/pull/6250)) +- Chore(deps-dev): Bump [@types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot](https://github.com/types/node from 20.11.24 to 20.12.2 in /src-ui @dependabot) ([#6251](https://github.com/paperless-ngx/paperless-ngx/pull/6251)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#6249](https://github.com/paperless-ngx/paperless-ngx/pull/6249)) +- Enhancement: support custom fields in post_document endpoint [@shamoon](https://github.com/shamoon) ([#6222](https://github.com/paperless-ngx/paperless-ngx/pull/6222)) +- Enhancement: add ASN to consume rejection message [@eliasp](https://github.com/eliasp) ([#6217](https://github.com/paperless-ngx/paperless-ngx/pull/6217)) +- Chore(deps-dev): Bump express from 4.18.3 to 4.19.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#6207](https://github.com/paperless-ngx/paperless-ngx/pull/6207)) +- Feature: PDF actions - merge, split \& rotate [@shamoon](https://github.com/shamoon) ([#6094](https://github.com/paperless-ngx/paperless-ngx/pull/6094)) +- Fix: start-align object names in some UI lists [@shamoon](https://github.com/shamoon) ([#6188](https://github.com/paperless-ngx/paperless-ngx/pull/6188)) +- Fix: allow scroll long upload files alerts list [@shamoon](https://github.com/shamoon) ([#6184](https://github.com/paperless-ngx/paperless-ngx/pull/6184)) +- Fix: document_renamer fails with audit_log enabled [@shamoon](https://github.com/shamoon) ([#6175](https://github.com/paperless-ngx/paperless-ngx/pull/6175)) +- Chore(deps-dev): Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#6161](https://github.com/paperless-ngx/paperless-ngx/pull/6161)) +- Enhancement: always place search term first in autocomplete results [@shamoon](https://github.com/shamoon) ([#6142](https://github.com/paperless-ngx/paperless-ngx/pull/6142)) +- Fix: catch sessionStorage errors for large documents [@shamoon](https://github.com/shamoon) ([#6150](https://github.com/paperless-ngx/paperless-ngx/pull/6150)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#6131](https://github.com/paperless-ngx/paperless-ngx/pull/6131))
## paperless-ngx 2.6.3 ### Bug Fixes -- Fix: allow setting allauth [@shamoon](https://github.com/shamoon) ([#6105](https://github.com/paperless-ngx/paperless-ngx/pull/6105)) -- Change: dont require empty bulk edit parameters [@shamoon](https://github.com/shamoon) ([#6059](https://github.com/paperless-ngx/paperless-ngx/pull/6059)) +- Fix: allow setting allauth [@shamoon](https://github.com/shamoon) ([#6105](https://github.com/paperless-ngx/paperless-ngx/pull/6105)) +- Change: dont require empty bulk edit parameters [@shamoon](https://github.com/shamoon) ([#6059](https://github.com/paperless-ngx/paperless-ngx/pull/6059)) ### Dependencies
4 changes -- Chore(deps-dev): Bump follow-redirects from 1.15.5 to 1.15.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#6120](https://github.com/paperless-ngx/paperless-ngx/pull/6120)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6079](https://github.com/paperless-ngx/paperless-ngx/pull/6079)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6080](https://github.com/paperless-ngx/paperless-ngx/pull/6080)) -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#6081](https://github.com/paperless-ngx/paperless-ngx/pull/6081)) +- Chore(deps-dev): Bump follow-redirects from 1.15.5 to 1.15.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#6120](https://github.com/paperless-ngx/paperless-ngx/pull/6120)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6079](https://github.com/paperless-ngx/paperless-ngx/pull/6079)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6080](https://github.com/paperless-ngx/paperless-ngx/pull/6080)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#6081](https://github.com/paperless-ngx/paperless-ngx/pull/6081))
### All App Changes @@ -2534,94 +2928,94 @@
8 changes -- Chore(deps-dev): Bump follow-redirects from 1.15.5 to 1.15.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#6120](https://github.com/paperless-ngx/paperless-ngx/pull/6120)) -- Fix: allow setting allauth [@shamoon](https://github.com/shamoon) ([#6105](https://github.com/paperless-ngx/paperless-ngx/pull/6105)) -- Change: remove credentials from redis url in system status [@shamoon](https://github.com/shamoon) ([#6104](https://github.com/paperless-ngx/paperless-ngx/pull/6104)) -- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6079](https://github.com/paperless-ngx/paperless-ngx/pull/6079)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6080](https://github.com/paperless-ngx/paperless-ngx/pull/6080)) -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#6081](https://github.com/paperless-ngx/paperless-ngx/pull/6081)) -- Change: dont require empty bulk edit parameters [@shamoon](https://github.com/shamoon) ([#6059](https://github.com/paperless-ngx/paperless-ngx/pull/6059)) -- Fix: missing translation string [@DimitriDR](https://github.com/DimitriDR) ([#6054](https://github.com/paperless-ngx/paperless-ngx/pull/6054)) +- Chore(deps-dev): Bump follow-redirects from 1.15.5 to 1.15.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#6120](https://github.com/paperless-ngx/paperless-ngx/pull/6120)) +- Fix: allow setting allauth [@shamoon](https://github.com/shamoon) ([#6105](https://github.com/paperless-ngx/paperless-ngx/pull/6105)) +- Change: remove credentials from redis url in system status [@shamoon](https://github.com/shamoon) ([#6104](https://github.com/paperless-ngx/paperless-ngx/pull/6104)) +- Chore(deps-dev): Bump the development group with 3 updates [@dependabot](https://github.com/dependabot) ([#6079](https://github.com/paperless-ngx/paperless-ngx/pull/6079)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6080](https://github.com/paperless-ngx/paperless-ngx/pull/6080)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#6081](https://github.com/paperless-ngx/paperless-ngx/pull/6081)) +- Change: dont require empty bulk edit parameters [@shamoon](https://github.com/shamoon) ([#6059](https://github.com/paperless-ngx/paperless-ngx/pull/6059)) +- Fix: missing translation string [@DimitriDR](https://github.com/DimitriDR) ([#6054](https://github.com/paperless-ngx/paperless-ngx/pull/6054))
## paperless-ngx 2.6.2 ### Features -- Enhancement: move and rename files when storage paths deleted, update file handling docs [@shamoon](https://github.com/shamoon) ([#6033](https://github.com/paperless-ngx/paperless-ngx/pull/6033)) -- Enhancement: better detection of default currency code [@shamoon](https://github.com/shamoon) ([#6020](https://github.com/paperless-ngx/paperless-ngx/pull/6020)) +- Enhancement: move and rename files when storage paths deleted, update file handling docs [@shamoon](https://github.com/shamoon) ([#6033](https://github.com/paperless-ngx/paperless-ngx/pull/6033)) +- Enhancement: better detection of default currency code [@shamoon](https://github.com/shamoon) ([#6020](https://github.com/paperless-ngx/paperless-ngx/pull/6020)) ### Bug Fixes -- Fix: make document counts in object lists permissions-aware [@shamoon](https://github.com/shamoon) ([#6019](https://github.com/paperless-ngx/paperless-ngx/pull/6019)) +- Fix: make document counts in object lists permissions-aware [@shamoon](https://github.com/shamoon) ([#6019](https://github.com/paperless-ngx/paperless-ngx/pull/6019)) ### All App Changes
3 changes -- Enhancement: move and rename files when storage paths deleted, update file handling docs [@shamoon](https://github.com/shamoon) ([#6033](https://github.com/paperless-ngx/paperless-ngx/pull/6033)) -- Fix: make document counts in object lists permissions-aware [@shamoon](https://github.com/shamoon) ([#6019](https://github.com/paperless-ngx/paperless-ngx/pull/6019)) -- Enhancement: better detection of default currency code [@shamoon](https://github.com/shamoon) ([#6020](https://github.com/paperless-ngx/paperless-ngx/pull/6020)) +- Enhancement: move and rename files when storage paths deleted, update file handling docs [@shamoon](https://github.com/shamoon) ([#6033](https://github.com/paperless-ngx/paperless-ngx/pull/6033)) +- Fix: make document counts in object lists permissions-aware [@shamoon](https://github.com/shamoon) ([#6019](https://github.com/paperless-ngx/paperless-ngx/pull/6019)) +- Enhancement: better detection of default currency code [@shamoon](https://github.com/shamoon) ([#6020](https://github.com/paperless-ngx/paperless-ngx/pull/6020))
## paperless-ngx 2.6.1 ### All App Changes -- Change: tweaks to system status [@shamoon](https://github.com/shamoon) ([#6008](https://github.com/paperless-ngx/paperless-ngx/pull/6008)) +- Change: tweaks to system status [@shamoon](https://github.com/shamoon) ([#6008](https://github.com/paperless-ngx/paperless-ngx/pull/6008)) ## paperless-ngx 2.6.0 ### Features -- Feature: Allow user to control PIL image pixel limit [@stumpylog](https://github.com/stumpylog) ([#5997](https://github.com/paperless-ngx/paperless-ngx/pull/5997)) -- Feature: Allow a user to disable the pixel limit for OCR entirely [@stumpylog](https://github.com/stumpylog) ([#5996](https://github.com/paperless-ngx/paperless-ngx/pull/5996)) -- Feature: workflow removal action [@shamoon](https://github.com/shamoon) ([#5928](https://github.com/paperless-ngx/paperless-ngx/pull/5928)) -- Feature: system status [@shamoon](https://github.com/shamoon) ([#5743](https://github.com/paperless-ngx/paperless-ngx/pull/5743)) -- Enhancement: better monetary field with currency code [@shamoon](https://github.com/shamoon) ([#5858](https://github.com/paperless-ngx/paperless-ngx/pull/5858)) -- Enhancement: support disabling regular login [@shamoon](https://github.com/shamoon) ([#5816](https://github.com/paperless-ngx/paperless-ngx/pull/5816)) +- Feature: Allow user to control PIL image pixel limit [@stumpylog](https://github.com/stumpylog) ([#5997](https://github.com/paperless-ngx/paperless-ngx/pull/5997)) +- Feature: Allow a user to disable the pixel limit for OCR entirely [@stumpylog](https://github.com/stumpylog) ([#5996](https://github.com/paperless-ngx/paperless-ngx/pull/5996)) +- Feature: workflow removal action [@shamoon](https://github.com/shamoon) ([#5928](https://github.com/paperless-ngx/paperless-ngx/pull/5928)) +- Feature: system status [@shamoon](https://github.com/shamoon) ([#5743](https://github.com/paperless-ngx/paperless-ngx/pull/5743)) +- Enhancement: better monetary field with currency code [@shamoon](https://github.com/shamoon) ([#5858](https://github.com/paperless-ngx/paperless-ngx/pull/5858)) +- Enhancement: support disabling regular login [@shamoon](https://github.com/shamoon) ([#5816](https://github.com/paperless-ngx/paperless-ngx/pull/5816)) ### Bug Fixes -- Fix: refactor base path settings, correct logout redirect [@shamoon](https://github.com/shamoon) ([#5976](https://github.com/paperless-ngx/paperless-ngx/pull/5976)) -- Fix: always pass from UI, dont require in API [@shamoon](https://github.com/shamoon) ([#5962](https://github.com/paperless-ngx/paperless-ngx/pull/5962)) -- Fix: Clear metadata cache when the filename(s) change [@stumpylog](https://github.com/stumpylog) ([#5957](https://github.com/paperless-ngx/paperless-ngx/pull/5957)) -- Fix: include monetary, float and doc link values in search filters [@shamoon](https://github.com/shamoon) ([#5951](https://github.com/paperless-ngx/paperless-ngx/pull/5951)) -- Fix: Better handling of a corrupted index [@stumpylog](https://github.com/stumpylog) ([#5950](https://github.com/paperless-ngx/paperless-ngx/pull/5950)) -- Fix: Don't assume the location of scratch directory in Docker [@stumpylog](https://github.com/stumpylog) ([#5948](https://github.com/paperless-ngx/paperless-ngx/pull/5948)) -- Fix: ensure document title always limited to 128 chars [@shamoon](https://github.com/shamoon) ([#5934](https://github.com/paperless-ngx/paperless-ngx/pull/5934)) -- Fix: use for password reset emails, if set [@shamoon](https://github.com/shamoon) ([#5902](https://github.com/paperless-ngx/paperless-ngx/pull/5902)) -- Fix: Correct docker compose check in install script [@ShanSanear](https://github.com/ShanSanear) ([#5917](https://github.com/paperless-ngx/paperless-ngx/pull/5917)) -- Fix: respect global permissions for UI settings [@shamoon](https://github.com/shamoon) ([#5919](https://github.com/paperless-ngx/paperless-ngx/pull/5919)) -- Fix: allow disable email verification during signup [@shamoon](https://github.com/shamoon) ([#5895](https://github.com/paperless-ngx/paperless-ngx/pull/5895)) -- Fix: refactor accounts templates and create signup template [@shamoon](https://github.com/shamoon) ([#5899](https://github.com/paperless-ngx/paperless-ngx/pull/5899)) +- Fix: refactor base path settings, correct logout redirect [@shamoon](https://github.com/shamoon) ([#5976](https://github.com/paperless-ngx/paperless-ngx/pull/5976)) +- Fix: always pass from UI, dont require in API [@shamoon](https://github.com/shamoon) ([#5962](https://github.com/paperless-ngx/paperless-ngx/pull/5962)) +- Fix: Clear metadata cache when the filename(s) change [@stumpylog](https://github.com/stumpylog) ([#5957](https://github.com/paperless-ngx/paperless-ngx/pull/5957)) +- Fix: include monetary, float and doc link values in search filters [@shamoon](https://github.com/shamoon) ([#5951](https://github.com/paperless-ngx/paperless-ngx/pull/5951)) +- Fix: Better handling of a corrupted index [@stumpylog](https://github.com/stumpylog) ([#5950](https://github.com/paperless-ngx/paperless-ngx/pull/5950)) +- Fix: Don't assume the location of scratch directory in Docker [@stumpylog](https://github.com/stumpylog) ([#5948](https://github.com/paperless-ngx/paperless-ngx/pull/5948)) +- Fix: ensure document title always limited to 128 chars [@shamoon](https://github.com/shamoon) ([#5934](https://github.com/paperless-ngx/paperless-ngx/pull/5934)) +- Fix: use for password reset emails, if set [@shamoon](https://github.com/shamoon) ([#5902](https://github.com/paperless-ngx/paperless-ngx/pull/5902)) +- Fix: Correct docker compose check in install script [@ShanSanear](https://github.com/ShanSanear) ([#5917](https://github.com/paperless-ngx/paperless-ngx/pull/5917)) +- Fix: respect global permissions for UI settings [@shamoon](https://github.com/shamoon) ([#5919](https://github.com/paperless-ngx/paperless-ngx/pull/5919)) +- Fix: allow disable email verification during signup [@shamoon](https://github.com/shamoon) ([#5895](https://github.com/paperless-ngx/paperless-ngx/pull/5895)) +- Fix: refactor accounts templates and create signup template [@shamoon](https://github.com/shamoon) ([#5899](https://github.com/paperless-ngx/paperless-ngx/pull/5899)) ### Maintenance -- Chore(deps): Bump the actions group with 3 updates [@dependabot](https://github.com/dependabot) ([#5907](https://github.com/paperless-ngx/paperless-ngx/pull/5907)) -- Chore: Ignores uvicorn updates in dependabot [@stumpylog](https://github.com/stumpylog) ([#5906](https://github.com/paperless-ngx/paperless-ngx/pull/5906)) +- Chore(deps): Bump the actions group with 3 updates [@dependabot](https://github.com/dependabot) ([#5907](https://github.com/paperless-ngx/paperless-ngx/pull/5907)) +- Chore: Ignores uvicorn updates in dependabot [@stumpylog](https://github.com/stumpylog) ([#5906](https://github.com/paperless-ngx/paperless-ngx/pull/5906)) ### Dependencies
15 changes -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6001](https://github.com/paperless-ngx/paperless-ngx/pull/6001)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5998](https://github.com/paperless-ngx/paperless-ngx/pull/5998)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6000](https://github.com/paperless-ngx/paperless-ngx/pull/6000)) -- Chore(deps-dev): Bump [@playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot) ([#5964](https://github.com/paperless-ngx/paperless-ngx/pull/5964)) -- Chore(deps-dev): Bump [@types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot](https://github.com/types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot) ([#5965](https://github.com/paperless-ngx/paperless-ngx/pull/5965)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@dependabot](https://github.com/dependabot) ([#5963](https://github.com/paperless-ngx/paperless-ngx/pull/5963)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5918](https://github.com/paperless-ngx/paperless-ngx/pull/5918)) -- Chore(deps-dev): Bump [@types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot](https://github.com/types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot) ([#5912](https://github.com/paperless-ngx/paperless-ngx/pull/5912)) -- Chore(deps): Bump zone.js from 0.14.3 to 0.14.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#5913](https://github.com/paperless-ngx/paperless-ngx/pull/5913)) -- Chore(deps): Bump bootstrap from 5.3.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5911](https://github.com/paperless-ngx/paperless-ngx/pull/5911)) -- Chore(deps-dev): Bump typescript from 5.2.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5915](https://github.com/paperless-ngx/paperless-ngx/pull/5915)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 15 updates [@dependabot](https://github.com/dependabot) ([#5908](https://github.com/paperless-ngx/paperless-ngx/pull/5908)) -- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#5916](https://github.com/paperless-ngx/paperless-ngx/pull/5916)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#5914](https://github.com/paperless-ngx/paperless-ngx/pull/5914)) -- Chore(deps): Bump the actions group with 3 updates [@dependabot](https://github.com/dependabot) ([#5907](https://github.com/paperless-ngx/paperless-ngx/pull/5907)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6001](https://github.com/paperless-ngx/paperless-ngx/pull/6001)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5998](https://github.com/paperless-ngx/paperless-ngx/pull/5998)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6000](https://github.com/paperless-ngx/paperless-ngx/pull/6000)) +- Chore(deps-dev): Bump [@playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot) ([#5964](https://github.com/paperless-ngx/paperless-ngx/pull/5964)) +- Chore(deps-dev): Bump [@types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot](https://github.com/types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot) ([#5965](https://github.com/paperless-ngx/paperless-ngx/pull/5965)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@dependabot](https://github.com/dependabot) ([#5963](https://github.com/paperless-ngx/paperless-ngx/pull/5963)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5918](https://github.com/paperless-ngx/paperless-ngx/pull/5918)) +- Chore(deps-dev): Bump [@types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot](https://github.com/types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot) ([#5912](https://github.com/paperless-ngx/paperless-ngx/pull/5912)) +- Chore(deps): Bump zone.js from 0.14.3 to 0.14.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#5913](https://github.com/paperless-ngx/paperless-ngx/pull/5913)) +- Chore(deps): Bump bootstrap from 5.3.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5911](https://github.com/paperless-ngx/paperless-ngx/pull/5911)) +- Chore(deps-dev): Bump typescript from 5.2.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5915](https://github.com/paperless-ngx/paperless-ngx/pull/5915)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 15 updates [@dependabot](https://github.com/dependabot) ([#5908](https://github.com/paperless-ngx/paperless-ngx/pull/5908)) +- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#5916](https://github.com/paperless-ngx/paperless-ngx/pull/5916)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#5914](https://github.com/paperless-ngx/paperless-ngx/pull/5914)) +- Chore(deps): Bump the actions group with 3 updates [@dependabot](https://github.com/dependabot) ([#5907](https://github.com/paperless-ngx/paperless-ngx/pull/5907))
### All App Changes @@ -2629,194 +3023,194 @@
33 changes -- Feature: Allow user to control PIL image pixel limit [@stumpylog](https://github.com/stumpylog) ([#5997](https://github.com/paperless-ngx/paperless-ngx/pull/5997)) -- Enhancement: show ID when editing objects [@shamoon](https://github.com/shamoon) ([#6003](https://github.com/paperless-ngx/paperless-ngx/pull/6003)) -- Feature: Allow a user to disable the pixel limit for OCR entirely [@stumpylog](https://github.com/stumpylog) ([#5996](https://github.com/paperless-ngx/paperless-ngx/pull/5996)) -- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6001](https://github.com/paperless-ngx/paperless-ngx/pull/6001)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5998](https://github.com/paperless-ngx/paperless-ngx/pull/5998)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6000](https://github.com/paperless-ngx/paperless-ngx/pull/6000)) -- Feature: workflow removal action [@shamoon](https://github.com/shamoon) ([#5928](https://github.com/paperless-ngx/paperless-ngx/pull/5928)) -- Feature: system status [@shamoon](https://github.com/shamoon) ([#5743](https://github.com/paperless-ngx/paperless-ngx/pull/5743)) -- Fix: refactor base path settings, correct logout redirect [@shamoon](https://github.com/shamoon) ([#5976](https://github.com/paperless-ngx/paperless-ngx/pull/5976)) -- Chore(deps-dev): Bump [@playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot) ([#5964](https://github.com/paperless-ngx/paperless-ngx/pull/5964)) -- Chore(deps-dev): Bump [@types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot](https://github.com/types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot) ([#5965](https://github.com/paperless-ngx/paperless-ngx/pull/5965)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@dependabot](https://github.com/dependabot) ([#5963](https://github.com/paperless-ngx/paperless-ngx/pull/5963)) -- Fix: always pass from UI, dont require in API [@shamoon](https://github.com/shamoon) ([#5962](https://github.com/paperless-ngx/paperless-ngx/pull/5962)) -- Fix: Clear metadata cache when the filename(s) change [@stumpylog](https://github.com/stumpylog) ([#5957](https://github.com/paperless-ngx/paperless-ngx/pull/5957)) -- Fix: include monetary, float and doc link values in search filters [@shamoon](https://github.com/shamoon) ([#5951](https://github.com/paperless-ngx/paperless-ngx/pull/5951)) -- Fix: Better handling of a corrupted index [@stumpylog](https://github.com/stumpylog) ([#5950](https://github.com/paperless-ngx/paperless-ngx/pull/5950)) -- Chore: Includes OCRMyPdf logging into the log file [@stumpylog](https://github.com/stumpylog) ([#5947](https://github.com/paperless-ngx/paperless-ngx/pull/5947)) -- Fix: ensure document title always limited to 128 chars [@shamoon](https://github.com/shamoon) ([#5934](https://github.com/paperless-ngx/paperless-ngx/pull/5934)) -- Enhancement: better monetary field with currency code [@shamoon](https://github.com/shamoon) ([#5858](https://github.com/paperless-ngx/paperless-ngx/pull/5858)) -- Change: add Thumbs.db to default ignores [@DennisGaida](https://github.com/DennisGaida) ([#5924](https://github.com/paperless-ngx/paperless-ngx/pull/5924)) -- Fix: use for password reset emails, if set [@shamoon](https://github.com/shamoon) ([#5902](https://github.com/paperless-ngx/paperless-ngx/pull/5902)) -- Fix: respect global permissions for UI settings [@shamoon](https://github.com/shamoon) ([#5919](https://github.com/paperless-ngx/paperless-ngx/pull/5919)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5918](https://github.com/paperless-ngx/paperless-ngx/pull/5918)) -- Chore(deps-dev): Bump [@types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot](https://github.com/types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot) ([#5912](https://github.com/paperless-ngx/paperless-ngx/pull/5912)) -- Chore(deps): Bump zone.js from 0.14.3 to 0.14.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#5913](https://github.com/paperless-ngx/paperless-ngx/pull/5913)) -- Chore(deps): Bump bootstrap from 5.3.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5911](https://github.com/paperless-ngx/paperless-ngx/pull/5911)) -- Chore(deps-dev): Bump typescript from 5.2.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5915](https://github.com/paperless-ngx/paperless-ngx/pull/5915)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 15 updates [@dependabot](https://github.com/dependabot) ([#5908](https://github.com/paperless-ngx/paperless-ngx/pull/5908)) -- Fix: allow disable email verification during signup [@shamoon](https://github.com/shamoon) ([#5895](https://github.com/paperless-ngx/paperless-ngx/pull/5895)) -- Fix: refactor accounts templates and create signup template [@shamoon](https://github.com/shamoon) ([#5899](https://github.com/paperless-ngx/paperless-ngx/pull/5899)) -- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#5916](https://github.com/paperless-ngx/paperless-ngx/pull/5916)) -- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#5914](https://github.com/paperless-ngx/paperless-ngx/pull/5914)) -- Enhancement: support disabling regular login [@shamoon](https://github.com/shamoon) ([#5816](https://github.com/paperless-ngx/paperless-ngx/pull/5816)) +- Feature: Allow user to control PIL image pixel limit [@stumpylog](https://github.com/stumpylog) ([#5997](https://github.com/paperless-ngx/paperless-ngx/pull/5997)) +- Enhancement: show ID when editing objects [@shamoon](https://github.com/shamoon) ([#6003](https://github.com/paperless-ngx/paperless-ngx/pull/6003)) +- Feature: Allow a user to disable the pixel limit for OCR entirely [@stumpylog](https://github.com/stumpylog) ([#5996](https://github.com/paperless-ngx/paperless-ngx/pull/5996)) +- Chore(deps): Bump the small-changes group with 3 updates [@dependabot](https://github.com/dependabot) ([#6001](https://github.com/paperless-ngx/paperless-ngx/pull/6001)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5998](https://github.com/paperless-ngx/paperless-ngx/pull/5998)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#6000](https://github.com/paperless-ngx/paperless-ngx/pull/6000)) +- Feature: workflow removal action [@shamoon](https://github.com/shamoon) ([#5928](https://github.com/paperless-ngx/paperless-ngx/pull/5928)) +- Feature: system status [@shamoon](https://github.com/shamoon) ([#5743](https://github.com/paperless-ngx/paperless-ngx/pull/5743)) +- Fix: refactor base path settings, correct logout redirect [@shamoon](https://github.com/shamoon) ([#5976](https://github.com/paperless-ngx/paperless-ngx/pull/5976)) +- Chore(deps-dev): Bump [@playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.41.2 to 1.42.0 in /src-ui @dependabot) ([#5964](https://github.com/paperless-ngx/paperless-ngx/pull/5964)) +- Chore(deps-dev): Bump [@types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot](https://github.com/types/node from 20.11.20 to 20.11.24 in /src-ui @dependabot) ([#5965](https://github.com/paperless-ngx/paperless-ngx/pull/5965)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@dependabot](https://github.com/dependabot) ([#5963](https://github.com/paperless-ngx/paperless-ngx/pull/5963)) +- Fix: always pass from UI, dont require in API [@shamoon](https://github.com/shamoon) ([#5962](https://github.com/paperless-ngx/paperless-ngx/pull/5962)) +- Fix: Clear metadata cache when the filename(s) change [@stumpylog](https://github.com/stumpylog) ([#5957](https://github.com/paperless-ngx/paperless-ngx/pull/5957)) +- Fix: include monetary, float and doc link values in search filters [@shamoon](https://github.com/shamoon) ([#5951](https://github.com/paperless-ngx/paperless-ngx/pull/5951)) +- Fix: Better handling of a corrupted index [@stumpylog](https://github.com/stumpylog) ([#5950](https://github.com/paperless-ngx/paperless-ngx/pull/5950)) +- Chore: Includes OCRMyPdf logging into the log file [@stumpylog](https://github.com/stumpylog) ([#5947](https://github.com/paperless-ngx/paperless-ngx/pull/5947)) +- Fix: ensure document title always limited to 128 chars [@shamoon](https://github.com/shamoon) ([#5934](https://github.com/paperless-ngx/paperless-ngx/pull/5934)) +- Enhancement: better monetary field with currency code [@shamoon](https://github.com/shamoon) ([#5858](https://github.com/paperless-ngx/paperless-ngx/pull/5858)) +- Change: add Thumbs.db to default ignores [@DennisGaida](https://github.com/DennisGaida) ([#5924](https://github.com/paperless-ngx/paperless-ngx/pull/5924)) +- Fix: use for password reset emails, if set [@shamoon](https://github.com/shamoon) ([#5902](https://github.com/paperless-ngx/paperless-ngx/pull/5902)) +- Fix: respect global permissions for UI settings [@shamoon](https://github.com/shamoon) ([#5919](https://github.com/paperless-ngx/paperless-ngx/pull/5919)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5918](https://github.com/paperless-ngx/paperless-ngx/pull/5918)) +- Chore(deps-dev): Bump [@types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot](https://github.com/types/node from 20.11.16 to 20.11.20 in /src-ui @dependabot) ([#5912](https://github.com/paperless-ngx/paperless-ngx/pull/5912)) +- Chore(deps): Bump zone.js from 0.14.3 to 0.14.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#5913](https://github.com/paperless-ngx/paperless-ngx/pull/5913)) +- Chore(deps): Bump bootstrap from 5.3.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5911](https://github.com/paperless-ngx/paperless-ngx/pull/5911)) +- Chore(deps-dev): Bump typescript from 5.2.2 to 5.3.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5915](https://github.com/paperless-ngx/paperless-ngx/pull/5915)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 15 updates [@dependabot](https://github.com/dependabot) ([#5908](https://github.com/paperless-ngx/paperless-ngx/pull/5908)) +- Fix: allow disable email verification during signup [@shamoon](https://github.com/shamoon) ([#5895](https://github.com/paperless-ngx/paperless-ngx/pull/5895)) +- Fix: refactor accounts templates and create signup template [@shamoon](https://github.com/shamoon) ([#5899](https://github.com/paperless-ngx/paperless-ngx/pull/5899)) +- Chore(deps): Bump the small-changes group with 4 updates [@dependabot](https://github.com/dependabot) ([#5916](https://github.com/paperless-ngx/paperless-ngx/pull/5916)) +- Chore(deps-dev): Bump the development group with 4 updates [@dependabot](https://github.com/dependabot) ([#5914](https://github.com/paperless-ngx/paperless-ngx/pull/5914)) +- Enhancement: support disabling regular login [@shamoon](https://github.com/shamoon) ([#5816](https://github.com/paperless-ngx/paperless-ngx/pull/5816))
## paperless-ngx 2.5.4 ### Bug Fixes -- Fix: handle title placeholder for docs without original_filename [@shamoon](https://github.com/shamoon) ([#5828](https://github.com/paperless-ngx/paperless-ngx/pull/5828)) -- Fix: bulk edit objects does not respect global permissions [@shamoon](https://github.com/shamoon) ([#5888](https://github.com/paperless-ngx/paperless-ngx/pull/5888)) -- Fix: intermittent save \& close warnings [@shamoon](https://github.com/shamoon) ([#5838](https://github.com/paperless-ngx/paperless-ngx/pull/5838)) -- Fix: inotify read timeout not in ms [@grembo](https://github.com/grembo) ([#5876](https://github.com/paperless-ngx/paperless-ngx/pull/5876)) -- Fix: allow relative date queries not in quick list [@shamoon](https://github.com/shamoon) ([#5801](https://github.com/paperless-ngx/paperless-ngx/pull/5801)) -- Fix: pass rule id to consumed .eml files [@shamoon](https://github.com/shamoon) ([#5800](https://github.com/paperless-ngx/paperless-ngx/pull/5800)) +- Fix: handle title placeholder for docs without original_filename [@shamoon](https://github.com/shamoon) ([#5828](https://github.com/paperless-ngx/paperless-ngx/pull/5828)) +- Fix: bulk edit objects does not respect global permissions [@shamoon](https://github.com/shamoon) ([#5888](https://github.com/paperless-ngx/paperless-ngx/pull/5888)) +- Fix: intermittent save \& close warnings [@shamoon](https://github.com/shamoon) ([#5838](https://github.com/paperless-ngx/paperless-ngx/pull/5838)) +- Fix: inotify read timeout not in ms [@grembo](https://github.com/grembo) ([#5876](https://github.com/paperless-ngx/paperless-ngx/pull/5876)) +- Fix: allow relative date queries not in quick list [@shamoon](https://github.com/shamoon) ([#5801](https://github.com/paperless-ngx/paperless-ngx/pull/5801)) +- Fix: pass rule id to consumed .eml files [@shamoon](https://github.com/shamoon) ([#5800](https://github.com/paperless-ngx/paperless-ngx/pull/5800)) ### Dependencies -- Chore(deps): Bump cryptography from 42.0.2 to 42.0.4 [@dependabot](https://github.com/dependabot) ([#5851](https://github.com/paperless-ngx/paperless-ngx/pull/5851)) -- Chore(deps-dev): Bump ip from 2.0.0 to 2.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#5835](https://github.com/paperless-ngx/paperless-ngx/pull/5835)) -- Chore(deps): Bump undici and [@angular-devkit/build-angular in /src-ui @dependabot](https://github.com/angular-devkit/build-angular in /src-ui @dependabot) ([#5796](https://github.com/paperless-ngx/paperless-ngx/pull/5796)) +- Chore(deps): Bump cryptography from 42.0.2 to 42.0.4 [@dependabot](https://github.com/dependabot) ([#5851](https://github.com/paperless-ngx/paperless-ngx/pull/5851)) +- Chore(deps-dev): Bump ip from 2.0.0 to 2.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#5835](https://github.com/paperless-ngx/paperless-ngx/pull/5835)) +- Chore(deps): Bump undici and [@angular-devkit/build-angular in /src-ui @dependabot](https://github.com/angular-devkit/build-angular in /src-ui @dependabot) ([#5796](https://github.com/paperless-ngx/paperless-ngx/pull/5796)) ### All App Changes
8 changes -- Fix: handle title placeholder for docs without original_filename [@shamoon](https://github.com/shamoon) ([#5828](https://github.com/paperless-ngx/paperless-ngx/pull/5828)) -- Fix: bulk edit objects does not respect global permissions [@shamoon](https://github.com/shamoon) ([#5888](https://github.com/paperless-ngx/paperless-ngx/pull/5888)) -- Fix: intermittent save \& close warnings [@shamoon](https://github.com/shamoon) ([#5838](https://github.com/paperless-ngx/paperless-ngx/pull/5838)) -- Fix: inotify read timeout not in ms [@grembo](https://github.com/grembo) ([#5876](https://github.com/paperless-ngx/paperless-ngx/pull/5876)) -- Chore(deps-dev): Bump ip from 2.0.0 to 2.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#5835](https://github.com/paperless-ngx/paperless-ngx/pull/5835)) -- Chore(deps): Bump undici and [@angular-devkit/build-angular in /src-ui @dependabot](https://github.com/angular-devkit/build-angular in /src-ui @dependabot) ([#5796](https://github.com/paperless-ngx/paperless-ngx/pull/5796)) -- Fix: allow relative date queries not in quick list [@shamoon](https://github.com/shamoon) ([#5801](https://github.com/paperless-ngx/paperless-ngx/pull/5801)) -- Fix: pass rule id to consumed .eml files [@shamoon](https://github.com/shamoon) ([#5800](https://github.com/paperless-ngx/paperless-ngx/pull/5800)) +- Fix: handle title placeholder for docs without original_filename [@shamoon](https://github.com/shamoon) ([#5828](https://github.com/paperless-ngx/paperless-ngx/pull/5828)) +- Fix: bulk edit objects does not respect global permissions [@shamoon](https://github.com/shamoon) ([#5888](https://github.com/paperless-ngx/paperless-ngx/pull/5888)) +- Fix: intermittent save \& close warnings [@shamoon](https://github.com/shamoon) ([#5838](https://github.com/paperless-ngx/paperless-ngx/pull/5838)) +- Fix: inotify read timeout not in ms [@grembo](https://github.com/grembo) ([#5876](https://github.com/paperless-ngx/paperless-ngx/pull/5876)) +- Chore(deps-dev): Bump ip from 2.0.0 to 2.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#5835](https://github.com/paperless-ngx/paperless-ngx/pull/5835)) +- Chore(deps): Bump undici and [@angular-devkit/build-angular in /src-ui @dependabot](https://github.com/angular-devkit/build-angular in /src-ui @dependabot) ([#5796](https://github.com/paperless-ngx/paperless-ngx/pull/5796)) +- Fix: allow relative date queries not in quick list [@shamoon](https://github.com/shamoon) ([#5801](https://github.com/paperless-ngx/paperless-ngx/pull/5801)) +- Fix: pass rule id to consumed .eml files [@shamoon](https://github.com/shamoon) ([#5800](https://github.com/paperless-ngx/paperless-ngx/pull/5800))
## paperless-ngx 2.5.3 ### Bug Fixes -- Fix: dont allow allauth redirects to any host [@shamoon](https://github.com/shamoon) ([#5783](https://github.com/paperless-ngx/paperless-ngx/pull/5783)) -- Fix: Interaction when both splitting and ASN are enabled [@stumpylog](https://github.com/stumpylog) ([#5779](https://github.com/paperless-ngx/paperless-ngx/pull/5779)) -- Fix: moved ssl_mode parameter for mysql backend engine [@MaciejSzczurek](https://github.com/MaciejSzczurek) ([#5771](https://github.com/paperless-ngx/paperless-ngx/pull/5771)) +- Fix: dont allow allauth redirects to any host [@shamoon](https://github.com/shamoon) ([#5783](https://github.com/paperless-ngx/paperless-ngx/pull/5783)) +- Fix: Interaction when both splitting and ASN are enabled [@stumpylog](https://github.com/stumpylog) ([#5779](https://github.com/paperless-ngx/paperless-ngx/pull/5779)) +- Fix: moved ssl_mode parameter for mysql backend engine [@MaciejSzczurek](https://github.com/MaciejSzczurek) ([#5771](https://github.com/paperless-ngx/paperless-ngx/pull/5771)) ### All App Changes
3 changes -- Fix: dont allow allauth redirects to any host [@shamoon](https://github.com/shamoon) ([#5783](https://github.com/paperless-ngx/paperless-ngx/pull/5783)) -- Fix: Interaction when both splitting and ASN are enabled [@stumpylog](https://github.com/stumpylog) ([#5779](https://github.com/paperless-ngx/paperless-ngx/pull/5779)) -- Fix: moved ssl_mode parameter for mysql backend engine [@MaciejSzczurek](https://github.com/MaciejSzczurek) ([#5771](https://github.com/paperless-ngx/paperless-ngx/pull/5771)) +- Fix: dont allow allauth redirects to any host [@shamoon](https://github.com/shamoon) ([#5783](https://github.com/paperless-ngx/paperless-ngx/pull/5783)) +- Fix: Interaction when both splitting and ASN are enabled [@stumpylog](https://github.com/stumpylog) ([#5779](https://github.com/paperless-ngx/paperless-ngx/pull/5779)) +- Fix: moved ssl_mode parameter for mysql backend engine [@MaciejSzczurek](https://github.com/MaciejSzczurek) ([#5771](https://github.com/paperless-ngx/paperless-ngx/pull/5771))
## paperless-ngx 2.5.2 ### Bug Fixes -- Fix: Generated secret key may include single or double quotes [@schmidtnz](https://github.com/schmidtnz) ([#5767](https://github.com/paperless-ngx/paperless-ngx/pull/5767)) -- Fix: consumer status alerts container blocks elements [@shamoon](https://github.com/shamoon) ([#5762](https://github.com/paperless-ngx/paperless-ngx/pull/5762)) -- Fix: handle document notes user format api change [@shamoon](https://github.com/shamoon) ([#5751](https://github.com/paperless-ngx/paperless-ngx/pull/5751)) -- Fix: Assign ASN from barcode only after any splitting [@stumpylog](https://github.com/stumpylog) ([#5745](https://github.com/paperless-ngx/paperless-ngx/pull/5745)) +- Fix: Generated secret key may include single or double quotes [@schmidtnz](https://github.com/schmidtnz) ([#5767](https://github.com/paperless-ngx/paperless-ngx/pull/5767)) +- Fix: consumer status alerts container blocks elements [@shamoon](https://github.com/shamoon) ([#5762](https://github.com/paperless-ngx/paperless-ngx/pull/5762)) +- Fix: handle document notes user format api change [@shamoon](https://github.com/shamoon) ([#5751](https://github.com/paperless-ngx/paperless-ngx/pull/5751)) +- Fix: Assign ASN from barcode only after any splitting [@stumpylog](https://github.com/stumpylog) ([#5745](https://github.com/paperless-ngx/paperless-ngx/pull/5745)) ### Dependencies -- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5741](https://github.com/paperless-ngx/paperless-ngx/pull/5741)) +- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5741](https://github.com/paperless-ngx/paperless-ngx/pull/5741)) ### All App Changes
4 changes -- Fix: consumer status alerts container blocks elements [@shamoon](https://github.com/shamoon) ([#5762](https://github.com/paperless-ngx/paperless-ngx/pull/5762)) -- Fix: handle document notes user format api change [@shamoon](https://github.com/shamoon) ([#5751](https://github.com/paperless-ngx/paperless-ngx/pull/5751)) -- Fix: Assign ASN from barcode only after any splitting [@stumpylog](https://github.com/stumpylog) ([#5745](https://github.com/paperless-ngx/paperless-ngx/pull/5745)) -- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5741](https://github.com/paperless-ngx/paperless-ngx/pull/5741)) +- Fix: consumer status alerts container blocks elements [@shamoon](https://github.com/shamoon) ([#5762](https://github.com/paperless-ngx/paperless-ngx/pull/5762)) +- Fix: handle document notes user format api change [@shamoon](https://github.com/shamoon) ([#5751](https://github.com/paperless-ngx/paperless-ngx/pull/5751)) +- Fix: Assign ASN from barcode only after any splitting [@stumpylog](https://github.com/stumpylog) ([#5745](https://github.com/paperless-ngx/paperless-ngx/pull/5745)) +- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5741](https://github.com/paperless-ngx/paperless-ngx/pull/5741))
## paperless-ngx 2.5.1 ### Bug Fixes -- Fix: Splitting on ASN barcodes even if not enabled [@stumpylog](https://github.com/stumpylog) ([#5740](https://github.com/paperless-ngx/paperless-ngx/pull/5740)) +- Fix: Splitting on ASN barcodes even if not enabled [@stumpylog](https://github.com/stumpylog) ([#5740](https://github.com/paperless-ngx/paperless-ngx/pull/5740)) ### Dependencies -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5737](https://github.com/paperless-ngx/paperless-ngx/pull/5737)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#5739](https://github.com/paperless-ngx/paperless-ngx/pull/5739)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5737](https://github.com/paperless-ngx/paperless-ngx/pull/5737)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#5739](https://github.com/paperless-ngx/paperless-ngx/pull/5739)) ### All App Changes
3 changes -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5737](https://github.com/paperless-ngx/paperless-ngx/pull/5737)) -- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#5739](https://github.com/paperless-ngx/paperless-ngx/pull/5739)) -- Fix: Splitting on ASN barcodes even if not enabled [@stumpylog](https://github.com/stumpylog) ([#5740](https://github.com/paperless-ngx/paperless-ngx/pull/5740)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5737](https://github.com/paperless-ngx/paperless-ngx/pull/5737)) +- Chore(deps): Bump the django group with 1 update [@dependabot](https://github.com/dependabot) ([#5739](https://github.com/paperless-ngx/paperless-ngx/pull/5739)) +- Fix: Splitting on ASN barcodes even if not enabled [@stumpylog](https://github.com/stumpylog) ([#5740](https://github.com/paperless-ngx/paperless-ngx/pull/5740))
## paperless-ngx 2.5.0 ### Breaking Changes -- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) +- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) ### Notable Changes -- Feature: OIDC \& social authentication [@mpflanzer](https://github.com/mpflanzer) ([#5190](https://github.com/paperless-ngx/paperless-ngx/pull/5190)) +- Feature: OIDC \& social authentication [@mpflanzer](https://github.com/mpflanzer) ([#5190](https://github.com/paperless-ngx/paperless-ngx/pull/5190)) ### Features -- Enhancement: confirm buttons [@shamoon](https://github.com/shamoon) ([#5680](https://github.com/paperless-ngx/paperless-ngx/pull/5680)) -- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) -- Feature: allow create objects from bulk edit [@shamoon](https://github.com/shamoon) ([#5667](https://github.com/paperless-ngx/paperless-ngx/pull/5667)) -- Feature: Allow tagging by putting barcodes on documents [@pkrahmer](https://github.com/pkrahmer) ([#5580](https://github.com/paperless-ngx/paperless-ngx/pull/5580)) -- Feature: Cache metadata and suggestions in Redis [@stumpylog](https://github.com/stumpylog) ([#5638](https://github.com/paperless-ngx/paperless-ngx/pull/5638)) -- Feature: Japanese translation [@shamoon](https://github.com/shamoon) ([#5641](https://github.com/paperless-ngx/paperless-ngx/pull/5641)) -- Feature: option for auto-remove inbox tags on save [@shamoon](https://github.com/shamoon) ([#5562](https://github.com/paperless-ngx/paperless-ngx/pull/5562)) -- Enhancement: allow paperless to run in read-only filesystem [@hegerdes](https://github.com/hegerdes) ([#5596](https://github.com/paperless-ngx/paperless-ngx/pull/5596)) -- Enhancement: mergeable bulk edit permissions [@shamoon](https://github.com/shamoon) ([#5508](https://github.com/paperless-ngx/paperless-ngx/pull/5508)) -- Enhancement: re-implement remote user auth for unsafe API requests as opt-in [@shamoon](https://github.com/shamoon) ([#5561](https://github.com/paperless-ngx/paperless-ngx/pull/5561)) -- Enhancement: Respect PDF cropbox for thumbnail generation [@henningBunk](https://github.com/henningBunk) ([#5531](https://github.com/paperless-ngx/paperless-ngx/pull/5531)) +- Enhancement: confirm buttons [@shamoon](https://github.com/shamoon) ([#5680](https://github.com/paperless-ngx/paperless-ngx/pull/5680)) +- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) +- Feature: allow create objects from bulk edit [@shamoon](https://github.com/shamoon) ([#5667](https://github.com/paperless-ngx/paperless-ngx/pull/5667)) +- Feature: Allow tagging by putting barcodes on documents [@pkrahmer](https://github.com/pkrahmer) ([#5580](https://github.com/paperless-ngx/paperless-ngx/pull/5580)) +- Feature: Cache metadata and suggestions in Redis [@stumpylog](https://github.com/stumpylog) ([#5638](https://github.com/paperless-ngx/paperless-ngx/pull/5638)) +- Feature: Japanese translation [@shamoon](https://github.com/shamoon) ([#5641](https://github.com/paperless-ngx/paperless-ngx/pull/5641)) +- Feature: option for auto-remove inbox tags on save [@shamoon](https://github.com/shamoon) ([#5562](https://github.com/paperless-ngx/paperless-ngx/pull/5562)) +- Enhancement: allow paperless to run in read-only filesystem [@hegerdes](https://github.com/hegerdes) ([#5596](https://github.com/paperless-ngx/paperless-ngx/pull/5596)) +- Enhancement: mergeable bulk edit permissions [@shamoon](https://github.com/shamoon) ([#5508](https://github.com/paperless-ngx/paperless-ngx/pull/5508)) +- Enhancement: re-implement remote user auth for unsafe API requests as opt-in [@shamoon](https://github.com/shamoon) ([#5561](https://github.com/paperless-ngx/paperless-ngx/pull/5561)) +- Enhancement: Respect PDF cropbox for thumbnail generation [@henningBunk](https://github.com/henningBunk) ([#5531](https://github.com/paperless-ngx/paperless-ngx/pull/5531)) ### Bug Fixes -- Fix: Test metadata items for Unicode issues [@stumpylog](https://github.com/stumpylog) ([#5707](https://github.com/paperless-ngx/paperless-ngx/pull/5707)) -- Change: try to show preview even if metadata fails [@shamoon](https://github.com/shamoon) ([#5706](https://github.com/paperless-ngx/paperless-ngx/pull/5706)) -- Fix: only check workflow trigger source if not empty [@shamoon](https://github.com/shamoon) ([#5701](https://github.com/paperless-ngx/paperless-ngx/pull/5701)) -- Fix: frontend validation of number fields fails upon save [@shamoon](https://github.com/shamoon) ([#5646](https://github.com/paperless-ngx/paperless-ngx/pull/5646)) -- Fix: Explicit validation of custom field name unique constraint [@shamoon](https://github.com/shamoon) ([#5647](https://github.com/paperless-ngx/paperless-ngx/pull/5647)) -- Fix: Don't attempt to retrieve object types user doesn't have permissions to [@shamoon](https://github.com/shamoon) ([#5612](https://github.com/paperless-ngx/paperless-ngx/pull/5612)) +- Fix: Test metadata items for Unicode issues [@stumpylog](https://github.com/stumpylog) ([#5707](https://github.com/paperless-ngx/paperless-ngx/pull/5707)) +- Change: try to show preview even if metadata fails [@shamoon](https://github.com/shamoon) ([#5706](https://github.com/paperless-ngx/paperless-ngx/pull/5706)) +- Fix: only check workflow trigger source if not empty [@shamoon](https://github.com/shamoon) ([#5701](https://github.com/paperless-ngx/paperless-ngx/pull/5701)) +- Fix: frontend validation of number fields fails upon save [@shamoon](https://github.com/shamoon) ([#5646](https://github.com/paperless-ngx/paperless-ngx/pull/5646)) +- Fix: Explicit validation of custom field name unique constraint [@shamoon](https://github.com/shamoon) ([#5647](https://github.com/paperless-ngx/paperless-ngx/pull/5647)) +- Fix: Don't attempt to retrieve object types user doesn't have permissions to [@shamoon](https://github.com/shamoon) ([#5612](https://github.com/paperless-ngx/paperless-ngx/pull/5612)) ### Documentation -- Documentation: add detail about consumer polling behavior [@silmaril42](https://github.com/silmaril42) ([#5674](https://github.com/paperless-ngx/paperless-ngx/pull/5674)) -- Paperless-ngx Demo: new and improved [@shamoon](https://github.com/shamoon) ([#5639](https://github.com/paperless-ngx/paperless-ngx/pull/5639)) -- Documentation: Add docs about missing timezones in MySQL/MariaDB [@Programie](https://github.com/Programie) ([#5583](https://github.com/paperless-ngx/paperless-ngx/pull/5583)) +- Documentation: add detail about consumer polling behavior [@silmaril42](https://github.com/silmaril42) ([#5674](https://github.com/paperless-ngx/paperless-ngx/pull/5674)) +- Paperless-ngx Demo: new and improved [@shamoon](https://github.com/shamoon) ([#5639](https://github.com/paperless-ngx/paperless-ngx/pull/5639)) +- Documentation: Add docs about missing timezones in MySQL/MariaDB [@Programie](https://github.com/Programie) ([#5583](https://github.com/paperless-ngx/paperless-ngx/pull/5583)) ### Maintenance -- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5629](https://github.com/paperless-ngx/paperless-ngx/pull/5629)) -- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5597](https://github.com/paperless-ngx/paperless-ngx/pull/5597)) +- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5629](https://github.com/paperless-ngx/paperless-ngx/pull/5629)) +- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5597](https://github.com/paperless-ngx/paperless-ngx/pull/5597)) ### Dependencies
9 changes -- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5676](https://github.com/paperless-ngx/paperless-ngx/pull/5676)) -- Chore(deps-dev): Bump [@playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot) ([#5634](https://github.com/paperless-ngx/paperless-ngx/pull/5634)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#5630](https://github.com/paperless-ngx/paperless-ngx/pull/5630)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5631](https://github.com/paperless-ngx/paperless-ngx/pull/5631)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5632](https://github.com/paperless-ngx/paperless-ngx/pull/5632)) -- Chore(deps): Bump zone.js from 0.14.2 to 0.14.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5633](https://github.com/paperless-ngx/paperless-ngx/pull/5633)) -- Chore(deps-dev): Bump [@types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot](https://github.com/types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot) ([#5635](https://github.com/paperless-ngx/paperless-ngx/pull/5635)) -- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5629](https://github.com/paperless-ngx/paperless-ngx/pull/5629)) -- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5597](https://github.com/paperless-ngx/paperless-ngx/pull/5597)) +- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5676](https://github.com/paperless-ngx/paperless-ngx/pull/5676)) +- Chore(deps-dev): Bump [@playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot) ([#5634](https://github.com/paperless-ngx/paperless-ngx/pull/5634)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#5630](https://github.com/paperless-ngx/paperless-ngx/pull/5630)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5631](https://github.com/paperless-ngx/paperless-ngx/pull/5631)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5632](https://github.com/paperless-ngx/paperless-ngx/pull/5632)) +- Chore(deps): Bump zone.js from 0.14.2 to 0.14.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5633](https://github.com/paperless-ngx/paperless-ngx/pull/5633)) +- Chore(deps-dev): Bump [@types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot](https://github.com/types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot) ([#5635](https://github.com/paperless-ngx/paperless-ngx/pull/5635)) +- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5629](https://github.com/paperless-ngx/paperless-ngx/pull/5629)) +- Chore(deps): Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#5597](https://github.com/paperless-ngx/paperless-ngx/pull/5597))
### All App Changes @@ -2824,266 +3218,266 @@
28 changes -- Chore: Ensure all creations of directories create the parents too [@stumpylog](https://github.com/stumpylog) ([#5711](https://github.com/paperless-ngx/paperless-ngx/pull/5711)) -- Fix: Test metadata items for Unicode issues [@stumpylog](https://github.com/stumpylog) ([#5707](https://github.com/paperless-ngx/paperless-ngx/pull/5707)) -- Change: try to show preview even if metadata fails [@shamoon](https://github.com/shamoon) ([#5706](https://github.com/paperless-ngx/paperless-ngx/pull/5706)) -- Fix: only check workflow trigger source if not empty [@shamoon](https://github.com/shamoon) ([#5701](https://github.com/paperless-ngx/paperless-ngx/pull/5701)) -- Enhancement: confirm buttons [@shamoon](https://github.com/shamoon) ([#5680](https://github.com/paperless-ngx/paperless-ngx/pull/5680)) -- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) -- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5676](https://github.com/paperless-ngx/paperless-ngx/pull/5676)) -- Feature: OIDC \& social authentication [@mpflanzer](https://github.com/mpflanzer) ([#5190](https://github.com/paperless-ngx/paperless-ngx/pull/5190)) -- Chore: Don't write Python bytecode in the Docker image [@stumpylog](https://github.com/stumpylog) ([#5677](https://github.com/paperless-ngx/paperless-ngx/pull/5677)) -- Feature: allow create objects from bulk edit [@shamoon](https://github.com/shamoon) ([#5667](https://github.com/paperless-ngx/paperless-ngx/pull/5667)) -- Chore: Use memory cache backend in debug mode [@shamoon](https://github.com/shamoon) ([#5666](https://github.com/paperless-ngx/paperless-ngx/pull/5666)) -- Chore: Adds additional rules for Ruff linter [@stumpylog](https://github.com/stumpylog) ([#5660](https://github.com/paperless-ngx/paperless-ngx/pull/5660)) -- Feature: Allow tagging by putting barcodes on documents [@pkrahmer](https://github.com/pkrahmer) ([#5580](https://github.com/paperless-ngx/paperless-ngx/pull/5580)) -- Feature: Cache metadata and suggestions in Redis [@stumpylog](https://github.com/stumpylog) ([#5638](https://github.com/paperless-ngx/paperless-ngx/pull/5638)) -- Fix: frontend validation of number fields fails upon save [@shamoon](https://github.com/shamoon) ([#5646](https://github.com/paperless-ngx/paperless-ngx/pull/5646)) -- Fix: Explicit validation of custom field name unique constraint [@shamoon](https://github.com/shamoon) ([#5647](https://github.com/paperless-ngx/paperless-ngx/pull/5647)) -- Feature: Japanese translation [@shamoon](https://github.com/shamoon) ([#5641](https://github.com/paperless-ngx/paperless-ngx/pull/5641)) -- Chore(deps-dev): Bump [@playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot) ([#5634](https://github.com/paperless-ngx/paperless-ngx/pull/5634)) -- Feature: option for auto-remove inbox tags on save [@shamoon](https://github.com/shamoon) ([#5562](https://github.com/paperless-ngx/paperless-ngx/pull/5562)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#5630](https://github.com/paperless-ngx/paperless-ngx/pull/5630)) -- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5631](https://github.com/paperless-ngx/paperless-ngx/pull/5631)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5632](https://github.com/paperless-ngx/paperless-ngx/pull/5632)) -- Chore(deps): Bump zone.js from 0.14.2 to 0.14.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5633](https://github.com/paperless-ngx/paperless-ngx/pull/5633)) -- Chore(deps-dev): Bump [@types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot](https://github.com/types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot) ([#5635](https://github.com/paperless-ngx/paperless-ngx/pull/5635)) -- Enhancement: mergeable bulk edit permissions [@shamoon](https://github.com/shamoon) ([#5508](https://github.com/paperless-ngx/paperless-ngx/pull/5508)) -- Enhancement: re-implement remote user auth for unsafe API requests as opt-in [@shamoon](https://github.com/shamoon) ([#5561](https://github.com/paperless-ngx/paperless-ngx/pull/5561)) -- Enhancement: Respect PDF cropbox for thumbnail generation [@henningBunk](https://github.com/henningBunk) ([#5531](https://github.com/paperless-ngx/paperless-ngx/pull/5531)) -- Fix: Don't attempt to retrieve object types user doesn't have permissions to [@shamoon](https://github.com/shamoon) ([#5612](https://github.com/paperless-ngx/paperless-ngx/pull/5612)) +- Chore: Ensure all creations of directories create the parents too [@stumpylog](https://github.com/stumpylog) ([#5711](https://github.com/paperless-ngx/paperless-ngx/pull/5711)) +- Fix: Test metadata items for Unicode issues [@stumpylog](https://github.com/stumpylog) ([#5707](https://github.com/paperless-ngx/paperless-ngx/pull/5707)) +- Change: try to show preview even if metadata fails [@shamoon](https://github.com/shamoon) ([#5706](https://github.com/paperless-ngx/paperless-ngx/pull/5706)) +- Fix: only check workflow trigger source if not empty [@shamoon](https://github.com/shamoon) ([#5701](https://github.com/paperless-ngx/paperless-ngx/pull/5701)) +- Enhancement: confirm buttons [@shamoon](https://github.com/shamoon) ([#5680](https://github.com/paperless-ngx/paperless-ngx/pull/5680)) +- Enhancement: bulk delete objects [@shamoon](https://github.com/shamoon) ([#5688](https://github.com/paperless-ngx/paperless-ngx/pull/5688)) +- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5676](https://github.com/paperless-ngx/paperless-ngx/pull/5676)) +- Feature: OIDC \& social authentication [@mpflanzer](https://github.com/mpflanzer) ([#5190](https://github.com/paperless-ngx/paperless-ngx/pull/5190)) +- Chore: Don't write Python bytecode in the Docker image [@stumpylog](https://github.com/stumpylog) ([#5677](https://github.com/paperless-ngx/paperless-ngx/pull/5677)) +- Feature: allow create objects from bulk edit [@shamoon](https://github.com/shamoon) ([#5667](https://github.com/paperless-ngx/paperless-ngx/pull/5667)) +- Chore: Use memory cache backend in debug mode [@shamoon](https://github.com/shamoon) ([#5666](https://github.com/paperless-ngx/paperless-ngx/pull/5666)) +- Chore: Adds additional rules for Ruff linter [@stumpylog](https://github.com/stumpylog) ([#5660](https://github.com/paperless-ngx/paperless-ngx/pull/5660)) +- Feature: Allow tagging by putting barcodes on documents [@pkrahmer](https://github.com/pkrahmer) ([#5580](https://github.com/paperless-ngx/paperless-ngx/pull/5580)) +- Feature: Cache metadata and suggestions in Redis [@stumpylog](https://github.com/stumpylog) ([#5638](https://github.com/paperless-ngx/paperless-ngx/pull/5638)) +- Fix: frontend validation of number fields fails upon save [@shamoon](https://github.com/shamoon) ([#5646](https://github.com/paperless-ngx/paperless-ngx/pull/5646)) +- Fix: Explicit validation of custom field name unique constraint [@shamoon](https://github.com/shamoon) ([#5647](https://github.com/paperless-ngx/paperless-ngx/pull/5647)) +- Feature: Japanese translation [@shamoon](https://github.com/shamoon) ([#5641](https://github.com/paperless-ngx/paperless-ngx/pull/5641)) +- Chore(deps-dev): Bump [@playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.40.1 to 1.41.2 in /src-ui @dependabot) ([#5634](https://github.com/paperless-ngx/paperless-ngx/pull/5634)) +- Feature: option for auto-remove inbox tags on save [@shamoon](https://github.com/shamoon) ([#5562](https://github.com/paperless-ngx/paperless-ngx/pull/5562)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#5630](https://github.com/paperless-ngx/paperless-ngx/pull/5630)) +- Chore(deps-dev): Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5631](https://github.com/paperless-ngx/paperless-ngx/pull/5631)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#5632](https://github.com/paperless-ngx/paperless-ngx/pull/5632)) +- Chore(deps): Bump zone.js from 0.14.2 to 0.14.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#5633](https://github.com/paperless-ngx/paperless-ngx/pull/5633)) +- Chore(deps-dev): Bump [@types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot](https://github.com/types/node from 20.10.6 to 20.11.16 in /src-ui @dependabot) ([#5635](https://github.com/paperless-ngx/paperless-ngx/pull/5635)) +- Enhancement: mergeable bulk edit permissions [@shamoon](https://github.com/shamoon) ([#5508](https://github.com/paperless-ngx/paperless-ngx/pull/5508)) +- Enhancement: re-implement remote user auth for unsafe API requests as opt-in [@shamoon](https://github.com/shamoon) ([#5561](https://github.com/paperless-ngx/paperless-ngx/pull/5561)) +- Enhancement: Respect PDF cropbox for thumbnail generation [@henningBunk](https://github.com/henningBunk) ([#5531](https://github.com/paperless-ngx/paperless-ngx/pull/5531)) +- Fix: Don't attempt to retrieve object types user doesn't have permissions to [@shamoon](https://github.com/shamoon) ([#5612](https://github.com/paperless-ngx/paperless-ngx/pull/5612))
## paperless-ngx 2.4.3 ### Bug Fixes -- Fix: Ensure the scratch directory exists before consuming via the folder [@stumpylog](https://github.com/stumpylog) ([#5579](https://github.com/paperless-ngx/paperless-ngx/pull/5579)) +- Fix: Ensure the scratch directory exists before consuming via the folder [@stumpylog](https://github.com/stumpylog) ([#5579](https://github.com/paperless-ngx/paperless-ngx/pull/5579)) ### All App Changes -- Fix: Ensure the scratch directory exists before consuming via the folder [@stumpylog](https://github.com/stumpylog) ([#5579](https://github.com/paperless-ngx/paperless-ngx/pull/5579)) +- Fix: Ensure the scratch directory exists before consuming via the folder [@stumpylog](https://github.com/stumpylog) ([#5579](https://github.com/paperless-ngx/paperless-ngx/pull/5579)) ## paperless-ngx 2.4.2 ### Bug Fixes -- Fix: improve one of the date matching regexes [@shamoon](https://github.com/shamoon) ([#5540](https://github.com/paperless-ngx/paperless-ngx/pull/5540)) -- Fix: tweak doc detail component behavior while awaiting metadata [@shamoon](https://github.com/shamoon) ([#5546](https://github.com/paperless-ngx/paperless-ngx/pull/5546)) +- Fix: improve one of the date matching regexes [@shamoon](https://github.com/shamoon) ([#5540](https://github.com/paperless-ngx/paperless-ngx/pull/5540)) +- Fix: tweak doc detail component behavior while awaiting metadata [@shamoon](https://github.com/shamoon) ([#5546](https://github.com/paperless-ngx/paperless-ngx/pull/5546)) ### All App Changes
2 changes -- Fix: improve one of the date matching regexes [@shamoon](https://github.com/shamoon) ([#5540](https://github.com/paperless-ngx/paperless-ngx/pull/5540)) -- Fix: tweak doc detail component behavior while awaiting metadata [@shamoon](https://github.com/shamoon) ([#5546](https://github.com/paperless-ngx/paperless-ngx/pull/5546)) +- Fix: improve one of the date matching regexes [@shamoon](https://github.com/shamoon) ([#5540](https://github.com/paperless-ngx/paperless-ngx/pull/5540)) +- Fix: tweak doc detail component behavior while awaiting metadata [@shamoon](https://github.com/shamoon) ([#5546](https://github.com/paperless-ngx/paperless-ngx/pull/5546))
## paperless-ngx 2.4.1 ### Breaking Changes -- Change: merge workflow permissions assignments instead of overwrite [@shamoon](https://github.com/shamoon) ([#5496](https://github.com/paperless-ngx/paperless-ngx/pull/5496)) +- Change: merge workflow permissions assignments instead of overwrite [@shamoon](https://github.com/shamoon) ([#5496](https://github.com/paperless-ngx/paperless-ngx/pull/5496)) ### Bug Fixes -- Fix: Minor frontend things in 2.4.0 [@shamoon](https://github.com/shamoon) ([#5514](https://github.com/paperless-ngx/paperless-ngx/pull/5514)) -- Fix: install script fails on alpine linux [@shamoon](https://github.com/shamoon) ([#5520](https://github.com/paperless-ngx/paperless-ngx/pull/5520)) -- Fix: enforce permissions for app config [@shamoon](https://github.com/shamoon) ([#5516](https://github.com/paperless-ngx/paperless-ngx/pull/5516)) -- Fix: render images not converted to pdf, refactor doc detail rendering [@shamoon](https://github.com/shamoon) ([#5475](https://github.com/paperless-ngx/paperless-ngx/pull/5475)) -- Fix: Dont parse numbers with exponent as integer [@shamoon](https://github.com/shamoon) ([#5457](https://github.com/paperless-ngx/paperless-ngx/pull/5457)) +- Fix: Minor frontend things in 2.4.0 [@shamoon](https://github.com/shamoon) ([#5514](https://github.com/paperless-ngx/paperless-ngx/pull/5514)) +- Fix: install script fails on alpine linux [@shamoon](https://github.com/shamoon) ([#5520](https://github.com/paperless-ngx/paperless-ngx/pull/5520)) +- Fix: enforce permissions for app config [@shamoon](https://github.com/shamoon) ([#5516](https://github.com/paperless-ngx/paperless-ngx/pull/5516)) +- Fix: render images not converted to pdf, refactor doc detail rendering [@shamoon](https://github.com/shamoon) ([#5475](https://github.com/paperless-ngx/paperless-ngx/pull/5475)) +- Fix: Dont parse numbers with exponent as integer [@shamoon](https://github.com/shamoon) ([#5457](https://github.com/paperless-ngx/paperless-ngx/pull/5457)) ### Maintenance -- Chore: Build fix- branches [@shamoon](https://github.com/shamoon) ([#5501](https://github.com/paperless-ngx/paperless-ngx/pull/5501)) +- Chore: Build fix- branches [@shamoon](https://github.com/shamoon) ([#5501](https://github.com/paperless-ngx/paperless-ngx/pull/5501)) ### Dependencies -- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#5503](https://github.com/paperless-ngx/paperless-ngx/pull/5503)) +- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#5503](https://github.com/paperless-ngx/paperless-ngx/pull/5503)) ### All App Changes
7 changes -- Revert "Enhancement: support remote user auth directly against API (DRF)" @shamoon ([#5534](https://github.com/paperless-ngx/paperless-ngx/pull/5534)) -- Fix: Minor frontend things in 2.4.0 [@shamoon](https://github.com/shamoon) ([#5514](https://github.com/paperless-ngx/paperless-ngx/pull/5514)) -- Fix: enforce permissions for app config [@shamoon](https://github.com/shamoon) ([#5516](https://github.com/paperless-ngx/paperless-ngx/pull/5516)) -- Change: merge workflow permissions assignments instead of overwrite [@shamoon](https://github.com/shamoon) ([#5496](https://github.com/paperless-ngx/paperless-ngx/pull/5496)) -- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#5503](https://github.com/paperless-ngx/paperless-ngx/pull/5503)) -- Fix: render images not converted to pdf, refactor doc detail rendering [@shamoon](https://github.com/shamoon) ([#5475](https://github.com/paperless-ngx/paperless-ngx/pull/5475)) -- Fix: Dont parse numbers with exponent as integer [@shamoon](https://github.com/shamoon) ([#5457](https://github.com/paperless-ngx/paperless-ngx/pull/5457)) +- Revert "Enhancement: support remote user auth directly against API (DRF)" @shamoon ([#5534](https://github.com/paperless-ngx/paperless-ngx/pull/5534)) +- Fix: Minor frontend things in 2.4.0 [@shamoon](https://github.com/shamoon) ([#5514](https://github.com/paperless-ngx/paperless-ngx/pull/5514)) +- Fix: enforce permissions for app config [@shamoon](https://github.com/shamoon) ([#5516](https://github.com/paperless-ngx/paperless-ngx/pull/5516)) +- Change: merge workflow permissions assignments instead of overwrite [@shamoon](https://github.com/shamoon) ([#5496](https://github.com/paperless-ngx/paperless-ngx/pull/5496)) +- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#5503](https://github.com/paperless-ngx/paperless-ngx/pull/5503)) +- Fix: render images not converted to pdf, refactor doc detail rendering [@shamoon](https://github.com/shamoon) ([#5475](https://github.com/paperless-ngx/paperless-ngx/pull/5475)) +- Fix: Dont parse numbers with exponent as integer [@shamoon](https://github.com/shamoon) ([#5457](https://github.com/paperless-ngx/paperless-ngx/pull/5457))
## paperless-ngx 2.4.0 ### Features -- Enhancement: support remote user auth directly against API (DRF) [@shamoon](https://github.com/shamoon) ([#5386](https://github.com/paperless-ngx/paperless-ngx/pull/5386)) -- Feature: Add additional caching support to suggestions and metadata [@stumpylog](https://github.com/stumpylog) ([#5414](https://github.com/paperless-ngx/paperless-ngx/pull/5414)) -- Feature: help tooltips [@shamoon](https://github.com/shamoon) ([#5383](https://github.com/paperless-ngx/paperless-ngx/pull/5383)) -- Enhancement: warn when outdated doc detected [@shamoon](https://github.com/shamoon) ([#5372](https://github.com/paperless-ngx/paperless-ngx/pull/5372)) -- Feature: app branding [@shamoon](https://github.com/shamoon) ([#5357](https://github.com/paperless-ngx/paperless-ngx/pull/5357)) +- Enhancement: support remote user auth directly against API (DRF) [@shamoon](https://github.com/shamoon) ([#5386](https://github.com/paperless-ngx/paperless-ngx/pull/5386)) +- Feature: Add additional caching support to suggestions and metadata [@stumpylog](https://github.com/stumpylog) ([#5414](https://github.com/paperless-ngx/paperless-ngx/pull/5414)) +- Feature: help tooltips [@shamoon](https://github.com/shamoon) ([#5383](https://github.com/paperless-ngx/paperless-ngx/pull/5383)) +- Enhancement: warn when outdated doc detected [@shamoon](https://github.com/shamoon) ([#5372](https://github.com/paperless-ngx/paperless-ngx/pull/5372)) +- Feature: app branding [@shamoon](https://github.com/shamoon) ([#5357](https://github.com/paperless-ngx/paperless-ngx/pull/5357)) ### Bug Fixes -- Fix: doc link removal when has never been assigned [@shamoon](https://github.com/shamoon) ([#5451](https://github.com/paperless-ngx/paperless-ngx/pull/5451)) -- Fix: dont lose permissions ui if owner changed from [@shamoon](https://github.com/shamoon) ([#5433](https://github.com/paperless-ngx/paperless-ngx/pull/5433)) -- Fix: Getting next ASN when no documents have an ASN [@stumpylog](https://github.com/stumpylog) ([#5431](https://github.com/paperless-ngx/paperless-ngx/pull/5431)) -- Fix: signin username floating label [@shamoon](https://github.com/shamoon) ([#5424](https://github.com/paperless-ngx/paperless-ngx/pull/5424)) -- Fix: shared by me filter with multiple users / groups in postgres [@shamoon](https://github.com/shamoon) ([#5396](https://github.com/paperless-ngx/paperless-ngx/pull/5396)) -- Fix: Catch new warning when loading the classifier [@stumpylog](https://github.com/stumpylog) ([#5395](https://github.com/paperless-ngx/paperless-ngx/pull/5395)) -- Fix: doc detail component fixes [@shamoon](https://github.com/shamoon) ([#5373](https://github.com/paperless-ngx/paperless-ngx/pull/5373)) +- Fix: doc link removal when has never been assigned [@shamoon](https://github.com/shamoon) ([#5451](https://github.com/paperless-ngx/paperless-ngx/pull/5451)) +- Fix: dont lose permissions ui if owner changed from [@shamoon](https://github.com/shamoon) ([#5433](https://github.com/paperless-ngx/paperless-ngx/pull/5433)) +- Fix: Getting next ASN when no documents have an ASN [@stumpylog](https://github.com/stumpylog) ([#5431](https://github.com/paperless-ngx/paperless-ngx/pull/5431)) +- Fix: signin username floating label [@shamoon](https://github.com/shamoon) ([#5424](https://github.com/paperless-ngx/paperless-ngx/pull/5424)) +- Fix: shared by me filter with multiple users / groups in postgres [@shamoon](https://github.com/shamoon) ([#5396](https://github.com/paperless-ngx/paperless-ngx/pull/5396)) +- Fix: Catch new warning when loading the classifier [@stumpylog](https://github.com/stumpylog) ([#5395](https://github.com/paperless-ngx/paperless-ngx/pull/5395)) +- Fix: doc detail component fixes [@shamoon](https://github.com/shamoon) ([#5373](https://github.com/paperless-ngx/paperless-ngx/pull/5373)) ### Maintenance -- Chore: better bootstrap icons [@shamoon](https://github.com/shamoon) ([#5403](https://github.com/paperless-ngx/paperless-ngx/pull/5403)) -- Chore: Close outdated support / general discussions [@shamoon](https://github.com/shamoon) ([#5443](https://github.com/paperless-ngx/paperless-ngx/pull/5443)) +- Chore: better bootstrap icons [@shamoon](https://github.com/shamoon) ([#5403](https://github.com/paperless-ngx/paperless-ngx/pull/5403)) +- Chore: Close outdated support / general discussions [@shamoon](https://github.com/shamoon) ([#5443](https://github.com/paperless-ngx/paperless-ngx/pull/5443)) ### Dependencies -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#5413](https://github.com/paperless-ngx/paperless-ngx/pull/5413)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5412](https://github.com/paperless-ngx/paperless-ngx/pull/5412)) -- Chore(deps-dev): Bump jinja2 from 3.1.2 to 3.1.3 [@dependabot](https://github.com/dependabot) ([#5352](https://github.com/paperless-ngx/paperless-ngx/pull/5352)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#5413](https://github.com/paperless-ngx/paperless-ngx/pull/5413)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5412](https://github.com/paperless-ngx/paperless-ngx/pull/5412)) +- Chore(deps-dev): Bump jinja2 from 3.1.2 to 3.1.3 [@dependabot](https://github.com/dependabot) ([#5352](https://github.com/paperless-ngx/paperless-ngx/pull/5352)) ### All App Changes
16 changes -- Fix: doc link removal when has never been assigned [@shamoon](https://github.com/shamoon) ([#5451](https://github.com/paperless-ngx/paperless-ngx/pull/5451)) -- Chore: better bootstrap icons [@shamoon](https://github.com/shamoon) ([#5403](https://github.com/paperless-ngx/paperless-ngx/pull/5403)) -- Fix: dont lose permissions ui if owner changed from [@shamoon](https://github.com/shamoon) ([#5433](https://github.com/paperless-ngx/paperless-ngx/pull/5433)) -- Enhancement: support remote user auth directly against API (DRF) [@shamoon](https://github.com/shamoon) ([#5386](https://github.com/paperless-ngx/paperless-ngx/pull/5386)) -- Fix: Getting next ASN when no documents have an ASN [@stumpylog](https://github.com/stumpylog) ([#5431](https://github.com/paperless-ngx/paperless-ngx/pull/5431)) -- Feature: Add additional caching support to suggestions and metadata [@stumpylog](https://github.com/stumpylog) ([#5414](https://github.com/paperless-ngx/paperless-ngx/pull/5414)) -- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#5413](https://github.com/paperless-ngx/paperless-ngx/pull/5413)) -- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5412](https://github.com/paperless-ngx/paperless-ngx/pull/5412)) -- Fix: signin username floating label [@shamoon](https://github.com/shamoon) ([#5424](https://github.com/paperless-ngx/paperless-ngx/pull/5424)) -- Feature: help tooltips [@shamoon](https://github.com/shamoon) ([#5383](https://github.com/paperless-ngx/paperless-ngx/pull/5383)) -- Enhancement / QoL: show selected tasks count [@shamoon](https://github.com/shamoon) ([#5379](https://github.com/paperless-ngx/paperless-ngx/pull/5379)) -- Fix: shared by me filter with multiple users / groups in postgres [@shamoon](https://github.com/shamoon) ([#5396](https://github.com/paperless-ngx/paperless-ngx/pull/5396)) -- Fix: doc detail component fixes [@shamoon](https://github.com/shamoon) ([#5373](https://github.com/paperless-ngx/paperless-ngx/pull/5373)) -- Enhancement: warn when outdated doc detected [@shamoon](https://github.com/shamoon) ([#5372](https://github.com/paperless-ngx/paperless-ngx/pull/5372)) -- Feature: app branding [@shamoon](https://github.com/shamoon) ([#5357](https://github.com/paperless-ngx/paperless-ngx/pull/5357)) -- Chore: Initial refactor of consume task [@stumpylog](https://github.com/stumpylog) ([#5367](https://github.com/paperless-ngx/paperless-ngx/pull/5367)) +- Fix: doc link removal when has never been assigned [@shamoon](https://github.com/shamoon) ([#5451](https://github.com/paperless-ngx/paperless-ngx/pull/5451)) +- Chore: better bootstrap icons [@shamoon](https://github.com/shamoon) ([#5403](https://github.com/paperless-ngx/paperless-ngx/pull/5403)) +- Fix: dont lose permissions ui if owner changed from [@shamoon](https://github.com/shamoon) ([#5433](https://github.com/paperless-ngx/paperless-ngx/pull/5433)) +- Enhancement: support remote user auth directly against API (DRF) [@shamoon](https://github.com/shamoon) ([#5386](https://github.com/paperless-ngx/paperless-ngx/pull/5386)) +- Fix: Getting next ASN when no documents have an ASN [@stumpylog](https://github.com/stumpylog) ([#5431](https://github.com/paperless-ngx/paperless-ngx/pull/5431)) +- Feature: Add additional caching support to suggestions and metadata [@stumpylog](https://github.com/stumpylog) ([#5414](https://github.com/paperless-ngx/paperless-ngx/pull/5414)) +- Chore(deps): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#5413](https://github.com/paperless-ngx/paperless-ngx/pull/5413)) +- Chore(deps-dev): Bump the development group with 2 updates [@dependabot](https://github.com/dependabot) ([#5412](https://github.com/paperless-ngx/paperless-ngx/pull/5412)) +- Fix: signin username floating label [@shamoon](https://github.com/shamoon) ([#5424](https://github.com/paperless-ngx/paperless-ngx/pull/5424)) +- Feature: help tooltips [@shamoon](https://github.com/shamoon) ([#5383](https://github.com/paperless-ngx/paperless-ngx/pull/5383)) +- Enhancement / QoL: show selected tasks count [@shamoon](https://github.com/shamoon) ([#5379](https://github.com/paperless-ngx/paperless-ngx/pull/5379)) +- Fix: shared by me filter with multiple users / groups in postgres [@shamoon](https://github.com/shamoon) ([#5396](https://github.com/paperless-ngx/paperless-ngx/pull/5396)) +- Fix: doc detail component fixes [@shamoon](https://github.com/shamoon) ([#5373](https://github.com/paperless-ngx/paperless-ngx/pull/5373)) +- Enhancement: warn when outdated doc detected [@shamoon](https://github.com/shamoon) ([#5372](https://github.com/paperless-ngx/paperless-ngx/pull/5372)) +- Feature: app branding [@shamoon](https://github.com/shamoon) ([#5357](https://github.com/paperless-ngx/paperless-ngx/pull/5357)) +- Chore: Initial refactor of consume task [@stumpylog](https://github.com/stumpylog) ([#5367](https://github.com/paperless-ngx/paperless-ngx/pull/5367))
## paperless-ngx 2.3.3 ### Enhancements -- Enhancement: Explain behavior of unset app config boolean to user [@shamoon](https://github.com/shamoon) ([#5345](https://github.com/paperless-ngx/paperless-ngx/pull/5345)) -- Enhancement: title assignment placeholder error handling, fallback [@shamoon](https://github.com/shamoon) ([#5282](https://github.com/paperless-ngx/paperless-ngx/pull/5282)) +- Enhancement: Explain behavior of unset app config boolean to user [@shamoon](https://github.com/shamoon) ([#5345](https://github.com/paperless-ngx/paperless-ngx/pull/5345)) +- Enhancement: title assignment placeholder error handling, fallback [@shamoon](https://github.com/shamoon) ([#5282](https://github.com/paperless-ngx/paperless-ngx/pull/5282)) ### Bug Fixes -- Fix: Don't require the JSON user arguments field, interpret empty string as [@stumpylog](https://github.com/stumpylog) ([#5320](https://github.com/paperless-ngx/paperless-ngx/pull/5320)) +- Fix: Don't require the JSON user arguments field, interpret empty string as [@stumpylog](https://github.com/stumpylog) ([#5320](https://github.com/paperless-ngx/paperless-ngx/pull/5320)) ### Maintenance -- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5336](https://github.com/paperless-ngx/paperless-ngx/pull/5336)) -- Chore: add pre-commit hook for codespell [@shamoon](https://github.com/shamoon) ([#5324](https://github.com/paperless-ngx/paperless-ngx/pull/5324)) +- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5336](https://github.com/paperless-ngx/paperless-ngx/pull/5336)) +- Chore: add pre-commit hook for codespell [@shamoon](https://github.com/shamoon) ([#5324](https://github.com/paperless-ngx/paperless-ngx/pull/5324)) ### All App Changes
5 changes -- Enhancement: Explain behavior of unset app config boolean to user [@shamoon](https://github.com/shamoon) ([#5345](https://github.com/paperless-ngx/paperless-ngx/pull/5345)) -- Enhancement: title assignment placeholder error handling, fallback [@shamoon](https://github.com/shamoon) ([#5282](https://github.com/paperless-ngx/paperless-ngx/pull/5282)) -- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5336](https://github.com/paperless-ngx/paperless-ngx/pull/5336)) -- Fix: Don't require the JSON user arguments field, interpret empty string as [@stumpylog](https://github.com/stumpylog) ([#5320](https://github.com/paperless-ngx/paperless-ngx/pull/5320)) -- Chore: add pre-commit hook for codespell [@shamoon](https://github.com/shamoon) ([#5324](https://github.com/paperless-ngx/paperless-ngx/pull/5324)) +- Enhancement: Explain behavior of unset app config boolean to user [@shamoon](https://github.com/shamoon) ([#5345](https://github.com/paperless-ngx/paperless-ngx/pull/5345)) +- Enhancement: title assignment placeholder error handling, fallback [@shamoon](https://github.com/shamoon) ([#5282](https://github.com/paperless-ngx/paperless-ngx/pull/5282)) +- Chore: Backend dependencies update [@stumpylog](https://github.com/stumpylog) ([#5336](https://github.com/paperless-ngx/paperless-ngx/pull/5336)) +- Fix: Don't require the JSON user arguments field, interpret empty string as [@stumpylog](https://github.com/stumpylog) ([#5320](https://github.com/paperless-ngx/paperless-ngx/pull/5320)) +- Chore: add pre-commit hook for codespell [@shamoon](https://github.com/shamoon) ([#5324](https://github.com/paperless-ngx/paperless-ngx/pull/5324))
## paperless-ngx 2.3.2 ### Bug Fixes -- Fix: triggered workflow assignment of customfield fails if field exists in v2.3.1 [@shamoon](https://github.com/shamoon) ([#5302](https://github.com/paperless-ngx/paperless-ngx/pull/5302)) -- Fix: Decoding of user arguments for OCR [@stumpylog](https://github.com/stumpylog) ([#5307](https://github.com/paperless-ngx/paperless-ngx/pull/5307)) -- Fix: empty workflow trigger match field cannot be saved in v.2.3.1 [@shamoon](https://github.com/shamoon) ([#5301](https://github.com/paperless-ngx/paperless-ngx/pull/5301)) -- Fix: Use local time for added/updated workflow triggers [@stumpylog](https://github.com/stumpylog) ([#5304](https://github.com/paperless-ngx/paperless-ngx/pull/5304)) -- Fix: workflow edit form loses unsaved changes [@shamoon](https://github.com/shamoon) ([#5299](https://github.com/paperless-ngx/paperless-ngx/pull/5299)) +- Fix: triggered workflow assignment of customfield fails if field exists in v2.3.1 [@shamoon](https://github.com/shamoon) ([#5302](https://github.com/paperless-ngx/paperless-ngx/pull/5302)) +- Fix: Decoding of user arguments for OCR [@stumpylog](https://github.com/stumpylog) ([#5307](https://github.com/paperless-ngx/paperless-ngx/pull/5307)) +- Fix: empty workflow trigger match field cannot be saved in v.2.3.1 [@shamoon](https://github.com/shamoon) ([#5301](https://github.com/paperless-ngx/paperless-ngx/pull/5301)) +- Fix: Use local time for added/updated workflow triggers [@stumpylog](https://github.com/stumpylog) ([#5304](https://github.com/paperless-ngx/paperless-ngx/pull/5304)) +- Fix: workflow edit form loses unsaved changes [@shamoon](https://github.com/shamoon) ([#5299](https://github.com/paperless-ngx/paperless-ngx/pull/5299)) ### All App Changes
5 changes -- Fix: triggered workflow assignment of customfield fails if field exists in v2.3.1 [@shamoon](https://github.com/shamoon) ([#5302](https://github.com/paperless-ngx/paperless-ngx/pull/5302)) -- Fix: Decoding of user arguments for OCR [@stumpylog](https://github.com/stumpylog) ([#5307](https://github.com/paperless-ngx/paperless-ngx/pull/5307)) -- Fix: empty workflow trigger match field cannot be saved in v.2.3.1 [@shamoon](https://github.com/shamoon) ([#5301](https://github.com/paperless-ngx/paperless-ngx/pull/5301)) -- Fix: Use local time for added/updated workflow triggers [@stumpylog](https://github.com/stumpylog) ([#5304](https://github.com/paperless-ngx/paperless-ngx/pull/5304)) -- Fix: workflow edit form loses unsaved changes [@shamoon](https://github.com/shamoon) ([#5299](https://github.com/paperless-ngx/paperless-ngx/pull/5299)) +- Fix: triggered workflow assignment of customfield fails if field exists in v2.3.1 [@shamoon](https://github.com/shamoon) ([#5302](https://github.com/paperless-ngx/paperless-ngx/pull/5302)) +- Fix: Decoding of user arguments for OCR [@stumpylog](https://github.com/stumpylog) ([#5307](https://github.com/paperless-ngx/paperless-ngx/pull/5307)) +- Fix: empty workflow trigger match field cannot be saved in v.2.3.1 [@shamoon](https://github.com/shamoon) ([#5301](https://github.com/paperless-ngx/paperless-ngx/pull/5301)) +- Fix: Use local time for added/updated workflow triggers [@stumpylog](https://github.com/stumpylog) ([#5304](https://github.com/paperless-ngx/paperless-ngx/pull/5304)) +- Fix: workflow edit form loses unsaved changes [@shamoon](https://github.com/shamoon) ([#5299](https://github.com/paperless-ngx/paperless-ngx/pull/5299))
## paperless-ngx 2.3.1 ### Bug Fixes -- Fix: edit workflow form not displaying trigger settings [@shamoon](https://github.com/shamoon) ([#5276](https://github.com/paperless-ngx/paperless-ngx/pull/5276)) -- Fix: Prevent passing 0 pages to OCRMyPDF [@stumpylog](https://github.com/stumpylog) ([#5275](https://github.com/paperless-ngx/paperless-ngx/pull/5275)) +- Fix: edit workflow form not displaying trigger settings [@shamoon](https://github.com/shamoon) ([#5276](https://github.com/paperless-ngx/paperless-ngx/pull/5276)) +- Fix: Prevent passing 0 pages to OCRMyPDF [@stumpylog](https://github.com/stumpylog) ([#5275](https://github.com/paperless-ngx/paperless-ngx/pull/5275)) ### All App Changes
2 changes -- Fix: edit workflow form not displaying trigger settings [@shamoon](https://github.com/shamoon) ([#5276](https://github.com/paperless-ngx/paperless-ngx/pull/5276)) -- Fix: Prevent passing 0 pages to OCRMyPDF [@stumpylog](https://github.com/stumpylog) ([#5275](https://github.com/paperless-ngx/paperless-ngx/pull/5275)) +- Fix: edit workflow form not displaying trigger settings [@shamoon](https://github.com/shamoon) ([#5276](https://github.com/paperless-ngx/paperless-ngx/pull/5276)) +- Fix: Prevent passing 0 pages to OCRMyPDF [@stumpylog](https://github.com/stumpylog) ([#5275](https://github.com/paperless-ngx/paperless-ngx/pull/5275))
## paperless-ngx 2.3.0 ### Notable Changes -- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) -- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) +- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) +- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) ### Features -- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) -- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) -- Enhancement: fetch mails in bulk [@falkenbt](https://github.com/falkenbt) ([#5249](https://github.com/paperless-ngx/paperless-ngx/pull/5249)) -- Enhancement: add parameter to post_document API [@bevanjkay](https://github.com/bevanjkay) ([#5217](https://github.com/paperless-ngx/paperless-ngx/pull/5217)) +- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) +- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) +- Enhancement: fetch mails in bulk [@falkenbt](https://github.com/falkenbt) ([#5249](https://github.com/paperless-ngx/paperless-ngx/pull/5249)) +- Enhancement: add parameter to post_document API [@bevanjkay](https://github.com/bevanjkay) ([#5217](https://github.com/paperless-ngx/paperless-ngx/pull/5217)) ### Bug Fixes -- Chore: Replaces deprecated Django alias with standard library [@stumpylog](https://github.com/stumpylog) ([#5262](https://github.com/paperless-ngx/paperless-ngx/pull/5262)) -- Fix: Crash in barcode ASN reading when the file type isn't supported [@stumpylog](https://github.com/stumpylog) ([#5261](https://github.com/paperless-ngx/paperless-ngx/pull/5261)) -- Fix: Allows pre-consume scripts to modify the working path again [@stumpylog](https://github.com/stumpylog) ([#5260](https://github.com/paperless-ngx/paperless-ngx/pull/5260)) -- Change: Use fnmatch for more sane workflow path matching [@shamoon](https://github.com/shamoon) ([#5250](https://github.com/paperless-ngx/paperless-ngx/pull/5250)) -- Fix: zip exports not respecting the --delete option [@stumpylog](https://github.com/stumpylog) ([#5245](https://github.com/paperless-ngx/paperless-ngx/pull/5245)) -- Fix: correctly format tip admonition [@ChrisRBe](https://github.com/ChrisRBe) ([#5229](https://github.com/paperless-ngx/paperless-ngx/pull/5229)) -- Fix: filename format remove none when part of directory [@shamoon](https://github.com/shamoon) ([#5210](https://github.com/paperless-ngx/paperless-ngx/pull/5210)) -- Fix: Improve Performance for Listing and Paginating Documents [@antoinelibert](https://github.com/antoinelibert) ([#5195](https://github.com/paperless-ngx/paperless-ngx/pull/5195)) -- Fix: Disable custom field remove button if user does not have permissions [@shamoon](https://github.com/shamoon) ([#5194](https://github.com/paperless-ngx/paperless-ngx/pull/5194)) -- Fix: overlapping button focus highlight on login [@shamoon](https://github.com/shamoon) ([#5193](https://github.com/paperless-ngx/paperless-ngx/pull/5193)) -- Fix: symmetric doc links with target doc value None [@shamoon](https://github.com/shamoon) ([#5187](https://github.com/paperless-ngx/paperless-ngx/pull/5187)) -- Fix: setting empty doc link with docs to be removed [@shamoon](https://github.com/shamoon) ([#5174](https://github.com/paperless-ngx/paperless-ngx/pull/5174)) -- Enhancement: improve validation of custom field values [@shamoon](https://github.com/shamoon) ([#5166](https://github.com/paperless-ngx/paperless-ngx/pull/5166)) -- Fix: type casting of db values for 'shared by me' filter [@shamoon](https://github.com/shamoon) ([#5155](https://github.com/paperless-ngx/paperless-ngx/pull/5155)) +- Chore: Replaces deprecated Django alias with standard library [@stumpylog](https://github.com/stumpylog) ([#5262](https://github.com/paperless-ngx/paperless-ngx/pull/5262)) +- Fix: Crash in barcode ASN reading when the file type isn't supported [@stumpylog](https://github.com/stumpylog) ([#5261](https://github.com/paperless-ngx/paperless-ngx/pull/5261)) +- Fix: Allows pre-consume scripts to modify the working path again [@stumpylog](https://github.com/stumpylog) ([#5260](https://github.com/paperless-ngx/paperless-ngx/pull/5260)) +- Change: Use fnmatch for more sane workflow path matching [@shamoon](https://github.com/shamoon) ([#5250](https://github.com/paperless-ngx/paperless-ngx/pull/5250)) +- Fix: zip exports not respecting the --delete option [@stumpylog](https://github.com/stumpylog) ([#5245](https://github.com/paperless-ngx/paperless-ngx/pull/5245)) +- Fix: correctly format tip admonition [@ChrisRBe](https://github.com/ChrisRBe) ([#5229](https://github.com/paperless-ngx/paperless-ngx/pull/5229)) +- Fix: filename format remove none when part of directory [@shamoon](https://github.com/shamoon) ([#5210](https://github.com/paperless-ngx/paperless-ngx/pull/5210)) +- Fix: Improve Performance for Listing and Paginating Documents [@antoinelibert](https://github.com/antoinelibert) ([#5195](https://github.com/paperless-ngx/paperless-ngx/pull/5195)) +- Fix: Disable custom field remove button if user does not have permissions [@shamoon](https://github.com/shamoon) ([#5194](https://github.com/paperless-ngx/paperless-ngx/pull/5194)) +- Fix: overlapping button focus highlight on login [@shamoon](https://github.com/shamoon) ([#5193](https://github.com/paperless-ngx/paperless-ngx/pull/5193)) +- Fix: symmetric doc links with target doc value None [@shamoon](https://github.com/shamoon) ([#5187](https://github.com/paperless-ngx/paperless-ngx/pull/5187)) +- Fix: setting empty doc link with docs to be removed [@shamoon](https://github.com/shamoon) ([#5174](https://github.com/paperless-ngx/paperless-ngx/pull/5174)) +- Enhancement: improve validation of custom field values [@shamoon](https://github.com/shamoon) ([#5166](https://github.com/paperless-ngx/paperless-ngx/pull/5166)) +- Fix: type casting of db values for 'shared by me' filter [@shamoon](https://github.com/shamoon) ([#5155](https://github.com/paperless-ngx/paperless-ngx/pull/5155)) ### Documentation -- Fix: correctly format tip admonition [@ChrisRBe](https://github.com/ChrisRBe) ([#5229](https://github.com/paperless-ngx/paperless-ngx/pull/5229)) +- Fix: correctly format tip admonition [@ChrisRBe](https://github.com/ChrisRBe) ([#5229](https://github.com/paperless-ngx/paperless-ngx/pull/5229)) ### Maintenance -- Chore(deps): Bump the actions group with 5 updates [@dependabot](https://github.com/dependabot) ([#5203](https://github.com/paperless-ngx/paperless-ngx/pull/5203)) +- Chore(deps): Bump the actions group with 5 updates [@dependabot](https://github.com/dependabot) ([#5203](https://github.com/paperless-ngx/paperless-ngx/pull/5203)) ### Dependencies
4 changes -- Chore(deps): Bump the actions group with 5 updates [@dependabot](https://github.com/dependabot) ([#5203](https://github.com/paperless-ngx/paperless-ngx/pull/5203)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#5204](https://github.com/paperless-ngx/paperless-ngx/pull/5204)) -- Chore(deps-dev): Bump [@types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot](https://github.com/types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot) ([#5207](https://github.com/paperless-ngx/paperless-ngx/pull/5207)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5205](https://github.com/paperless-ngx/paperless-ngx/pull/5205)) +- Chore(deps): Bump the actions group with 5 updates [@dependabot](https://github.com/dependabot) ([#5203](https://github.com/paperless-ngx/paperless-ngx/pull/5203)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#5204](https://github.com/paperless-ngx/paperless-ngx/pull/5204)) +- Chore(deps-dev): Bump [@types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot](https://github.com/types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot) ([#5207](https://github.com/paperless-ngx/paperless-ngx/pull/5207)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5205](https://github.com/paperless-ngx/paperless-ngx/pull/5205))
### All App Changes @@ -3091,91 +3485,91 @@
21 changes -- Chore: Replaces deprecated Django alias with standard library [@stumpylog](https://github.com/stumpylog) ([#5262](https://github.com/paperless-ngx/paperless-ngx/pull/5262)) -- Fix: Crash in barcode ASN reading when the file type isn't supported [@stumpylog](https://github.com/stumpylog) ([#5261](https://github.com/paperless-ngx/paperless-ngx/pull/5261)) -- Fix: Allows pre-consume scripts to modify the working path again [@stumpylog](https://github.com/stumpylog) ([#5260](https://github.com/paperless-ngx/paperless-ngx/pull/5260)) -- Enhancement: add basic filters for listing of custom fields [@shamoon](https://github.com/shamoon) ([#5257](https://github.com/paperless-ngx/paperless-ngx/pull/5257)) -- Change: Use fnmatch for more sane workflow path matching [@shamoon](https://github.com/shamoon) ([#5250](https://github.com/paperless-ngx/paperless-ngx/pull/5250)) -- Enhancement: fetch mails in bulk [@falkenbt](https://github.com/falkenbt) ([#5249](https://github.com/paperless-ngx/paperless-ngx/pull/5249)) -- Fix: zip exports not respecting the --delete option [@stumpylog](https://github.com/stumpylog) ([#5245](https://github.com/paperless-ngx/paperless-ngx/pull/5245)) -- Enhancement: add parameter to post_document API [@bevanjkay](https://github.com/bevanjkay) ([#5217](https://github.com/paperless-ngx/paperless-ngx/pull/5217)) -- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) -- Fix: filename format remove none when part of directory [@shamoon](https://github.com/shamoon) ([#5210](https://github.com/paperless-ngx/paperless-ngx/pull/5210)) -- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#5204](https://github.com/paperless-ngx/paperless-ngx/pull/5204)) -- Chore(deps-dev): Bump [@types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot](https://github.com/types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot) ([#5207](https://github.com/paperless-ngx/paperless-ngx/pull/5207)) -- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5205](https://github.com/paperless-ngx/paperless-ngx/pull/5205)) -- Fix: Improve Performance for Listing and Paginating Documents [@antoinelibert](https://github.com/antoinelibert) ([#5195](https://github.com/paperless-ngx/paperless-ngx/pull/5195)) -- Fix: Disable custom field remove button if user does not have permissions [@shamoon](https://github.com/shamoon) ([#5194](https://github.com/paperless-ngx/paperless-ngx/pull/5194)) -- Fix: overlapping button focus highlight on login [@shamoon](https://github.com/shamoon) ([#5193](https://github.com/paperless-ngx/paperless-ngx/pull/5193)) -- Fix: symmetric doc links with target doc value None [@shamoon](https://github.com/shamoon) ([#5187](https://github.com/paperless-ngx/paperless-ngx/pull/5187)) -- Fix: setting empty doc link with docs to be removed [@shamoon](https://github.com/shamoon) ([#5174](https://github.com/paperless-ngx/paperless-ngx/pull/5174)) -- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) -- Enhancement: improve validation of custom field values [@shamoon](https://github.com/shamoon) ([#5166](https://github.com/paperless-ngx/paperless-ngx/pull/5166)) -- Fix: type casting of db values for 'shared by me' filter [@shamoon](https://github.com/shamoon) ([#5155](https://github.com/paperless-ngx/paperless-ngx/pull/5155)) +- Chore: Replaces deprecated Django alias with standard library [@stumpylog](https://github.com/stumpylog) ([#5262](https://github.com/paperless-ngx/paperless-ngx/pull/5262)) +- Fix: Crash in barcode ASN reading when the file type isn't supported [@stumpylog](https://github.com/stumpylog) ([#5261](https://github.com/paperless-ngx/paperless-ngx/pull/5261)) +- Fix: Allows pre-consume scripts to modify the working path again [@stumpylog](https://github.com/stumpylog) ([#5260](https://github.com/paperless-ngx/paperless-ngx/pull/5260)) +- Enhancement: add basic filters for listing of custom fields [@shamoon](https://github.com/shamoon) ([#5257](https://github.com/paperless-ngx/paperless-ngx/pull/5257)) +- Change: Use fnmatch for more sane workflow path matching [@shamoon](https://github.com/shamoon) ([#5250](https://github.com/paperless-ngx/paperless-ngx/pull/5250)) +- Enhancement: fetch mails in bulk [@falkenbt](https://github.com/falkenbt) ([#5249](https://github.com/paperless-ngx/paperless-ngx/pull/5249)) +- Fix: zip exports not respecting the --delete option [@stumpylog](https://github.com/stumpylog) ([#5245](https://github.com/paperless-ngx/paperless-ngx/pull/5245)) +- Enhancement: add parameter to post_document API [@bevanjkay](https://github.com/bevanjkay) ([#5217](https://github.com/paperless-ngx/paperless-ngx/pull/5217)) +- Feature: Workflows [@shamoon](https://github.com/shamoon) ([#5121](https://github.com/paperless-ngx/paperless-ngx/pull/5121)) +- Fix: filename format remove none when part of directory [@shamoon](https://github.com/shamoon) ([#5210](https://github.com/paperless-ngx/paperless-ngx/pull/5210)) +- Chore(deps): Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#5204](https://github.com/paperless-ngx/paperless-ngx/pull/5204)) +- Chore(deps-dev): Bump [@types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot](https://github.com/types/node from 20.10.4 to 20.10.6 in /src-ui @dependabot) ([#5207](https://github.com/paperless-ngx/paperless-ngx/pull/5207)) +- Chore(deps-dev): Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#5205](https://github.com/paperless-ngx/paperless-ngx/pull/5205)) +- Fix: Improve Performance for Listing and Paginating Documents [@antoinelibert](https://github.com/antoinelibert) ([#5195](https://github.com/paperless-ngx/paperless-ngx/pull/5195)) +- Fix: Disable custom field remove button if user does not have permissions [@shamoon](https://github.com/shamoon) ([#5194](https://github.com/paperless-ngx/paperless-ngx/pull/5194)) +- Fix: overlapping button focus highlight on login [@shamoon](https://github.com/shamoon) ([#5193](https://github.com/paperless-ngx/paperless-ngx/pull/5193)) +- Fix: symmetric doc links with target doc value None [@shamoon](https://github.com/shamoon) ([#5187](https://github.com/paperless-ngx/paperless-ngx/pull/5187)) +- Fix: setting empty doc link with docs to be removed [@shamoon](https://github.com/shamoon) ([#5174](https://github.com/paperless-ngx/paperless-ngx/pull/5174)) +- Feature: Allow setting backend configuration settings via the UI [@stumpylog](https://github.com/stumpylog) ([#5126](https://github.com/paperless-ngx/paperless-ngx/pull/5126)) +- Enhancement: improve validation of custom field values [@shamoon](https://github.com/shamoon) ([#5166](https://github.com/paperless-ngx/paperless-ngx/pull/5166)) +- Fix: type casting of db values for 'shared by me' filter [@shamoon](https://github.com/shamoon) ([#5155](https://github.com/paperless-ngx/paperless-ngx/pull/5155))
## paperless-ngx 2.2.1 ### Bug Fixes -- Fix: saving doc links with no value [@shamoon](https://github.com/shamoon) ([#5144](https://github.com/paperless-ngx/paperless-ngx/pull/5144)) -- Fix: allow multiple consumption templates to assign the same custom field [@shamoon](https://github.com/shamoon) ([#5142](https://github.com/paperless-ngx/paperless-ngx/pull/5142)) -- Fix: some dropdowns broken in 2.2.0 [@shamoon](https://github.com/shamoon) ([#5134](https://github.com/paperless-ngx/paperless-ngx/pull/5134)) +- Fix: saving doc links with no value [@shamoon](https://github.com/shamoon) ([#5144](https://github.com/paperless-ngx/paperless-ngx/pull/5144)) +- Fix: allow multiple consumption templates to assign the same custom field [@shamoon](https://github.com/shamoon) ([#5142](https://github.com/paperless-ngx/paperless-ngx/pull/5142)) +- Fix: some dropdowns broken in 2.2.0 [@shamoon](https://github.com/shamoon) ([#5134](https://github.com/paperless-ngx/paperless-ngx/pull/5134)) ### All App Changes
3 changes -- Fix: saving doc links with no value [@shamoon](https://github.com/shamoon) ([#5144](https://github.com/paperless-ngx/paperless-ngx/pull/5144)) -- Fix: allow multiple consumption templates to assign the same custom field [@shamoon](https://github.com/shamoon) ([#5142](https://github.com/paperless-ngx/paperless-ngx/pull/5142)) -- Fix: some dropdowns broken in 2.2.0 [@shamoon](https://github.com/shamoon) ([#5134](https://github.com/paperless-ngx/paperless-ngx/pull/5134)) +- Fix: saving doc links with no value [@shamoon](https://github.com/shamoon) ([#5144](https://github.com/paperless-ngx/paperless-ngx/pull/5144)) +- Fix: allow multiple consumption templates to assign the same custom field [@shamoon](https://github.com/shamoon) ([#5142](https://github.com/paperless-ngx/paperless-ngx/pull/5142)) +- Fix: some dropdowns broken in 2.2.0 [@shamoon](https://github.com/shamoon) ([#5134](https://github.com/paperless-ngx/paperless-ngx/pull/5134))
## paperless-ngx 2.2.0 ### Features -- Enhancement: Add tooltip for select dropdown items [@shamoon](https://github.com/shamoon) ([#5070](https://github.com/paperless-ngx/paperless-ngx/pull/5070)) -- Chore: Update Angular to v17 including new Angular control-flow [@shamoon](https://github.com/shamoon) ([#4980](https://github.com/paperless-ngx/paperless-ngx/pull/4980)) -- Enhancement: symmetric document links [@shamoon](https://github.com/shamoon) ([#4907](https://github.com/paperless-ngx/paperless-ngx/pull/4907)) -- Enhancement: shared icon \& shared by me filter [@shamoon](https://github.com/shamoon) ([#4859](https://github.com/paperless-ngx/paperless-ngx/pull/4859)) -- Enhancement: Improved popup preview, respect embedded viewer, error handling [@shamoon](https://github.com/shamoon) ([#4947](https://github.com/paperless-ngx/paperless-ngx/pull/4947)) -- Enhancement: Allow deletion of documents via the fuzzy matching command [@stumpylog](https://github.com/stumpylog) ([#4957](https://github.com/paperless-ngx/paperless-ngx/pull/4957)) -- Enhancement: document link field fixes [@shamoon](https://github.com/shamoon) ([#5020](https://github.com/paperless-ngx/paperless-ngx/pull/5020)) -- Enhancement: above and below doc detail save buttons [@shamoon](https://github.com/shamoon) ([#5008](https://github.com/paperless-ngx/paperless-ngx/pull/5008)) +- Enhancement: Add tooltip for select dropdown items [@shamoon](https://github.com/shamoon) ([#5070](https://github.com/paperless-ngx/paperless-ngx/pull/5070)) +- Chore: Update Angular to v17 including new Angular control-flow [@shamoon](https://github.com/shamoon) ([#4980](https://github.com/paperless-ngx/paperless-ngx/pull/4980)) +- Enhancement: symmetric document links [@shamoon](https://github.com/shamoon) ([#4907](https://github.com/paperless-ngx/paperless-ngx/pull/4907)) +- Enhancement: shared icon \& shared by me filter [@shamoon](https://github.com/shamoon) ([#4859](https://github.com/paperless-ngx/paperless-ngx/pull/4859)) +- Enhancement: Improved popup preview, respect embedded viewer, error handling [@shamoon](https://github.com/shamoon) ([#4947](https://github.com/paperless-ngx/paperless-ngx/pull/4947)) +- Enhancement: Allow deletion of documents via the fuzzy matching command [@stumpylog](https://github.com/stumpylog) ([#4957](https://github.com/paperless-ngx/paperless-ngx/pull/4957)) +- Enhancement: document link field fixes [@shamoon](https://github.com/shamoon) ([#5020](https://github.com/paperless-ngx/paperless-ngx/pull/5020)) +- Enhancement: above and below doc detail save buttons [@shamoon](https://github.com/shamoon) ([#5008](https://github.com/paperless-ngx/paperless-ngx/pull/5008)) ### Bug Fixes -- Fix: Case where a mail attachment has no filename to use [@stumpylog](https://github.com/stumpylog) ([#5117](https://github.com/paperless-ngx/paperless-ngx/pull/5117)) -- Fix: Disable auto-login for API token requests [@shamoon](https://github.com/shamoon) ([#5094](https://github.com/paperless-ngx/paperless-ngx/pull/5094)) -- Fix: update ASN regex to support Unicode [@eukub](https://github.com/eukub) ([#5099](https://github.com/paperless-ngx/paperless-ngx/pull/5099)) -- Fix: ensure CSRF-Token on Index view [@baflo](https://github.com/baflo) ([#5082](https://github.com/paperless-ngx/paperless-ngx/pull/5082)) -- Fix: Stop auto-refresh logs / tasks after close [@shamoon](https://github.com/shamoon) ([#5089](https://github.com/paperless-ngx/paperless-ngx/pull/5089)) -- Fix: Make the admin panel accessible when using a large number of documents [@bogdal](https://github.com/bogdal) ([#5052](https://github.com/paperless-ngx/paperless-ngx/pull/5052)) -- Fix: dont allow null property via API [@shamoon](https://github.com/shamoon) ([#5063](https://github.com/paperless-ngx/paperless-ngx/pull/5063)) -- Fix: Updates Ghostscript to 10.02.1 for more bug fixes to it [@stumpylog](https://github.com/stumpylog) ([#5040](https://github.com/paperless-ngx/paperless-ngx/pull/5040)) -- Fix: allow system keyboard shortcuts in date fields [@shamoon](https://github.com/shamoon) ([#5009](https://github.com/paperless-ngx/paperless-ngx/pull/5009)) -- Fix password change detection on profile edit [@shamoon](https://github.com/shamoon) ([#5028](https://github.com/paperless-ngx/paperless-ngx/pull/5028)) +- Fix: Case where a mail attachment has no filename to use [@stumpylog](https://github.com/stumpylog) ([#5117](https://github.com/paperless-ngx/paperless-ngx/pull/5117)) +- Fix: Disable auto-login for API token requests [@shamoon](https://github.com/shamoon) ([#5094](https://github.com/paperless-ngx/paperless-ngx/pull/5094)) +- Fix: update ASN regex to support Unicode [@eukub](https://github.com/eukub) ([#5099](https://github.com/paperless-ngx/paperless-ngx/pull/5099)) +- Fix: ensure CSRF-Token on Index view [@baflo](https://github.com/baflo) ([#5082](https://github.com/paperless-ngx/paperless-ngx/pull/5082)) +- Fix: Stop auto-refresh logs / tasks after close [@shamoon](https://github.com/shamoon) ([#5089](https://github.com/paperless-ngx/paperless-ngx/pull/5089)) +- Fix: Make the admin panel accessible when using a large number of documents [@bogdal](https://github.com/bogdal) ([#5052](https://github.com/paperless-ngx/paperless-ngx/pull/5052)) +- Fix: dont allow null property via API [@shamoon](https://github.com/shamoon) ([#5063](https://github.com/paperless-ngx/paperless-ngx/pull/5063)) +- Fix: Updates Ghostscript to 10.02.1 for more bug fixes to it [@stumpylog](https://github.com/stumpylog) ([#5040](https://github.com/paperless-ngx/paperless-ngx/pull/5040)) +- Fix: allow system keyboard shortcuts in date fields [@shamoon](https://github.com/shamoon) ([#5009](https://github.com/paperless-ngx/paperless-ngx/pull/5009)) +- Fix password change detection on profile edit [@shamoon](https://github.com/shamoon) ([#5028](https://github.com/paperless-ngx/paperless-ngx/pull/5028)) ### Documentation -- Documentation: organize API endpoints [@dgsponer](https://github.com/dgsponer) ([#5077](https://github.com/paperless-ngx/paperless-ngx/pull/5077)) +- Documentation: organize API endpoints [@dgsponer](https://github.com/dgsponer) ([#5077](https://github.com/paperless-ngx/paperless-ngx/pull/5077)) ### Maintenance -- Chore: Bulk backend update [@stumpylog](https://github.com/stumpylog) ([#5061](https://github.com/paperless-ngx/paperless-ngx/pull/5061)) +- Chore: Bulk backend update [@stumpylog](https://github.com/stumpylog) ([#5061](https://github.com/paperless-ngx/paperless-ngx/pull/5061)) ### Dependencies
5 changes -- Chore: Bulk backend update [@stumpylog](https://github.com/stumpylog) ([#5061](https://github.com/paperless-ngx/paperless-ngx/pull/5061)) -- Chore(deps): Bump the django group with 3 updates [@dependabot](https://github.com/dependabot) ([#5046](https://github.com/paperless-ngx/paperless-ngx/pull/5046)) -- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5047](https://github.com/paperless-ngx/paperless-ngx/pull/5047)) -- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#5048](https://github.com/paperless-ngx/paperless-ngx/pull/5048)) -- Fix: Updates Ghostscript to 10.02.1 for more bug fixes to it [@stumpylog](https://github.com/stumpylog) ([#5040](https://github.com/paperless-ngx/paperless-ngx/pull/5040)) +- Chore: Bulk backend update [@stumpylog](https://github.com/stumpylog) ([#5061](https://github.com/paperless-ngx/paperless-ngx/pull/5061)) +- Chore(deps): Bump the django group with 3 updates [@dependabot](https://github.com/dependabot) ([#5046](https://github.com/paperless-ngx/paperless-ngx/pull/5046)) +- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5047](https://github.com/paperless-ngx/paperless-ngx/pull/5047)) +- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#5048](https://github.com/paperless-ngx/paperless-ngx/pull/5048)) +- Fix: Updates Ghostscript to 10.02.1 for more bug fixes to it [@stumpylog](https://github.com/stumpylog) ([#5040](https://github.com/paperless-ngx/paperless-ngx/pull/5040))
### All App Changes @@ -3183,155 +3577,155 @@
20 changes -- Fix: Case where a mail attachment has no filename to use [@stumpylog](https://github.com/stumpylog) ([#5117](https://github.com/paperless-ngx/paperless-ngx/pull/5117)) -- Fix: Disable auto-login for API token requests [@shamoon](https://github.com/shamoon) ([#5094](https://github.com/paperless-ngx/paperless-ngx/pull/5094)) -- Fix: update ASN regex to support Unicode [@eukub](https://github.com/eukub) ([#5099](https://github.com/paperless-ngx/paperless-ngx/pull/5099)) -- Fix: ensure CSRF-Token on Index view [@baflo](https://github.com/baflo) ([#5082](https://github.com/paperless-ngx/paperless-ngx/pull/5082)) -- Fix: Stop auto-refresh logs / tasks after close [@shamoon](https://github.com/shamoon) ([#5089](https://github.com/paperless-ngx/paperless-ngx/pull/5089)) -- Enhancement: Add tooltip for select dropdown items [@shamoon](https://github.com/shamoon) ([#5070](https://github.com/paperless-ngx/paperless-ngx/pull/5070)) -- Fix: Make the admin panel accessible when using a large number of documents [@bogdal](https://github.com/bogdal) ([#5052](https://github.com/paperless-ngx/paperless-ngx/pull/5052)) -- Chore: Update Angular to v17 including new Angular control-flow [@shamoon](https://github.com/shamoon) ([#4980](https://github.com/paperless-ngx/paperless-ngx/pull/4980)) -- Fix: dont allow null property via API [@shamoon](https://github.com/shamoon) ([#5063](https://github.com/paperless-ngx/paperless-ngx/pull/5063)) -- Enhancement: symmetric document links [@shamoon](https://github.com/shamoon) ([#4907](https://github.com/paperless-ngx/paperless-ngx/pull/4907)) -- Enhancement: shared icon \& shared by me filter [@shamoon](https://github.com/shamoon) ([#4859](https://github.com/paperless-ngx/paperless-ngx/pull/4859)) -- Chore(deps): Bump the django group with 3 updates [@dependabot](https://github.com/dependabot) ([#5046](https://github.com/paperless-ngx/paperless-ngx/pull/5046)) -- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5047](https://github.com/paperless-ngx/paperless-ngx/pull/5047)) -- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#5048](https://github.com/paperless-ngx/paperless-ngx/pull/5048)) -- Enhancement: Improved popup preview, respect embedded viewer, error handling [@shamoon](https://github.com/shamoon) ([#4947](https://github.com/paperless-ngx/paperless-ngx/pull/4947)) -- Enhancement: Add {original_filename}, {added_time} to title placeholders [@TTT7275](https://github.com/TTT7275) ([#4972](https://github.com/paperless-ngx/paperless-ngx/pull/4972)) -- Feature: Allow deletion of documents via the fuzzy matching command [@stumpylog](https://github.com/stumpylog) ([#4957](https://github.com/paperless-ngx/paperless-ngx/pull/4957)) -- Fix: allow system keyboard shortcuts in date fields [@shamoon](https://github.com/shamoon) ([#5009](https://github.com/paperless-ngx/paperless-ngx/pull/5009)) -- Enhancement: document link field fixes [@shamoon](https://github.com/shamoon) ([#5020](https://github.com/paperless-ngx/paperless-ngx/pull/5020)) -- Fix password change detection on profile edit [@shamoon](https://github.com/shamoon) ([#5028](https://github.com/paperless-ngx/paperless-ngx/pull/5028)) +- Fix: Case where a mail attachment has no filename to use [@stumpylog](https://github.com/stumpylog) ([#5117](https://github.com/paperless-ngx/paperless-ngx/pull/5117)) +- Fix: Disable auto-login for API token requests [@shamoon](https://github.com/shamoon) ([#5094](https://github.com/paperless-ngx/paperless-ngx/pull/5094)) +- Fix: update ASN regex to support Unicode [@eukub](https://github.com/eukub) ([#5099](https://github.com/paperless-ngx/paperless-ngx/pull/5099)) +- Fix: ensure CSRF-Token on Index view [@baflo](https://github.com/baflo) ([#5082](https://github.com/paperless-ngx/paperless-ngx/pull/5082)) +- Fix: Stop auto-refresh logs / tasks after close [@shamoon](https://github.com/shamoon) ([#5089](https://github.com/paperless-ngx/paperless-ngx/pull/5089)) +- Enhancement: Add tooltip for select dropdown items [@shamoon](https://github.com/shamoon) ([#5070](https://github.com/paperless-ngx/paperless-ngx/pull/5070)) +- Fix: Make the admin panel accessible when using a large number of documents [@bogdal](https://github.com/bogdal) ([#5052](https://github.com/paperless-ngx/paperless-ngx/pull/5052)) +- Chore: Update Angular to v17 including new Angular control-flow [@shamoon](https://github.com/shamoon) ([#4980](https://github.com/paperless-ngx/paperless-ngx/pull/4980)) +- Fix: dont allow null property via API [@shamoon](https://github.com/shamoon) ([#5063](https://github.com/paperless-ngx/paperless-ngx/pull/5063)) +- Enhancement: symmetric document links [@shamoon](https://github.com/shamoon) ([#4907](https://github.com/paperless-ngx/paperless-ngx/pull/4907)) +- Enhancement: shared icon \& shared by me filter [@shamoon](https://github.com/shamoon) ([#4859](https://github.com/paperless-ngx/paperless-ngx/pull/4859)) +- Chore(deps): Bump the django group with 3 updates [@dependabot](https://github.com/dependabot) ([#5046](https://github.com/paperless-ngx/paperless-ngx/pull/5046)) +- Chore(deps): Bump the major-versions group with 1 update [@dependabot](https://github.com/dependabot) ([#5047](https://github.com/paperless-ngx/paperless-ngx/pull/5047)) +- Chore(deps): Bump the small-changes group with 6 updates [@dependabot](https://github.com/dependabot) ([#5048](https://github.com/paperless-ngx/paperless-ngx/pull/5048)) +- Enhancement: Improved popup preview, respect embedded viewer, error handling [@shamoon](https://github.com/shamoon) ([#4947](https://github.com/paperless-ngx/paperless-ngx/pull/4947)) +- Enhancement: Add {original_filename}, {added_time} to title placeholders [@TTT7275](https://github.com/TTT7275) ([#4972](https://github.com/paperless-ngx/paperless-ngx/pull/4972)) +- Feature: Allow deletion of documents via the fuzzy matching command [@stumpylog](https://github.com/stumpylog) ([#4957](https://github.com/paperless-ngx/paperless-ngx/pull/4957)) +- Fix: allow system keyboard shortcuts in date fields [@shamoon](https://github.com/shamoon) ([#5009](https://github.com/paperless-ngx/paperless-ngx/pull/5009)) +- Enhancement: document link field fixes [@shamoon](https://github.com/shamoon) ([#5020](https://github.com/paperless-ngx/paperless-ngx/pull/5020)) +- Fix password change detection on profile edit [@shamoon](https://github.com/shamoon) ([#5028](https://github.com/paperless-ngx/paperless-ngx/pull/5028))
## paperless-ngx 2.1.3 ### Bug Fixes -- Fix: Document metadata is lost during barcode splitting [@stumpylog](https://github.com/stumpylog) ([#4982](https://github.com/paperless-ngx/paperless-ngx/pull/4982)) -- Fix: Export of custom field instances during a split manifest export [@stumpylog](https://github.com/stumpylog) ([#4984](https://github.com/paperless-ngx/paperless-ngx/pull/4984)) -- Fix: Apply user arguments even in the case of the forcing OCR [@stumpylog](https://github.com/stumpylog) ([#4981](https://github.com/paperless-ngx/paperless-ngx/pull/4981)) -- Fix: support show errors for select dropdowns [@shamoon](https://github.com/shamoon) ([#4979](https://github.com/paperless-ngx/paperless-ngx/pull/4979)) -- Fix: Don't attempt to parse none objects during date searching [@bogdal](https://github.com/bogdal) ([#4977](https://github.com/paperless-ngx/paperless-ngx/pull/4977)) +- Fix: Document metadata is lost during barcode splitting [@stumpylog](https://github.com/stumpylog) ([#4982](https://github.com/paperless-ngx/paperless-ngx/pull/4982)) +- Fix: Export of custom field instances during a split manifest export [@stumpylog](https://github.com/stumpylog) ([#4984](https://github.com/paperless-ngx/paperless-ngx/pull/4984)) +- Fix: Apply user arguments even in the case of the forcing OCR [@stumpylog](https://github.com/stumpylog) ([#4981](https://github.com/paperless-ngx/paperless-ngx/pull/4981)) +- Fix: support show errors for select dropdowns [@shamoon](https://github.com/shamoon) ([#4979](https://github.com/paperless-ngx/paperless-ngx/pull/4979)) +- Fix: Don't attempt to parse none objects during date searching [@bogdal](https://github.com/bogdal) ([#4977](https://github.com/paperless-ngx/paperless-ngx/pull/4977)) ### All App Changes
6 changes -- Refactor: Boost performance by reducing db queries [@bogdal](https://github.com/bogdal) ([#4990](https://github.com/paperless-ngx/paperless-ngx/pull/4990)) -- Fix: Document metadata is lost during barcode splitting [@stumpylog](https://github.com/stumpylog) ([#4982](https://github.com/paperless-ngx/paperless-ngx/pull/4982)) -- Fix: Export of custom field instances during a split manifest export [@stumpylog](https://github.com/stumpylog) ([#4984](https://github.com/paperless-ngx/paperless-ngx/pull/4984)) -- Fix: Apply user arguments even in the case of the forcing OCR [@stumpylog](https://github.com/stumpylog) ([#4981](https://github.com/paperless-ngx/paperless-ngx/pull/4981)) -- Fix: support show errors for select dropdowns [@shamoon](https://github.com/shamoon) ([#4979](https://github.com/paperless-ngx/paperless-ngx/pull/4979)) -- Fix: Don't attempt to parse none objects during date searching [@bogdal](https://github.com/bogdal) ([#4977](https://github.com/paperless-ngx/paperless-ngx/pull/4977)) +- Refactor: Boost performance by reducing db queries [@bogdal](https://github.com/bogdal) ([#4990](https://github.com/paperless-ngx/paperless-ngx/pull/4990)) +- Fix: Document metadata is lost during barcode splitting [@stumpylog](https://github.com/stumpylog) ([#4982](https://github.com/paperless-ngx/paperless-ngx/pull/4982)) +- Fix: Export of custom field instances during a split manifest export [@stumpylog](https://github.com/stumpylog) ([#4984](https://github.com/paperless-ngx/paperless-ngx/pull/4984)) +- Fix: Apply user arguments even in the case of the forcing OCR [@stumpylog](https://github.com/stumpylog) ([#4981](https://github.com/paperless-ngx/paperless-ngx/pull/4981)) +- Fix: support show errors for select dropdowns [@shamoon](https://github.com/shamoon) ([#4979](https://github.com/paperless-ngx/paperless-ngx/pull/4979)) +- Fix: Don't attempt to parse none objects during date searching [@bogdal](https://github.com/bogdal) ([#4977](https://github.com/paperless-ngx/paperless-ngx/pull/4977))
## paperless-ngx 2.1.2 ### Bug Fixes -- Fix: sort consumption templates by order by default [@shamoon](https://github.com/shamoon) ([#4956](https://github.com/paperless-ngx/paperless-ngx/pull/4956)) -- Fix: Updates gotenberg-client, including workaround for Gotenberg non-latin handling [@stumpylog](https://github.com/stumpylog) ([#4944](https://github.com/paperless-ngx/paperless-ngx/pull/4944)) -- Fix: allow text copy in pngx pdf viewer [@shamoon](https://github.com/shamoon) ([#4938](https://github.com/paperless-ngx/paperless-ngx/pull/4938)) -- Fix: Don't allow autocomplete searches to fail on schema field matches [@stumpylog](https://github.com/stumpylog) ([#4934](https://github.com/paperless-ngx/paperless-ngx/pull/4934)) -- Fix: Convert search dates to UTC in advanced search [@bogdal](https://github.com/bogdal) ([#4891](https://github.com/paperless-ngx/paperless-ngx/pull/4891)) -- Fix: Use the attachment filename so downstream template matching works [@stumpylog](https://github.com/stumpylog) ([#4931](https://github.com/paperless-ngx/paperless-ngx/pull/4931)) -- Fix: frontend handle autocomplete failure gracefully [@shamoon](https://github.com/shamoon) ([#4903](https://github.com/paperless-ngx/paperless-ngx/pull/4903)) +- Fix: sort consumption templates by order by default [@shamoon](https://github.com/shamoon) ([#4956](https://github.com/paperless-ngx/paperless-ngx/pull/4956)) +- Fix: Updates gotenberg-client, including workaround for Gotenberg non-latin handling [@stumpylog](https://github.com/stumpylog) ([#4944](https://github.com/paperless-ngx/paperless-ngx/pull/4944)) +- Fix: allow text copy in pngx pdf viewer [@shamoon](https://github.com/shamoon) ([#4938](https://github.com/paperless-ngx/paperless-ngx/pull/4938)) +- Fix: Don't allow autocomplete searches to fail on schema field matches [@stumpylog](https://github.com/stumpylog) ([#4934](https://github.com/paperless-ngx/paperless-ngx/pull/4934)) +- Fix: Convert search dates to UTC in advanced search [@bogdal](https://github.com/bogdal) ([#4891](https://github.com/paperless-ngx/paperless-ngx/pull/4891)) +- Fix: Use the attachment filename so downstream template matching works [@stumpylog](https://github.com/stumpylog) ([#4931](https://github.com/paperless-ngx/paperless-ngx/pull/4931)) +- Fix: frontend handle autocomplete failure gracefully [@shamoon](https://github.com/shamoon) ([#4903](https://github.com/paperless-ngx/paperless-ngx/pull/4903)) ### Dependencies -- Chore(deps-dev): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#4942](https://github.com/paperless-ngx/paperless-ngx/pull/4942)) -- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#4939](https://github.com/paperless-ngx/paperless-ngx/pull/4939)) +- Chore(deps-dev): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#4942](https://github.com/paperless-ngx/paperless-ngx/pull/4942)) +- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#4939](https://github.com/paperless-ngx/paperless-ngx/pull/4939)) ### All App Changes
9 changes -- Fix: sort consumption templates by order by default [@shamoon](https://github.com/shamoon) ([#4956](https://github.com/paperless-ngx/paperless-ngx/pull/4956)) -- Chore: reorganize api tests [@shamoon](https://github.com/shamoon) ([#4935](https://github.com/paperless-ngx/paperless-ngx/pull/4935)) -- Chore(deps-dev): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#4942](https://github.com/paperless-ngx/paperless-ngx/pull/4942)) -- Fix: allow text copy in pngx pdf viewer [@shamoon](https://github.com/shamoon) ([#4938](https://github.com/paperless-ngx/paperless-ngx/pull/4938)) -- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#4939](https://github.com/paperless-ngx/paperless-ngx/pull/4939)) -- Fix: Don't allow autocomplete searches to fail on schema field matches [@stumpylog](https://github.com/stumpylog) ([#4934](https://github.com/paperless-ngx/paperless-ngx/pull/4934)) -- Fix: Convert search dates to UTC in advanced search [@bogdal](https://github.com/bogdal) ([#4891](https://github.com/paperless-ngx/paperless-ngx/pull/4891)) -- Fix: Use the attachment filename so downstream template matching works [@stumpylog](https://github.com/stumpylog) ([#4931](https://github.com/paperless-ngx/paperless-ngx/pull/4931)) -- Fix: frontend handle autocomplete failure gracefully [@shamoon](https://github.com/shamoon) ([#4903](https://github.com/paperless-ngx/paperless-ngx/pull/4903)) +- Fix: sort consumption templates by order by default [@shamoon](https://github.com/shamoon) ([#4956](https://github.com/paperless-ngx/paperless-ngx/pull/4956)) +- Chore: reorganize api tests [@shamoon](https://github.com/shamoon) ([#4935](https://github.com/paperless-ngx/paperless-ngx/pull/4935)) +- Chore(deps-dev): Bump the small-changes group with 2 updates [@dependabot](https://github.com/dependabot) ([#4942](https://github.com/paperless-ngx/paperless-ngx/pull/4942)) +- Fix: allow text copy in pngx pdf viewer [@shamoon](https://github.com/shamoon) ([#4938](https://github.com/paperless-ngx/paperless-ngx/pull/4938)) +- Chore(deps-dev): Bump the development group with 1 update [@dependabot](https://github.com/dependabot) ([#4939](https://github.com/paperless-ngx/paperless-ngx/pull/4939)) +- Fix: Don't allow autocomplete searches to fail on schema field matches [@stumpylog](https://github.com/stumpylog) ([#4934](https://github.com/paperless-ngx/paperless-ngx/pull/4934)) +- Fix: Convert search dates to UTC in advanced search [@bogdal](https://github.com/bogdal) ([#4891](https://github.com/paperless-ngx/paperless-ngx/pull/4891)) +- Fix: Use the attachment filename so downstream template matching works [@stumpylog](https://github.com/stumpylog) ([#4931](https://github.com/paperless-ngx/paperless-ngx/pull/4931)) +- Fix: frontend handle autocomplete failure gracefully [@shamoon](https://github.com/shamoon) ([#4903](https://github.com/paperless-ngx/paperless-ngx/pull/4903))
## paperless-ngx 2.1.1 ### Bug Fixes -- Fix: disable toggle for share link creation without archive version, fix auto-copy in Safari [@shamoon](https://github.com/shamoon) ([#4885](https://github.com/paperless-ngx/paperless-ngx/pull/4885)) -- Fix: storage paths link incorrect in dashboard widget [@shamoon](https://github.com/shamoon) ([#4878](https://github.com/paperless-ngx/paperless-ngx/pull/4878)) -- Fix: respect baseURI for pdfjs worker URL [@shamoon](https://github.com/shamoon) ([#4865](https://github.com/paperless-ngx/paperless-ngx/pull/4865)) -- Fix: Allow users to configure the From email for password reset [@stumpylog](https://github.com/stumpylog) ([#4867](https://github.com/paperless-ngx/paperless-ngx/pull/4867)) -- Fix: dont show move icon for file tasks badge [@shamoon](https://github.com/shamoon) ([#4860](https://github.com/paperless-ngx/paperless-ngx/pull/4860)) +- Fix: disable toggle for share link creation without archive version, fix auto-copy in Safari [@shamoon](https://github.com/shamoon) ([#4885](https://github.com/paperless-ngx/paperless-ngx/pull/4885)) +- Fix: storage paths link incorrect in dashboard widget [@shamoon](https://github.com/shamoon) ([#4878](https://github.com/paperless-ngx/paperless-ngx/pull/4878)) +- Fix: respect baseURI for pdfjs worker URL [@shamoon](https://github.com/shamoon) ([#4865](https://github.com/paperless-ngx/paperless-ngx/pull/4865)) +- Fix: Allow users to configure the From email for password reset [@stumpylog](https://github.com/stumpylog) ([#4867](https://github.com/paperless-ngx/paperless-ngx/pull/4867)) +- Fix: dont show move icon for file tasks badge [@shamoon](https://github.com/shamoon) ([#4860](https://github.com/paperless-ngx/paperless-ngx/pull/4860)) ### Maintenance -- Chore: Simplifies how the documentation site is deployed [@stumpylog](https://github.com/stumpylog) ([#4858](https://github.com/paperless-ngx/paperless-ngx/pull/4858)) +- Chore: Simplifies how the documentation site is deployed [@stumpylog](https://github.com/stumpylog) ([#4858](https://github.com/paperless-ngx/paperless-ngx/pull/4858)) ### All App Changes
5 changes -- Fix: disable toggle for share link creation without archive version, fix auto-copy in Safari [@shamoon](https://github.com/shamoon) ([#4885](https://github.com/paperless-ngx/paperless-ngx/pull/4885)) -- Fix: storage paths link incorrect in dashboard widget [@shamoon](https://github.com/shamoon) ([#4878](https://github.com/paperless-ngx/paperless-ngx/pull/4878)) -- Fix: respect baseURI for pdfjs worker URL [@shamoon](https://github.com/shamoon) ([#4865](https://github.com/paperless-ngx/paperless-ngx/pull/4865)) -- Fix: Allow users to configure the From email for password reset [@stumpylog](https://github.com/stumpylog) ([#4867](https://github.com/paperless-ngx/paperless-ngx/pull/4867)) -- Fix: dont show move icon for file tasks badge [@shamoon](https://github.com/shamoon) ([#4860](https://github.com/paperless-ngx/paperless-ngx/pull/4860)) +- Fix: disable toggle for share link creation without archive version, fix auto-copy in Safari [@shamoon](https://github.com/shamoon) ([#4885](https://github.com/paperless-ngx/paperless-ngx/pull/4885)) +- Fix: storage paths link incorrect in dashboard widget [@shamoon](https://github.com/shamoon) ([#4878](https://github.com/paperless-ngx/paperless-ngx/pull/4878)) +- Fix: respect baseURI for pdfjs worker URL [@shamoon](https://github.com/shamoon) ([#4865](https://github.com/paperless-ngx/paperless-ngx/pull/4865)) +- Fix: Allow users to configure the From email for password reset [@stumpylog](https://github.com/stumpylog) ([#4867](https://github.com/paperless-ngx/paperless-ngx/pull/4867)) +- Fix: dont show move icon for file tasks badge [@shamoon](https://github.com/shamoon) ([#4860](https://github.com/paperless-ngx/paperless-ngx/pull/4860))
## paperless-ngx 2.1.0 ### Features -- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) -- Feature: Adds additional warnings during an import if it might fail [@stumpylog](https://github.com/stumpylog) ([#4814](https://github.com/paperless-ngx/paperless-ngx/pull/4814)) -- Feature: pngx PDF viewer with updated pdfjs [@shamoon](https://github.com/shamoon) ([#4679](https://github.com/paperless-ngx/paperless-ngx/pull/4679)) -- Enhancement: support automatically assigning custom fields via consumption templates [@shamoon](https://github.com/shamoon) ([#4727](https://github.com/paperless-ngx/paperless-ngx/pull/4727)) -- Feature: update user profile [@shamoon](https://github.com/shamoon) ([#4678](https://github.com/paperless-ngx/paperless-ngx/pull/4678)) -- Enhancement: Allow excluding mail attachments by name [@stumpylog](https://github.com/stumpylog) ([#4691](https://github.com/paperless-ngx/paperless-ngx/pull/4691)) -- Enhancement: auto-refresh logs \& tasks [@shamoon](https://github.com/shamoon) ([#4680](https://github.com/paperless-ngx/paperless-ngx/pull/4680)) +- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) +- Feature: Adds additional warnings during an import if it might fail [@stumpylog](https://github.com/stumpylog) ([#4814](https://github.com/paperless-ngx/paperless-ngx/pull/4814)) +- Feature: pngx PDF viewer with updated pdfjs [@shamoon](https://github.com/shamoon) ([#4679](https://github.com/paperless-ngx/paperless-ngx/pull/4679)) +- Enhancement: support automatically assigning custom fields via consumption templates [@shamoon](https://github.com/shamoon) ([#4727](https://github.com/paperless-ngx/paperless-ngx/pull/4727)) +- Feature: update user profile [@shamoon](https://github.com/shamoon) ([#4678](https://github.com/paperless-ngx/paperless-ngx/pull/4678)) +- Enhancement: Allow excluding mail attachments by name [@stumpylog](https://github.com/stumpylog) ([#4691](https://github.com/paperless-ngx/paperless-ngx/pull/4691)) +- Enhancement: auto-refresh logs \& tasks [@shamoon](https://github.com/shamoon) ([#4680](https://github.com/paperless-ngx/paperless-ngx/pull/4680)) ### Bug Fixes -- Fix: welcome widget text color [@shamoon](https://github.com/shamoon) ([#4829](https://github.com/paperless-ngx/paperless-ngx/pull/4829)) -- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) -- Fix: bulk edit object permissions should use permissions object [@shamoon](https://github.com/shamoon) ([#4797](https://github.com/paperless-ngx/paperless-ngx/pull/4797)) -- Fix: empty string for consumption template field should be interpreted as [@shamoon](https://github.com/shamoon) ([#4762](https://github.com/paperless-ngx/paperless-ngx/pull/4762)) -- Fix: use default permissions for objects created via dropdown [@shamoon](https://github.com/shamoon) ([#4778](https://github.com/paperless-ngx/paperless-ngx/pull/4778)) -- Fix: Alpha layer removal could allow duplicates [@stumpylog](https://github.com/stumpylog) ([#4781](https://github.com/paperless-ngx/paperless-ngx/pull/4781)) -- Fix: update checker broke in v2.0.0 [@shamoon](https://github.com/shamoon) ([#4773](https://github.com/paperless-ngx/paperless-ngx/pull/4773)) -- Fix: only show global drag-drop when files included [@shamoon](https://github.com/shamoon) ([#4767](https://github.com/paperless-ngx/paperless-ngx/pull/4767)) +- Fix: welcome widget text color [@shamoon](https://github.com/shamoon) ([#4829](https://github.com/paperless-ngx/paperless-ngx/pull/4829)) +- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) +- Fix: bulk edit object permissions should use permissions object [@shamoon](https://github.com/shamoon) ([#4797](https://github.com/paperless-ngx/paperless-ngx/pull/4797)) +- Fix: empty string for consumption template field should be interpreted as [@shamoon](https://github.com/shamoon) ([#4762](https://github.com/paperless-ngx/paperless-ngx/pull/4762)) +- Fix: use default permissions for objects created via dropdown [@shamoon](https://github.com/shamoon) ([#4778](https://github.com/paperless-ngx/paperless-ngx/pull/4778)) +- Fix: Alpha layer removal could allow duplicates [@stumpylog](https://github.com/stumpylog) ([#4781](https://github.com/paperless-ngx/paperless-ngx/pull/4781)) +- Fix: update checker broke in v2.0.0 [@shamoon](https://github.com/shamoon) ([#4773](https://github.com/paperless-ngx/paperless-ngx/pull/4773)) +- Fix: only show global drag-drop when files included [@shamoon](https://github.com/shamoon) ([#4767](https://github.com/paperless-ngx/paperless-ngx/pull/4767)) ### Documentation -- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) -- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) -- Documentation: Fix typos [@omahs](https://github.com/omahs) ([#4737](https://github.com/paperless-ngx/paperless-ngx/pull/4737)) +- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) +- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) +- Documentation: Fix typos [@omahs](https://github.com/omahs) ([#4737](https://github.com/paperless-ngx/paperless-ngx/pull/4737)) ### Maintenance -- Bump the actions group with 2 updates [@dependabot](https://github.com/dependabot) ([#4745](https://github.com/paperless-ngx/paperless-ngx/pull/4745)) +- Bump the actions group with 2 updates [@dependabot](https://github.com/dependabot) ([#4745](https://github.com/paperless-ngx/paperless-ngx/pull/4745)) ### Dependencies
7 changes -- Bump the development group with 6 updates [@dependabot](https://github.com/dependabot) ([#4838](https://github.com/paperless-ngx/paperless-ngx/pull/4838)) -- Bump the actions group with 2 updates [@dependabot](https://github.com/dependabot) ([#4745](https://github.com/paperless-ngx/paperless-ngx/pull/4745)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4756](https://github.com/paperless-ngx/paperless-ngx/pull/4756)) -- Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4744](https://github.com/paperless-ngx/paperless-ngx/pull/4744)) -- Bump [@playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot) ([#4749](https://github.com/paperless-ngx/paperless-ngx/pull/4749)) -- Bump wait-on from 7.0.1 to 7.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#4747](https://github.com/paperless-ngx/paperless-ngx/pull/4747)) -- Bump [@types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot](https://github.com/types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot) ([#4748](https://github.com/paperless-ngx/paperless-ngx/pull/4748)) +- Bump the development group with 6 updates [@dependabot](https://github.com/dependabot) ([#4838](https://github.com/paperless-ngx/paperless-ngx/pull/4838)) +- Bump the actions group with 2 updates [@dependabot](https://github.com/dependabot) ([#4745](https://github.com/paperless-ngx/paperless-ngx/pull/4745)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4756](https://github.com/paperless-ngx/paperless-ngx/pull/4756)) +- Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4744](https://github.com/paperless-ngx/paperless-ngx/pull/4744)) +- Bump [@playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot) ([#4749](https://github.com/paperless-ngx/paperless-ngx/pull/4749)) +- Bump wait-on from 7.0.1 to 7.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#4747](https://github.com/paperless-ngx/paperless-ngx/pull/4747)) +- Bump [@types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot](https://github.com/types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot) ([#4748](https://github.com/paperless-ngx/paperless-ngx/pull/4748))
### All App Changes @@ -3339,26 +3733,26 @@
20 changes -- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) -- Bump the development group with 6 updates [@dependabot](https://github.com/dependabot) ([#4838](https://github.com/paperless-ngx/paperless-ngx/pull/4838)) -- Fix: welcome widget text color [@shamoon](https://github.com/shamoon) ([#4829](https://github.com/paperless-ngx/paperless-ngx/pull/4829)) -- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) -- Feature: Adds additional warnings during an import if it might fail [@stumpylog](https://github.com/stumpylog) ([#4814](https://github.com/paperless-ngx/paperless-ngx/pull/4814)) -- Feature: pngx PDF viewer with updated pdfjs [@shamoon](https://github.com/shamoon) ([#4679](https://github.com/paperless-ngx/paperless-ngx/pull/4679)) -- Fix: bulk edit object permissions should use permissions object [@shamoon](https://github.com/shamoon) ([#4797](https://github.com/paperless-ngx/paperless-ngx/pull/4797)) -- Enhancement: support automatically assigning custom fields via consumption templates [@shamoon](https://github.com/shamoon) ([#4727](https://github.com/paperless-ngx/paperless-ngx/pull/4727)) -- Fix: empty string for consumption template field should be interpreted as [@shamoon](https://github.com/shamoon) ([#4762](https://github.com/paperless-ngx/paperless-ngx/pull/4762)) -- Fix: use default permissions for objects created via dropdown [@shamoon](https://github.com/shamoon) ([#4778](https://github.com/paperless-ngx/paperless-ngx/pull/4778)) -- Fix: Alpha layer removal could allow duplicates [@stumpylog](https://github.com/stumpylog) ([#4781](https://github.com/paperless-ngx/paperless-ngx/pull/4781)) -- Feature: update user profile [@shamoon](https://github.com/shamoon) ([#4678](https://github.com/paperless-ngx/paperless-ngx/pull/4678)) -- Fix: update checker broke in v2.0.0 [@shamoon](https://github.com/shamoon) ([#4773](https://github.com/paperless-ngx/paperless-ngx/pull/4773)) -- Fix: only show global drag-drop when files included [@shamoon](https://github.com/shamoon) ([#4767](https://github.com/paperless-ngx/paperless-ngx/pull/4767)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4756](https://github.com/paperless-ngx/paperless-ngx/pull/4756)) -- Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4744](https://github.com/paperless-ngx/paperless-ngx/pull/4744)) -- Bump [@playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot) ([#4749](https://github.com/paperless-ngx/paperless-ngx/pull/4749)) -- Bump wait-on from 7.0.1 to 7.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#4747](https://github.com/paperless-ngx/paperless-ngx/pull/4747)) -- Bump [@types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot](https://github.com/types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot) ([#4748](https://github.com/paperless-ngx/paperless-ngx/pull/4748)) -- Enhancement: auto-refresh logs \& tasks [@shamoon](https://github.com/shamoon) ([#4680](https://github.com/paperless-ngx/paperless-ngx/pull/4680)) +- Enhancement: implement document link custom field [@shamoon](https://github.com/shamoon) ([#4799](https://github.com/paperless-ngx/paperless-ngx/pull/4799)) +- Bump the development group with 6 updates [@dependabot](https://github.com/dependabot) ([#4838](https://github.com/paperless-ngx/paperless-ngx/pull/4838)) +- Fix: welcome widget text color [@shamoon](https://github.com/shamoon) ([#4829](https://github.com/paperless-ngx/paperless-ngx/pull/4829)) +- Fix: export consumption templates \& custom fields in exporter [@shamoon](https://github.com/shamoon) ([#4825](https://github.com/paperless-ngx/paperless-ngx/pull/4825)) +- Feature: Adds additional warnings during an import if it might fail [@stumpylog](https://github.com/stumpylog) ([#4814](https://github.com/paperless-ngx/paperless-ngx/pull/4814)) +- Feature: pngx PDF viewer with updated pdfjs [@shamoon](https://github.com/shamoon) ([#4679](https://github.com/paperless-ngx/paperless-ngx/pull/4679)) +- Fix: bulk edit object permissions should use permissions object [@shamoon](https://github.com/shamoon) ([#4797](https://github.com/paperless-ngx/paperless-ngx/pull/4797)) +- Enhancement: support automatically assigning custom fields via consumption templates [@shamoon](https://github.com/shamoon) ([#4727](https://github.com/paperless-ngx/paperless-ngx/pull/4727)) +- Fix: empty string for consumption template field should be interpreted as [@shamoon](https://github.com/shamoon) ([#4762](https://github.com/paperless-ngx/paperless-ngx/pull/4762)) +- Fix: use default permissions for objects created via dropdown [@shamoon](https://github.com/shamoon) ([#4778](https://github.com/paperless-ngx/paperless-ngx/pull/4778)) +- Fix: Alpha layer removal could allow duplicates [@stumpylog](https://github.com/stumpylog) ([#4781](https://github.com/paperless-ngx/paperless-ngx/pull/4781)) +- Feature: update user profile [@shamoon](https://github.com/shamoon) ([#4678](https://github.com/paperless-ngx/paperless-ngx/pull/4678)) +- Fix: update checker broke in v2.0.0 [@shamoon](https://github.com/shamoon) ([#4773](https://github.com/paperless-ngx/paperless-ngx/pull/4773)) +- Fix: only show global drag-drop when files included [@shamoon](https://github.com/shamoon) ([#4767](https://github.com/paperless-ngx/paperless-ngx/pull/4767)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4756](https://github.com/paperless-ngx/paperless-ngx/pull/4756)) +- Bump the frontend-jest-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4744](https://github.com/paperless-ngx/paperless-ngx/pull/4744)) +- Bump [@playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.39.0 to 1.40.1 in /src-ui @dependabot) ([#4749](https://github.com/paperless-ngx/paperless-ngx/pull/4749)) +- Bump wait-on from 7.0.1 to 7.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#4747](https://github.com/paperless-ngx/paperless-ngx/pull/4747)) +- Bump [@types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot](https://github.com/types/node from 20.8.10 to 20.10.2 in /src-ui @dependabot) ([#4748](https://github.com/paperless-ngx/paperless-ngx/pull/4748)) +- Enhancement: auto-refresh logs \& tasks [@shamoon](https://github.com/shamoon) ([#4680](https://github.com/paperless-ngx/paperless-ngx/pull/4680))
## paperless-ngx 2.0.1 @@ -3369,20 +3763,20 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti ### Bug Fixes -- Fix: Increase field the length for consumption template source [@stumpylog](https://github.com/stumpylog) ([#4719](https://github.com/paperless-ngx/paperless-ngx/pull/4719)) -- Fix: Set RGB color conversion strategy for PDF outputs [@stumpylog](https://github.com/stumpylog) ([#4709](https://github.com/paperless-ngx/paperless-ngx/pull/4709)) -- Fix: Add a warning about a low image DPI which may cause OCR to fail [@stumpylog](https://github.com/stumpylog) ([#4708](https://github.com/paperless-ngx/paperless-ngx/pull/4708)) -- Fix: share links for URLs containing 'api' incorrect in dropdown [@shamoon](https://github.com/shamoon) ([#4701](https://github.com/paperless-ngx/paperless-ngx/pull/4701)) +- Fix: Increase field the length for consumption template source [@stumpylog](https://github.com/stumpylog) ([#4719](https://github.com/paperless-ngx/paperless-ngx/pull/4719)) +- Fix: Set RGB color conversion strategy for PDF outputs [@stumpylog](https://github.com/stumpylog) ([#4709](https://github.com/paperless-ngx/paperless-ngx/pull/4709)) +- Fix: Add a warning about a low image DPI which may cause OCR to fail [@stumpylog](https://github.com/stumpylog) ([#4708](https://github.com/paperless-ngx/paperless-ngx/pull/4708)) +- Fix: share links for URLs containing 'api' incorrect in dropdown [@shamoon](https://github.com/shamoon) ([#4701](https://github.com/paperless-ngx/paperless-ngx/pull/4701)) ### All App Changes
4 changes -- Fix: Increase field the length for consumption template source [@stumpylog](https://github.com/stumpylog) ([#4719](https://github.com/paperless-ngx/paperless-ngx/pull/4719)) -- Fix: Set RGB color conversion strategy for PDF outputs [@stumpylog](https://github.com/stumpylog) ([#4709](https://github.com/paperless-ngx/paperless-ngx/pull/4709)) -- Fix: Add a warning about a low image DPI which may cause OCR to fail [@stumpylog](https://github.com/stumpylog) ([#4708](https://github.com/paperless-ngx/paperless-ngx/pull/4708)) -- Fix: share links for URLs containing 'api' incorrect in dropdown [@shamoon](https://github.com/shamoon) ([#4701](https://github.com/paperless-ngx/paperless-ngx/pull/4701)) +- Fix: Increase field the length for consumption template source [@stumpylog](https://github.com/stumpylog) ([#4719](https://github.com/paperless-ngx/paperless-ngx/pull/4719)) +- Fix: Set RGB color conversion strategy for PDF outputs [@stumpylog](https://github.com/stumpylog) ([#4709](https://github.com/paperless-ngx/paperless-ngx/pull/4709)) +- Fix: Add a warning about a low image DPI which may cause OCR to fail [@stumpylog](https://github.com/stumpylog) ([#4708](https://github.com/paperless-ngx/paperless-ngx/pull/4708)) +- Fix: share links for URLs containing 'api' incorrect in dropdown [@shamoon](https://github.com/shamoon) ([#4701](https://github.com/paperless-ngx/paperless-ngx/pull/4701))
## paperless-ngx 2.0.0 @@ -3393,172 +3787,172 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti ### Breaking Changes -- Breaking: Rename the environment variable for self-signed email certificates [@stumpylog](https://github.com/stumpylog) ([#4346](https://github.com/paperless-ngx/paperless-ngx/pull/4346)) -- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) -- Breaking: Remove ARMv7 building of the Docker image [@stumpylog](https://github.com/stumpylog) ([#3973](https://github.com/paperless-ngx/paperless-ngx/pull/3973)) +- Breaking: Rename the environment variable for self-signed email certificates [@stumpylog](https://github.com/stumpylog) ([#4346](https://github.com/paperless-ngx/paperless-ngx/pull/4346)) +- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) +- Breaking: Remove ARMv7 building of the Docker image [@stumpylog](https://github.com/stumpylog) ([#3973](https://github.com/paperless-ngx/paperless-ngx/pull/3973)) ### Notable Changes -- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) -- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) -- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) ### Features -- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) -- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) -- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) -- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) -- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) -- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) -- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) -- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) -- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) -- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) -- Feature: Include more updated base tools in Docker image [@stumpylog](https://github.com/stumpylog) ([#4319](https://github.com/paperless-ngx/paperless-ngx/pull/4319)) -- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) -- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) -- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) -- Feature: Updates Django to 4.2.5 [@stumpylog](https://github.com/stumpylog) ([#4278](https://github.com/paperless-ngx/paperless-ngx/pull/4278)) -- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) -- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) -- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) -- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) -- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) -- Enhancement: Allow the user the specify the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) -- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) -- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) -- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) -- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) -- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) -- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) -- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) -- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) -- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) -- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) -- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) -- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) +- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) +- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) +- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) +- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) +- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) +- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) +- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) +- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) +- Feature: Include more updated base tools in Docker image [@stumpylog](https://github.com/stumpylog) ([#4319](https://github.com/paperless-ngx/paperless-ngx/pull/4319)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) +- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) +- Feature: Updates Django to 4.2.5 [@stumpylog](https://github.com/stumpylog) ([#4278](https://github.com/paperless-ngx/paperless-ngx/pull/4278)) +- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) +- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) +- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) +- Enhancement: Allow the user the specify the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) +- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) +- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) +- Enhancement: Updates the underlying image to use Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4150](https://github.com/paperless-ngx/paperless-ngx/pull/4150)) +- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) +- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) +- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) +- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) +- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) ### Bug Fixes -- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) -- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) -- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) -- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) -- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) -- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) -- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) -- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) -- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) -- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) -- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) -- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) -- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) -- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) -- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) -- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) -- Fix: Updates to latest imap_tools which includes fix for the meta charset in HTML content [@stumpylog](https://github.com/stumpylog) ([#4355](https://github.com/paperless-ngx/paperless-ngx/pull/4355)) -- Fix: Missing creation of a folder in Docker image [@stumpylog](https://github.com/stumpylog) ([#4347](https://github.com/paperless-ngx/paperless-ngx/pull/4347)) -- Fix: Retry Tika parsing when Tika returns HTTP 500 [@stumpylog](https://github.com/stumpylog) ([#4334](https://github.com/paperless-ngx/paperless-ngx/pull/4334)) -- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) -- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) -- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) -- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) -- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) -- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) -- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) -- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) -- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) -- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) -- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) -- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) -- Fix: remove owner details from saved_views api endpoint [@shamoon](https://github.com/shamoon) ([#4158](https://github.com/paperless-ngx/paperless-ngx/pull/4158)) -- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) -- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) +- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) +- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) +- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) +- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) +- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) +- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) +- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) +- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) +- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) +- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) +- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) +- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) +- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) +- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: Updates to latest imap_tools which includes fix for the meta charset in HTML content [@stumpylog](https://github.com/stumpylog) ([#4355](https://github.com/paperless-ngx/paperless-ngx/pull/4355)) +- Fix: Missing creation of a folder in Docker image [@stumpylog](https://github.com/stumpylog) ([#4347](https://github.com/paperless-ngx/paperless-ngx/pull/4347)) +- Fix: Retry Tika parsing when Tika returns HTTP 500 [@stumpylog](https://github.com/stumpylog) ([#4334](https://github.com/paperless-ngx/paperless-ngx/pull/4334)) +- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) +- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) +- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) +- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) +- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) +- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) +- Fix: Set permissions before declaring volumes for rootless [@stumpylog](https://github.com/stumpylog) ([#4225](https://github.com/paperless-ngx/paperless-ngx/pull/4225)) +- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) +- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) +- Fix: Trim unneeded libraries from Docker image [@stumpylog](https://github.com/stumpylog) ([#4183](https://github.com/paperless-ngx/paperless-ngx/pull/4183)) +- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) +- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) +- Fix: remove owner details from saved_views api endpoint [@shamoon](https://github.com/shamoon) ([#4158](https://github.com/paperless-ngx/paperless-ngx/pull/4158)) +- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) +- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) ### Documentation -- Documentation: Update documentation to refer only to Docker Compose v2 command [@stumpylog](https://github.com/stumpylog) ([#4650](https://github.com/paperless-ngx/paperless-ngx/pull/4650)) -- Documentation: fix typo, add to features list [@tooomm](https://github.com/tooomm) ([#4624](https://github.com/paperless-ngx/paperless-ngx/pull/4624)) -- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) -- Documentation: Structure backup sections more clearly [@quantenProjects](https://github.com/quantenProjects) ([#4559](https://github.com/paperless-ngx/paperless-ngx/pull/4559)) -- Documentation: update docs, screenshots ahead of Paperless-ngx v2.0 [@shamoon](https://github.com/shamoon) ([#4542](https://github.com/paperless-ngx/paperless-ngx/pull/4542)) -- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) -- Add section for SELinux troubleshooting [@nachtjasmin](https://github.com/nachtjasmin) ([#4528](https://github.com/paperless-ngx/paperless-ngx/pull/4528)) -- Documentation: clarify document_exporter includes settings [@coaxial](https://github.com/coaxial) ([#4533](https://github.com/paperless-ngx/paperless-ngx/pull/4533)) -- Change: Install script improvements [@m-GDEV](https://github.com/m-GDEV) ([#4387](https://github.com/paperless-ngx/paperless-ngx/pull/4387)) -- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) -- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) -- Documentation: Remove old information about building the Docker image locally [@stumpylog](https://github.com/stumpylog) ([#4354](https://github.com/paperless-ngx/paperless-ngx/pull/4354)) -- Documentation enhancement: add direct links for all config vars [@shamoon](https://github.com/shamoon) ([#4237](https://github.com/paperless-ngx/paperless-ngx/pull/4237)) -- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) +- Documentation: Update documentation to refer only to Docker Compose v2 command [@stumpylog](https://github.com/stumpylog) ([#4650](https://github.com/paperless-ngx/paperless-ngx/pull/4650)) +- Documentation: fix typo, add to features list [@tooomm](https://github.com/tooomm) ([#4624](https://github.com/paperless-ngx/paperless-ngx/pull/4624)) +- Documentation: Add note that trash dir must exist [@shamoon](https://github.com/shamoon) ([#4608](https://github.com/paperless-ngx/paperless-ngx/pull/4608)) +- Documentation: Structure backup sections more clearly [@quantenProjects](https://github.com/quantenProjects) ([#4559](https://github.com/paperless-ngx/paperless-ngx/pull/4559)) +- Documentation: update docs, screenshots ahead of Paperless-ngx v2.0 [@shamoon](https://github.com/shamoon) ([#4542](https://github.com/paperless-ngx/paperless-ngx/pull/4542)) +- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) +- Add section for SELinux troubleshooting [@nachtjasmin](https://github.com/nachtjasmin) ([#4528](https://github.com/paperless-ngx/paperless-ngx/pull/4528)) +- Documentation: clarify document_exporter includes settings [@coaxial](https://github.com/coaxial) ([#4533](https://github.com/paperless-ngx/paperless-ngx/pull/4533)) +- Change: Install script improvements [@m-GDEV](https://github.com/m-GDEV) ([#4387](https://github.com/paperless-ngx/paperless-ngx/pull/4387)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) +- Documentation: Remove old information about building the Docker image locally [@stumpylog](https://github.com/stumpylog) ([#4354](https://github.com/paperless-ngx/paperless-ngx/pull/4354)) +- Documentation enhancement: add direct links for all config vars [@shamoon](https://github.com/shamoon) ([#4237](https://github.com/paperless-ngx/paperless-ngx/pull/4237)) +- Documentation: Fix fuzzy matching details [@stumpylog](https://github.com/stumpylog) ([#4207](https://github.com/paperless-ngx/paperless-ngx/pull/4207)) ### Maintenance -- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) -- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) -- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) -- Chore: Stop duplicated action runs against internal PRs [@stumpylog](https://github.com/stumpylog) ([#4430](https://github.com/paperless-ngx/paperless-ngx/pull/4430)) -- CI: separate frontend deps install [@shamoon](https://github.com/shamoon) ([#4336](https://github.com/paperless-ngx/paperless-ngx/pull/4336)) -- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) -- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) -- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) -- Chore: Updates dependabot to group more dependencies [@stumpylog](https://github.com/stumpylog) ([#4280](https://github.com/paperless-ngx/paperless-ngx/pull/4280)) -- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) -- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) -- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) -- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) -- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) -- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) -- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) -- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) -- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) -- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) +- Feature: Add Bulgarian translation [@shamoon](https://github.com/shamoon) ([#4470](https://github.com/paperless-ngx/paperless-ngx/pull/4470)) +- Chore: Stop duplicated action runs against internal PRs [@stumpylog](https://github.com/stumpylog) ([#4430](https://github.com/paperless-ngx/paperless-ngx/pull/4430)) +- CI: separate frontend deps install [@shamoon](https://github.com/shamoon) ([#4336](https://github.com/paperless-ngx/paperless-ngx/pull/4336)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Fix: Generate secret key with C locale and increase allowed characters [@stumpylog](https://github.com/stumpylog) ([#4277](https://github.com/paperless-ngx/paperless-ngx/pull/4277)) +- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) +- Chore: Updates dependabot to group more dependencies [@stumpylog](https://github.com/stumpylog) ([#4280](https://github.com/paperless-ngx/paperless-ngx/pull/4280)) +- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) +- CI: fix playwright browser version mismatch failures [@shamoon](https://github.com/shamoon) ([#4239](https://github.com/paperless-ngx/paperless-ngx/pull/4239)) +- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) +- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) +- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) +- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) +- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) +- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) +- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) +- Chore: update docker image and ci to node 20 [@shamoon](https://github.com/shamoon) ([#4184](https://github.com/paperless-ngx/paperless-ngx/pull/4184)) ### Dependencies
39 changes -- Chore: Bulk update of Python dependencies [@stumpylog](https://github.com/stumpylog) ([#4688](https://github.com/paperless-ngx/paperless-ngx/pull/4688)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) -- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) -- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) -- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) -- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) -- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) -- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) -- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) -- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) -- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) -- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) -- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) -- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) -- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) -- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) -- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) -- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) -- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) -- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) -- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) -- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) -- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) -- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) -- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) -- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) -- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) -- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) -- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) -- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) -- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) -- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) -- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) -- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) -- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) -- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104)) +- Chore: Bulk update of Python dependencies [@stumpylog](https://github.com/stumpylog) ([#4688](https://github.com/paperless-ngx/paperless-ngx/pull/4688)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) +- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) +- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) +- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) +- Bump the actions group with 1 update [@dependabot](https://github.com/dependabot) ([#4476](https://github.com/paperless-ngx/paperless-ngx/pull/4476)) +- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) +- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) +- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) +- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) +- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) +- Bump leonsteinhaeuser/project-beta-automations from 2.1.0 to 2.2.1 [@dependabot](https://github.com/dependabot) ([#4281](https://github.com/paperless-ngx/paperless-ngx/pull/4281)) +- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) +- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) +- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) +- Bump docker/login-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4221](https://github.com/paperless-ngx/paperless-ngx/pull/4221)) +- Bump docker/setup-buildx-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4220](https://github.com/paperless-ngx/paperless-ngx/pull/4220)) +- Bump docker/setup-qemu-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#4211](https://github.com/paperless-ngx/paperless-ngx/pull/4211)) +- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) +- Bump stumpylog/image-cleaner-action from 0.2.0 to 0.3.0 [@dependabot](https://github.com/dependabot) ([#4210](https://github.com/paperless-ngx/paperless-ngx/pull/4210)) +- Bump docker/metadata-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4209](https://github.com/paperless-ngx/paperless-ngx/pull/4209)) +- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) +- Bump docker/build-push-action from 4 to 5 [@dependabot](https://github.com/dependabot) ([#4212](https://github.com/paperless-ngx/paperless-ngx/pull/4212)) +- Bump actions/checkout from 3 to 4 [@dependabot](https://github.com/dependabot) ([#4208](https://github.com/paperless-ngx/paperless-ngx/pull/4208)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) +- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) +- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) +- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) +- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104))
### All App Changes @@ -3566,258 +3960,258 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti
95 changes -- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) -- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) -- Fix: dark mode inconsistencies in v2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4669](https://github.com/paperless-ngx/paperless-ngx/pull/4669)) -- Fix: dashboard saved view mobile width in v.2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4660](https://github.com/paperless-ngx/paperless-ngx/pull/4660)) -- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) -- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) -- Fix: Import of split-manifests can fail [@stumpylog](https://github.com/stumpylog) ([#4623](https://github.com/paperless-ngx/paperless-ngx/pull/4623)) -- Fix: sidebar views dont update after creation in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4619](https://github.com/paperless-ngx/paperless-ngx/pull/4619)) -- Fix: Prevent text wrap on consumption template label [@shamoon](https://github.com/shamoon) ([#4616](https://github.com/paperless-ngx/paperless-ngx/pull/4616)) -- Fix: increase width of labels in default perms settings [@shamoon](https://github.com/shamoon) ([#4612](https://github.com/paperless-ngx/paperless-ngx/pull/4612)) -- Fix: note deletion fails in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4602](https://github.com/paperless-ngx/paperless-ngx/pull/4602)) -- Fix: Handle override lists being None [@stumpylog](https://github.com/stumpylog) ([#4598](https://github.com/paperless-ngx/paperless-ngx/pull/4598)) -- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) -- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) -- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) -- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) -- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) -- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) -- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) -- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) -- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) -- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) -- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) -- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) -- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) -- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) -- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) -- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) -- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) -- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) -- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) -- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) -- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) -- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) -- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) -- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) -- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) -- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) -- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) -- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) -- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) -- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) -- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) -- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) -- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) -- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) -- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) -- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) -- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) -- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) -- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) -- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) -- Chore: Standardizes the imports across all the files and modules [@stumpylog](https://github.com/stumpylog) ([#4248](https://github.com/paperless-ngx/paperless-ngx/pull/4248)) -- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) -- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) -- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) -- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) -- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) -- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) -- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) -- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) -- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) -- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) -- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) -- Fix: completely hide upload widget if user does not have permissions [@nawramm](https://github.com/nawramm) ([#4198](https://github.com/paperless-ngx/paperless-ngx/pull/4198)) -- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) -- Enhancement: Allow the user the specify the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) -- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) -- Chore: change dark mode to use Bootstrap's color modes [@lkster](https://github.com/lkster) ([#4174](https://github.com/paperless-ngx/paperless-ngx/pull/4174)) -- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) -- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) -- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) -- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) -- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) -- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) -- Chore: Extend the live service utility for handling 503 errors [@stumpylog](https://github.com/stumpylog) ([#4143](https://github.com/paperless-ngx/paperless-ngx/pull/4143)) -- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) -- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) -- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) -- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) -- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) -- Change: PWA Manifest to Standalone Display [@swoga](https://github.com/swoga) ([#4129](https://github.com/paperless-ngx/paperless-ngx/pull/4129)) -- Enhancement: add --id-range for document_retagger [@kamilkosek](https://github.com/kamilkosek) ([#4080](https://github.com/paperless-ngx/paperless-ngx/pull/4080)) -- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) -- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) -- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) -- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) -- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) -- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) -- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) -- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104)) +- Fix: Add missing spaces to help string in [@joouha](https://github.com/joouha) ([#4674](https://github.com/paperless-ngx/paperless-ngx/pull/4674)) +- Fix: Typo invalidates precondition for doctype, resulting in Exception [@ArminGruner](https://github.com/ArminGruner) ([#4668](https://github.com/paperless-ngx/paperless-ngx/pull/4668)) +- Fix: dark mode inconsistencies in v2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4669](https://github.com/paperless-ngx/paperless-ngx/pull/4669)) +- Fix: dashboard saved view mobile width in v.2.0.0 beta.rc1 [@shamoon](https://github.com/shamoon) ([#4660](https://github.com/paperless-ngx/paperless-ngx/pull/4660)) +- Fix: Miscellaneous visual fixes in v2.0.0-beta.rc1 2 [@shamoon](https://github.com/shamoon) ([#4635](https://github.com/paperless-ngx/paperless-ngx/pull/4635)) +- Fix: Delay consumption after MODIFY inotify events [@frozenbrain](https://github.com/frozenbrain) ([#4626](https://github.com/paperless-ngx/paperless-ngx/pull/4626)) +- Fix: Import of split-manifests can fail [@stumpylog](https://github.com/stumpylog) ([#4623](https://github.com/paperless-ngx/paperless-ngx/pull/4623)) +- Fix: sidebar views dont update after creation in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4619](https://github.com/paperless-ngx/paperless-ngx/pull/4619)) +- Fix: Prevent text wrap on consumption template label [@shamoon](https://github.com/shamoon) ([#4616](https://github.com/paperless-ngx/paperless-ngx/pull/4616)) +- Fix: increase width of labels in default perms settings [@shamoon](https://github.com/shamoon) ([#4612](https://github.com/paperless-ngx/paperless-ngx/pull/4612)) +- Fix: note deletion fails in v2.0.0-beta.rc1 [@shamoon](https://github.com/shamoon) ([#4602](https://github.com/paperless-ngx/paperless-ngx/pull/4602)) +- Fix: Handle override lists being None [@stumpylog](https://github.com/stumpylog) ([#4598](https://github.com/paperless-ngx/paperless-ngx/pull/4598)) +- Fix: Miscellaneous v2.0 visual fixes [@shamoon](https://github.com/shamoon) ([#4576](https://github.com/paperless-ngx/paperless-ngx/pull/4576)) +- Fix: Force UTF-8 for exporter manifests and don't allow escaping [@stumpylog](https://github.com/stumpylog) ([#4574](https://github.com/paperless-ngx/paperless-ngx/pull/4574)) +- Feature: compact notifications [@shamoon](https://github.com/shamoon) ([#4545](https://github.com/paperless-ngx/paperless-ngx/pull/4545)) +- Chore: Backend bulk updates [@stumpylog](https://github.com/stumpylog) ([#4509](https://github.com/paperless-ngx/paperless-ngx/pull/4509)) +- Fix: plain text preview overflows [@shamoon](https://github.com/shamoon) ([#4555](https://github.com/paperless-ngx/paperless-ngx/pull/4555)) +- Feature: Hungarian translation [@shamoon](https://github.com/shamoon) ([#4552](https://github.com/paperless-ngx/paperless-ngx/pull/4552)) +- Chore: Cleanup command arguments and standardize process count handling [@stumpylog](https://github.com/stumpylog) ([#4541](https://github.com/paperless-ngx/paperless-ngx/pull/4541)) +- Chore: API support for id args for documents \& objects [@shamoon](https://github.com/shamoon) ([#4519](https://github.com/paperless-ngx/paperless-ngx/pull/4519)) +- Fix: add permissions for custom fields with migration [@shamoon](https://github.com/shamoon) ([#4513](https://github.com/paperless-ngx/paperless-ngx/pull/4513)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4479](https://github.com/paperless-ngx/paperless-ngx/pull/4479)) +- Bump [@playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot](https://github.com/playwright/test from 1.38.1 to 1.39.0 in /src-ui @dependabot) ([#4480](https://github.com/paperless-ngx/paperless-ngx/pull/4480)) +- Bump concurrently from 8.2.1 to 8.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4481](https://github.com/paperless-ngx/paperless-ngx/pull/4481)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#4478](https://github.com/paperless-ngx/paperless-ngx/pull/4478)) +- Bump the frontend-angular-dependencies group in /src-ui with 14 updates [@dependabot](https://github.com/dependabot) ([#4477](https://github.com/paperless-ngx/paperless-ngx/pull/4477)) +- Fix: visually hidden text breaks delete button wrap [@shamoon](https://github.com/shamoon) ([#4462](https://github.com/paperless-ngx/paperless-ngx/pull/4462)) +- Fix: API statistics document_file_type_counts return type [@shamoon](https://github.com/shamoon) ([#4464](https://github.com/paperless-ngx/paperless-ngx/pull/4464)) +- Fix: Always return a list for audit log check [@shamoon](https://github.com/shamoon) ([#4463](https://github.com/paperless-ngx/paperless-ngx/pull/4463)) +- Feature: Audit Trail [@nanokatz](https://github.com/nanokatz) ([#4425](https://github.com/paperless-ngx/paperless-ngx/pull/4425)) +- Fix: Only create a Correspondent if the email matches rule filters [@stumpylog](https://github.com/stumpylog) ([#4431](https://github.com/paperless-ngx/paperless-ngx/pull/4431)) +- Fix: Combination of consume template with recursive tagging [@stumpylog](https://github.com/stumpylog) ([#4442](https://github.com/paperless-ngx/paperless-ngx/pull/4442)) +- Feature: Add ahead of time compression of the static files for x86_64 [@stumpylog](https://github.com/stumpylog) ([#4390](https://github.com/paperless-ngx/paperless-ngx/pull/4390)) +- Feature: sort sidebar views [@shamoon](https://github.com/shamoon) ([#4381](https://github.com/paperless-ngx/paperless-ngx/pull/4381)) +- Feature: Switches to a new client to handle communication with Gotenberg [@stumpylog](https://github.com/stumpylog) ([#4391](https://github.com/paperless-ngx/paperless-ngx/pull/4391)) +- barcode logic: strip non-numeric characters from detected ASN string [@queaker](https://github.com/queaker) ([#4379](https://github.com/paperless-ngx/paperless-ngx/pull/4379)) +- Bump [@babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot](https://github.com/babel/traverse from 7.22.11 to 7.23.2 in /src-ui @dependabot) ([#4389](https://github.com/paperless-ngx/paperless-ngx/pull/4389)) +- Fix: replace drag drop \& clipboard deps with angular cdk [@shamoon](https://github.com/shamoon) ([#4362](https://github.com/paperless-ngx/paperless-ngx/pull/4362)) +- Fix: update document modified time on note creation / deletion [@shamoon](https://github.com/shamoon) ([#4374](https://github.com/paperless-ngx/paperless-ngx/pull/4374)) +- Fix: correct set owner API location in docs, additional test [@shamoon](https://github.com/shamoon) ([#4366](https://github.com/paperless-ngx/paperless-ngx/pull/4366)) +- Fix: get highest ASN regardless of user [@shamoon](https://github.com/shamoon) ([#4326](https://github.com/paperless-ngx/paperless-ngx/pull/4326)) +- Bump postcss from 8.4.12 to 8.4.31 in /src/paperless_mail/templates [@dependabot](https://github.com/dependabot) ([#4318](https://github.com/paperless-ngx/paperless-ngx/pull/4318)) +- CI: speed-up frontend tests on ci [@shamoon](https://github.com/shamoon) ([#4316](https://github.com/paperless-ngx/paperless-ngx/pull/4316)) +- Bump [@types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot](https://github.com/types/node from 20.7.0 to 20.8.0 in /src-ui @dependabot) ([#4303](https://github.com/paperless-ngx/paperless-ngx/pull/4303)) +- Bump the frontend-angular-dependencies group in /src-ui with 8 updates [@dependabot](https://github.com/dependabot) ([#4302](https://github.com/paperless-ngx/paperless-ngx/pull/4302)) +- Feature: password reset [@shamoon](https://github.com/shamoon) ([#4289](https://github.com/paperless-ngx/paperless-ngx/pull/4289)) +- Enhancement: dashboard improvements, drag-n-drop reorder dashboard views [@shamoon](https://github.com/shamoon) ([#4252](https://github.com/paperless-ngx/paperless-ngx/pull/4252)) +- Fix: long notes cause visual overflow [@shamoon](https://github.com/shamoon) ([#4287](https://github.com/paperless-ngx/paperless-ngx/pull/4287)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4283](https://github.com/paperless-ngx/paperless-ngx/pull/4283)) +- Bump the frontend-angular-dependencies group in /src-ui with 10 updates [@dependabot](https://github.com/dependabot) ([#4282](https://github.com/paperless-ngx/paperless-ngx/pull/4282)) +- Bump [@types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot](https://github.com/types/node from 20.6.3 to 20.7.0 in /src-ui @dependabot) ([#4284](https://github.com/paperless-ngx/paperless-ngx/pull/4284)) +- Fix: Ensures all old connections are closed in certain long lived places [@stumpylog](https://github.com/stumpylog) ([#4265](https://github.com/paperless-ngx/paperless-ngx/pull/4265)) +- Change: update translation string for tasks dialog [@shamoon](https://github.com/shamoon) ([#4263](https://github.com/paperless-ngx/paperless-ngx/pull/4263)) +- Enhancement: settings reorganization \& improvements, separate admin section [@shamoon](https://github.com/shamoon) ([#4251](https://github.com/paperless-ngx/paperless-ngx/pull/4251)) +- Chore: Standardizes the imports across all the files and modules [@stumpylog](https://github.com/stumpylog) ([#4248](https://github.com/paperless-ngx/paperless-ngx/pull/4248)) +- Feature: consumption templates [@shamoon](https://github.com/shamoon) ([#4196](https://github.com/paperless-ngx/paperless-ngx/pull/4196)) +- Enhancement: support default permissions for object creation via frontend [@shamoon](https://github.com/shamoon) ([#4233](https://github.com/paperless-ngx/paperless-ngx/pull/4233)) +- Fix: Set a non-zero polling internal when inotify cannot import [@stumpylog](https://github.com/stumpylog) ([#4230](https://github.com/paperless-ngx/paperless-ngx/pull/4230)) +- Bump zone.js from 0.13.1 to 0.13.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#4223](https://github.com/paperless-ngx/paperless-ngx/pull/4223)) +- Bump [@types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot](https://github.com/types/node from 20.5.8 to 20.6.3 in /src-ui @dependabot) ([#4224](https://github.com/paperless-ngx/paperless-ngx/pull/4224)) +- Bump the frontend-angular-dependencies group in /src-ui with 2 updates [@dependabot](https://github.com/dependabot) ([#4222](https://github.com/paperless-ngx/paperless-ngx/pull/4222)) +- Bump bootstrap from 5.3.1 to 5.3.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4217](https://github.com/paperless-ngx/paperless-ngx/pull/4217)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4215](https://github.com/paperless-ngx/paperless-ngx/pull/4215)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4218](https://github.com/paperless-ngx/paperless-ngx/pull/4218)) +- Bump uuid from 9.0.0 to 9.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4216](https://github.com/paperless-ngx/paperless-ngx/pull/4216)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#4213](https://github.com/paperless-ngx/paperless-ngx/pull/4213)) +- Enhancement: bulk edit object permissions [@shamoon](https://github.com/shamoon) ([#4176](https://github.com/paperless-ngx/paperless-ngx/pull/4176)) +- Fix: completely hide upload widget if user does not have permissions [@nawramm](https://github.com/nawramm) ([#4198](https://github.com/paperless-ngx/paperless-ngx/pull/4198)) +- Fix: application of theme color vars at root [@shamoon](https://github.com/shamoon) ([#4193](https://github.com/paperless-ngx/paperless-ngx/pull/4193)) +- Enhancement: Allow the user the specify the export zip file name [@stumpylog](https://github.com/stumpylog) ([#4189](https://github.com/paperless-ngx/paperless-ngx/pull/4189)) +- Feature: Share links [@shamoon](https://github.com/shamoon) ([#3996](https://github.com/paperless-ngx/paperless-ngx/pull/3996)) +- Chore: change dark mode to use Bootstrap's color modes [@lkster](https://github.com/lkster) ([#4174](https://github.com/paperless-ngx/paperless-ngx/pull/4174)) +- Fix: support storage path placeholder via API [@shamoon](https://github.com/shamoon) ([#4179](https://github.com/paperless-ngx/paperless-ngx/pull/4179)) +- Fix: Logs the errors during thumbnail generation [@stumpylog](https://github.com/stumpylog) ([#4171](https://github.com/paperless-ngx/paperless-ngx/pull/4171)) +- Feature: New management command for fuzzy matching document content [@stumpylog](https://github.com/stumpylog) ([#4160](https://github.com/paperless-ngx/paperless-ngx/pull/4160)) +- Breaking: Drop support for Python 3.8 [@stumpylog](https://github.com/stumpylog) ([#4156](https://github.com/paperless-ngx/paperless-ngx/pull/4156)) +- Fix: dashboard widget card borders hidden by bkgd color [@shamoon](https://github.com/shamoon) ([#4155](https://github.com/paperless-ngx/paperless-ngx/pull/4155)) +- Enhancement: frontend better handle slow backend requests [@shamoon](https://github.com/shamoon) ([#4055](https://github.com/paperless-ngx/paperless-ngx/pull/4055)) +- Chore: Extend the live service utility for handling 503 errors [@stumpylog](https://github.com/stumpylog) ([#4143](https://github.com/paperless-ngx/paperless-ngx/pull/4143)) +- Chore: update docker image \& ci testing node to v18 [@shamoon](https://github.com/shamoon) ([#4149](https://github.com/paperless-ngx/paperless-ngx/pull/4149)) +- Fix: hide entire add user / group buttons if insufficient permissions [@shamoon](https://github.com/shamoon) ([#4133](https://github.com/paperless-ngx/paperless-ngx/pull/4133)) +- Enhancement: Improved error notifications [@shamoon](https://github.com/shamoon) ([#4062](https://github.com/paperless-ngx/paperless-ngx/pull/4062)) +- Feature: Official support for Python 3.11 [@stumpylog](https://github.com/stumpylog) ([#4146](https://github.com/paperless-ngx/paperless-ngx/pull/4146)) +- Chore: Unlock dependencies \& update them all [@stumpylog](https://github.com/stumpylog) ([#4142](https://github.com/paperless-ngx/paperless-ngx/pull/4142)) +- Change: PWA Manifest to Standalone Display [@swoga](https://github.com/swoga) ([#4129](https://github.com/paperless-ngx/paperless-ngx/pull/4129)) +- Enhancement: add --id-range for document_retagger [@kamilkosek](https://github.com/kamilkosek) ([#4080](https://github.com/paperless-ngx/paperless-ngx/pull/4080)) +- Enhancement: Add Afrikaans, Greek \& Norwegian languages [@shamoon](https://github.com/shamoon) ([#4088](https://github.com/paperless-ngx/paperless-ngx/pull/4088)) +- Enhancement: add task id to pre/post consume script as env [@andreheuer](https://github.com/andreheuer) ([#4037](https://github.com/paperless-ngx/paperless-ngx/pull/4037)) +- Enhancement: update bootstrap to v5.3.1 for backend static pages [@shamoon](https://github.com/shamoon) ([#4060](https://github.com/paperless-ngx/paperless-ngx/pull/4060)) +- Bump the frontend-jest-dependencies group in /src-ui with 4 updates [@dependabot](https://github.com/dependabot) ([#4112](https://github.com/paperless-ngx/paperless-ngx/pull/4112)) +- Bump tslib from 2.6.1 to 2.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#4108](https://github.com/paperless-ngx/paperless-ngx/pull/4108)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#4106](https://github.com/paperless-ngx/paperless-ngx/pull/4106)) +- Bump concurrently from 8.2.0 to 8.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#4111](https://github.com/paperless-ngx/paperless-ngx/pull/4111)) +- Bump [@types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot](https://github.com/types/node from 20.4.5 to 20.5.8 in /src-ui @dependabot) ([#4110](https://github.com/paperless-ngx/paperless-ngx/pull/4110)) +- Bump the frontend-angular-dependencies group in /src-ui with 19 updates [@dependabot](https://github.com/dependabot) ([#4104](https://github.com/paperless-ngx/paperless-ngx/pull/4104))
## paperless-ngx 1.17.4 ### Bug Fixes -- Fix: ghostscript rendering error doesn't trigger frontend failure message [@shamoon](https://github.com/shamoon) ([#4092](https://github.com/paperless-ngx/paperless-ngx/pull/4092)) +- Fix: ghostscript rendering error doesn't trigger frontend failure message [@shamoon](https://github.com/shamoon) ([#4092](https://github.com/paperless-ngx/paperless-ngx/pull/4092)) ### All App Changes -- Fix: ghostscript rendering error doesn't trigger frontend failure message [@shamoon](https://github.com/shamoon) ([#4092](https://github.com/paperless-ngx/paperless-ngx/pull/4092)) +- Fix: ghostscript rendering error doesn't trigger frontend failure message [@shamoon](https://github.com/shamoon) ([#4092](https://github.com/paperless-ngx/paperless-ngx/pull/4092)) ## paperless-ngx 1.17.3 ### Bug Fixes -- Fix: When PDF/A rendering fails, add a consideration for the user to add args to override [@stumpylog](https://github.com/stumpylog) ([#4083](https://github.com/paperless-ngx/paperless-ngx/pull/4083)) +- Fix: When PDF/A rendering fails, add a consideration for the user to add args to override [@stumpylog](https://github.com/stumpylog) ([#4083](https://github.com/paperless-ngx/paperless-ngx/pull/4083)) ### Dependencies -- Chore: update frontend PDF viewer (including pdf-js) [@shamoon](https://github.com/shamoon) ([#4065](https://github.com/paperless-ngx/paperless-ngx/pull/4065)) +- Chore: update frontend PDF viewer (including pdf-js) [@shamoon](https://github.com/shamoon) ([#4065](https://github.com/paperless-ngx/paperless-ngx/pull/4065)) ### Maintenance -- Dev: Upload code coverage in the same job [@stumpylog](https://github.com/stumpylog) ([#4084](https://github.com/paperless-ngx/paperless-ngx/pull/4084)) +- Dev: Upload code coverage in the same job [@stumpylog](https://github.com/stumpylog) ([#4084](https://github.com/paperless-ngx/paperless-ngx/pull/4084)) ### All App Changes
3 changes -- Fix: When PDF/A rendering fails, add a consideration for the user to add args to override [@stumpylog](https://github.com/stumpylog) ([#4083](https://github.com/paperless-ngx/paperless-ngx/pull/4083)) -- Chore: update frontend PDF viewer (including pdf-js) [@shamoon](https://github.com/shamoon) ([#4065](https://github.com/paperless-ngx/paperless-ngx/pull/4065)) -- Chore: Prepare for Python 3.11 support [@stumpylog](https://github.com/stumpylog) ([#4066](https://github.com/paperless-ngx/paperless-ngx/pull/4066)) +- Fix: When PDF/A rendering fails, add a consideration for the user to add args to override [@stumpylog](https://github.com/stumpylog) ([#4083](https://github.com/paperless-ngx/paperless-ngx/pull/4083)) +- Chore: update frontend PDF viewer (including pdf-js) [@shamoon](https://github.com/shamoon) ([#4065](https://github.com/paperless-ngx/paperless-ngx/pull/4065)) +- Chore: Prepare for Python 3.11 support [@stumpylog](https://github.com/stumpylog) ([#4066](https://github.com/paperless-ngx/paperless-ngx/pull/4066))
## paperless-ngx 1.17.2 ### Features -- Enhancement: Allow to set a prefix for keys and channels in redis [@amo13](https://github.com/amo13) ([#3993](https://github.com/paperless-ngx/paperless-ngx/pull/3993)) +- Enhancement: Allow to set a prefix for keys and channels in redis [@amo13](https://github.com/amo13) ([#3993](https://github.com/paperless-ngx/paperless-ngx/pull/3993)) ### Bug Fixes -- Fix: Increase the HTTP timeouts for Tika/Gotenberg to maximum task time [@stumpylog](https://github.com/stumpylog) ([#4061](https://github.com/paperless-ngx/paperless-ngx/pull/4061)) -- Fix: Allow adding an SSL certificate for IMAP SSL context [@stumpylog](https://github.com/stumpylog) ([#4048](https://github.com/paperless-ngx/paperless-ngx/pull/4048)) -- Fix: tag creation sometimes retained search text [@shamoon](https://github.com/shamoon) ([#4038](https://github.com/paperless-ngx/paperless-ngx/pull/4038)) -- Fix: enforce permissions on bulk_edit operations [@shamoon](https://github.com/shamoon) ([#4007](https://github.com/paperless-ngx/paperless-ngx/pull/4007)) +- Fix: Increase the HTTP timeouts for Tika/Gotenberg to maximum task time [@stumpylog](https://github.com/stumpylog) ([#4061](https://github.com/paperless-ngx/paperless-ngx/pull/4061)) +- Fix: Allow adding an SSL certificate for IMAP SSL context [@stumpylog](https://github.com/stumpylog) ([#4048](https://github.com/paperless-ngx/paperless-ngx/pull/4048)) +- Fix: tag creation sometimes retained search text [@shamoon](https://github.com/shamoon) ([#4038](https://github.com/paperless-ngx/paperless-ngx/pull/4038)) +- Fix: enforce permissions on bulk_edit operations [@shamoon](https://github.com/shamoon) ([#4007](https://github.com/paperless-ngx/paperless-ngx/pull/4007)) ### All App Changes
6 changes -- Fix: Increase the HTTP timeouts for Tika/Gotenberg to maximum task time [@stumpylog](https://github.com/stumpylog) ([#4061](https://github.com/paperless-ngx/paperless-ngx/pull/4061)) -- Enhancement: disable / hide some UI buttons / elements if insufficient permissions, show errors [@shamoon](https://github.com/shamoon) ([#4014](https://github.com/paperless-ngx/paperless-ngx/pull/4014)) -- Fix: Allow adding an SSL certificate for IMAP SSL context [@stumpylog](https://github.com/stumpylog) ([#4048](https://github.com/paperless-ngx/paperless-ngx/pull/4048)) -- Fix: tag creation sometimes retained search text [@shamoon](https://github.com/shamoon) ([#4038](https://github.com/paperless-ngx/paperless-ngx/pull/4038)) -- Fix: enforce permissions on bulk_edit operations [@shamoon](https://github.com/shamoon) ([#4007](https://github.com/paperless-ngx/paperless-ngx/pull/4007)) -- Enhancement: Allow to set a prefix for keys and channels in redis [@amo13](https://github.com/amo13) ([#3993](https://github.com/paperless-ngx/paperless-ngx/pull/3993)) +- Fix: Increase the HTTP timeouts for Tika/Gotenberg to maximum task time [@stumpylog](https://github.com/stumpylog) ([#4061](https://github.com/paperless-ngx/paperless-ngx/pull/4061)) +- Enhancement: disable / hide some UI buttons / elements if insufficient permissions, show errors [@shamoon](https://github.com/shamoon) ([#4014](https://github.com/paperless-ngx/paperless-ngx/pull/4014)) +- Fix: Allow adding an SSL certificate for IMAP SSL context [@stumpylog](https://github.com/stumpylog) ([#4048](https://github.com/paperless-ngx/paperless-ngx/pull/4048)) +- Fix: tag creation sometimes retained search text [@shamoon](https://github.com/shamoon) ([#4038](https://github.com/paperless-ngx/paperless-ngx/pull/4038)) +- Fix: enforce permissions on bulk_edit operations [@shamoon](https://github.com/shamoon) ([#4007](https://github.com/paperless-ngx/paperless-ngx/pull/4007)) +- Enhancement: Allow to set a prefix for keys and channels in redis [@amo13](https://github.com/amo13) ([#3993](https://github.com/paperless-ngx/paperless-ngx/pull/3993))
## paperless-ngx 1.17.1 ### Features -- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) -- Feature: Add Ukrainian translation [@shamoon](https://github.com/shamoon) ([#3941](https://github.com/paperless-ngx/paperless-ngx/pull/3941)) +- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) +- Feature: Add Ukrainian translation [@shamoon](https://github.com/shamoon) ([#3941](https://github.com/paperless-ngx/paperless-ngx/pull/3941)) ### Bug Fixes -- Fix: handle ASN = 0 on frontend cards [@shamoon](https://github.com/shamoon) ([#3988](https://github.com/paperless-ngx/paperless-ngx/pull/3988)) -- Fix: improve light color filled primary button text legibility [@shamoon](https://github.com/shamoon) ([#3980](https://github.com/paperless-ngx/paperless-ngx/pull/3980)) -- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) -- Fix: handle very old date strings in correspondent list [@shamoon](https://github.com/shamoon) ([#3953](https://github.com/paperless-ngx/paperless-ngx/pull/3953)) +- Fix: handle ASN = 0 on frontend cards [@shamoon](https://github.com/shamoon) ([#3988](https://github.com/paperless-ngx/paperless-ngx/pull/3988)) +- Fix: improve light color filled primary button text legibility [@shamoon](https://github.com/shamoon) ([#3980](https://github.com/paperless-ngx/paperless-ngx/pull/3980)) +- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) +- Fix: handle very old date strings in correspondent list [@shamoon](https://github.com/shamoon) ([#3953](https://github.com/paperless-ngx/paperless-ngx/pull/3953)) ### Documentation -- docs(bare-metal): add new dependency [@bin101](https://github.com/bin101) ([#3931](https://github.com/paperless-ngx/paperless-ngx/pull/3931)) +- docs(bare-metal): add new dependency [@bin101](https://github.com/bin101) ([#3931](https://github.com/paperless-ngx/paperless-ngx/pull/3931)) ### Dependencies -- Chore: Loosen Pipfile restriction on some packages and update them [@stumpylog](https://github.com/stumpylog) ([#3972](https://github.com/paperless-ngx/paperless-ngx/pull/3972)) +- Chore: Loosen Pipfile restriction on some packages and update them [@stumpylog](https://github.com/stumpylog) ([#3972](https://github.com/paperless-ngx/paperless-ngx/pull/3972)) ### All App Changes
6 changes -- Fix: handle ASN = 0 on frontend cards [@shamoon](https://github.com/shamoon) ([#3988](https://github.com/paperless-ngx/paperless-ngx/pull/3988)) -- Fix: improve light color filled primary button text legibility [@shamoon](https://github.com/shamoon) ([#3980](https://github.com/paperless-ngx/paperless-ngx/pull/3980)) -- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) -- Fix: handle very old date strings in correspondent list [@shamoon](https://github.com/shamoon) ([#3953](https://github.com/paperless-ngx/paperless-ngx/pull/3953)) -- Chore: Reduces the 2 mail tests flakiness [@stumpylog](https://github.com/stumpylog) ([#3949](https://github.com/paperless-ngx/paperless-ngx/pull/3949)) -- Feature: Add Ukrainian translation [@shamoon](https://github.com/shamoon) ([#3941](https://github.com/paperless-ngx/paperless-ngx/pull/3941)) +- Fix: handle ASN = 0 on frontend cards [@shamoon](https://github.com/shamoon) ([#3988](https://github.com/paperless-ngx/paperless-ngx/pull/3988)) +- Fix: improve light color filled primary button text legibility [@shamoon](https://github.com/shamoon) ([#3980](https://github.com/paperless-ngx/paperless-ngx/pull/3980)) +- Fix / Enhancement: restrict status messages by owner if set \& improve 404 page [@shamoon](https://github.com/shamoon) ([#3959](https://github.com/paperless-ngx/paperless-ngx/pull/3959)) +- Fix: handle very old date strings in correspondent list [@shamoon](https://github.com/shamoon) ([#3953](https://github.com/paperless-ngx/paperless-ngx/pull/3953)) +- Chore: Reduces the 2 mail tests flakiness [@stumpylog](https://github.com/stumpylog) ([#3949](https://github.com/paperless-ngx/paperless-ngx/pull/3949)) +- Feature: Add Ukrainian translation [@shamoon](https://github.com/shamoon) ([#3941](https://github.com/paperless-ngx/paperless-ngx/pull/3941))
## paperless-ngx 1.17.0 ### Features -- Add support for additional UK date formats [@brainrecursion](https://github.com/brainrecursion) ([#3887](https://github.com/paperless-ngx/paperless-ngx/pull/3887)) -- Add 'doc_pk' to PAPERLESS_FILENAME_FORMAT handling [@mechanarchy](https://github.com/mechanarchy) ([#3861](https://github.com/paperless-ngx/paperless-ngx/pull/3861)) -- Feature: hover buttons for saved view widgets [@shamoon](https://github.com/shamoon) ([#3875](https://github.com/paperless-ngx/paperless-ngx/pull/3875)) -- Feature: collate two single-sided multipage scans [@brakhane](https://github.com/brakhane) ([#3784](https://github.com/paperless-ngx/paperless-ngx/pull/3784)) -- Feature: include global and object-level permissions in export / import [@shamoon](https://github.com/shamoon) ([#3672](https://github.com/paperless-ngx/paperless-ngx/pull/3672)) -- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) -- Feature: Add Slovak translation [@shamoon](https://github.com/shamoon) ([#3722](https://github.com/paperless-ngx/paperless-ngx/pull/3722)) +- Add support for additional UK date formats [@brainrecursion](https://github.com/brainrecursion) ([#3887](https://github.com/paperless-ngx/paperless-ngx/pull/3887)) +- Add 'doc_pk' to PAPERLESS_FILENAME_FORMAT handling [@mechanarchy](https://github.com/mechanarchy) ([#3861](https://github.com/paperless-ngx/paperless-ngx/pull/3861)) +- Feature: hover buttons for saved view widgets [@shamoon](https://github.com/shamoon) ([#3875](https://github.com/paperless-ngx/paperless-ngx/pull/3875)) +- Feature: collate two single-sided multipage scans [@brakhane](https://github.com/brakhane) ([#3784](https://github.com/paperless-ngx/paperless-ngx/pull/3784)) +- Feature: include global and object-level permissions in export / import [@shamoon](https://github.com/shamoon) ([#3672](https://github.com/paperless-ngx/paperless-ngx/pull/3672)) +- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) +- Feature: Add Slovak translation [@shamoon](https://github.com/shamoon) ([#3722](https://github.com/paperless-ngx/paperless-ngx/pull/3722)) ### Bug Fixes -- Fix: cancel possibly slow queries on doc details [@shamoon](https://github.com/shamoon) ([#3925](https://github.com/paperless-ngx/paperless-ngx/pull/3925)) -- Fix: note creation / deletion should respect doc permissions [@shamoon](https://github.com/shamoon) ([#3903](https://github.com/paperless-ngx/paperless-ngx/pull/3903)) -- Fix: notes show persistent scrollbars [@shamoon](https://github.com/shamoon) ([#3904](https://github.com/paperless-ngx/paperless-ngx/pull/3904)) -- Fix: Provide SSL context to IMAP client [@stumpylog](https://github.com/stumpylog) ([#3886](https://github.com/paperless-ngx/paperless-ngx/pull/3886)) -- Fix/enhancement: permissions for mail rules \& accounts [@shamoon](https://github.com/shamoon) ([#3869](https://github.com/paperless-ngx/paperless-ngx/pull/3869)) -- Fix: Classifier special case when no items are set to automatic matching [@stumpylog](https://github.com/stumpylog) ([#3858](https://github.com/paperless-ngx/paperless-ngx/pull/3858)) -- Fix: issues with copy2 or copystat and SELinux permissions [@stumpylog](https://github.com/stumpylog) ([#3847](https://github.com/paperless-ngx/paperless-ngx/pull/3847)) -- Fix: Parsing office document timestamps [@stumpylog](https://github.com/stumpylog) ([#3836](https://github.com/paperless-ngx/paperless-ngx/pull/3836)) -- Fix: Add warning to install script need for permissions [@shamoon](https://github.com/shamoon) ([#3835](https://github.com/paperless-ngx/paperless-ngx/pull/3835)) -- Fix interaction between API and barcode archive serial number [@stumpylog](https://github.com/stumpylog) ([#3834](https://github.com/paperless-ngx/paperless-ngx/pull/3834)) -- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) -- Fix: add UI tour step padding [@hakimio](https://github.com/hakimio) ([#3791](https://github.com/paperless-ngx/paperless-ngx/pull/3791)) -- Fix: translate file tasks types in footer [@shamoon](https://github.com/shamoon) ([#3749](https://github.com/paperless-ngx/paperless-ngx/pull/3749)) -- Fix: limit ng-select size for addition of filter button [@shamoon](https://github.com/shamoon) ([#3731](https://github.com/paperless-ngx/paperless-ngx/pull/3731)) +- Fix: cancel possibly slow queries on doc details [@shamoon](https://github.com/shamoon) ([#3925](https://github.com/paperless-ngx/paperless-ngx/pull/3925)) +- Fix: note creation / deletion should respect doc permissions [@shamoon](https://github.com/shamoon) ([#3903](https://github.com/paperless-ngx/paperless-ngx/pull/3903)) +- Fix: notes show persistent scrollbars [@shamoon](https://github.com/shamoon) ([#3904](https://github.com/paperless-ngx/paperless-ngx/pull/3904)) +- Fix: Provide SSL context to IMAP client [@stumpylog](https://github.com/stumpylog) ([#3886](https://github.com/paperless-ngx/paperless-ngx/pull/3886)) +- Fix/enhancement: permissions for mail rules \& accounts [@shamoon](https://github.com/shamoon) ([#3869](https://github.com/paperless-ngx/paperless-ngx/pull/3869)) +- Fix: Classifier special case when no items are set to automatic matching [@stumpylog](https://github.com/stumpylog) ([#3858](https://github.com/paperless-ngx/paperless-ngx/pull/3858)) +- Fix: issues with copy2 or copystat and SELinux permissions [@stumpylog](https://github.com/stumpylog) ([#3847](https://github.com/paperless-ngx/paperless-ngx/pull/3847)) +- Fix: Parsing office document timestamps [@stumpylog](https://github.com/stumpylog) ([#3836](https://github.com/paperless-ngx/paperless-ngx/pull/3836)) +- Fix: Add warning to install script need for permissions [@shamoon](https://github.com/shamoon) ([#3835](https://github.com/paperless-ngx/paperless-ngx/pull/3835)) +- Fix interaction between API and barcode archive serial number [@stumpylog](https://github.com/stumpylog) ([#3834](https://github.com/paperless-ngx/paperless-ngx/pull/3834)) +- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) +- Fix: add UI tour step padding [@hakimio](https://github.com/hakimio) ([#3791](https://github.com/paperless-ngx/paperless-ngx/pull/3791)) +- Fix: translate file tasks types in footer [@shamoon](https://github.com/shamoon) ([#3749](https://github.com/paperless-ngx/paperless-ngx/pull/3749)) +- Fix: limit ng-select size for addition of filter button [@shamoon](https://github.com/shamoon) ([#3731](https://github.com/paperless-ngx/paperless-ngx/pull/3731)) ### Documentation -- Documentation: improvements to grammar, spelling, indentation [@mechanarchy](https://github.com/mechanarchy) ([#3844](https://github.com/paperless-ngx/paperless-ngx/pull/3844)) +- Documentation: improvements to grammar, spelling, indentation [@mechanarchy](https://github.com/mechanarchy) ([#3844](https://github.com/paperless-ngx/paperless-ngx/pull/3844)) ### Maintenance -- Bump stumpylog/image-cleaner-action from 0.1.0 to 0.2.0 [@dependabot](https://github.com/dependabot) ([#3910](https://github.com/paperless-ngx/paperless-ngx/pull/3910)) -- Chore: group frontend angular dependabot updates [@shamoon](https://github.com/shamoon) ([#3750](https://github.com/paperless-ngx/paperless-ngx/pull/3750)) +- Bump stumpylog/image-cleaner-action from 0.1.0 to 0.2.0 [@dependabot](https://github.com/dependabot) ([#3910](https://github.com/paperless-ngx/paperless-ngx/pull/3910)) +- Chore: group frontend angular dependabot updates [@shamoon](https://github.com/shamoon) ([#3750](https://github.com/paperless-ngx/paperless-ngx/pull/3750)) ### Dependencies
17 changes -- Chore: Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@shamoon](https://github.com/shamoon) ([#3918](https://github.com/paperless-ngx/paperless-ngx/pull/3918)) -- Bump stumpylog/image-cleaner-action from 0.1.0 to 0.2.0 [@dependabot](https://github.com/dependabot) ([#3910](https://github.com/paperless-ngx/paperless-ngx/pull/3910)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#3911](https://github.com/paperless-ngx/paperless-ngx/pull/3911)) -- Bump tslib from 2.6.0 to 2.6.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3909](https://github.com/paperless-ngx/paperless-ngx/pull/3909)) -- Bump jest-environment-jsdom from 29.5.0 to 29.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3916](https://github.com/paperless-ngx/paperless-ngx/pull/3916)) -- Bump [@types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot](https://github.com/types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot) ([#3915](https://github.com/paperless-ngx/paperless-ngx/pull/3915)) -- Bump bootstrap from 5.3.0 to 5.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3914](https://github.com/paperless-ngx/paperless-ngx/pull/3914)) -- Bump [@playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot) ([#3912](https://github.com/paperless-ngx/paperless-ngx/pull/3912)) -- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#3906](https://github.com/paperless-ngx/paperless-ngx/pull/3906)) -- Chore: Update dependencies [@stumpylog](https://github.com/stumpylog) ([#3883](https://github.com/paperless-ngx/paperless-ngx/pull/3883)) -- Chore: Update Python dependencies [@stumpylog](https://github.com/stumpylog) ([#3842](https://github.com/paperless-ngx/paperless-ngx/pull/3842)) -- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#3826](https://github.com/paperless-ngx/paperless-ngx/pull/3826)) -- Bump [@typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot) ([#3829](https://github.com/paperless-ngx/paperless-ngx/pull/3829)) -- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#3828](https://github.com/paperless-ngx/paperless-ngx/pull/3828)) -- Bump [@playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot) ([#3827](https://github.com/paperless-ngx/paperless-ngx/pull/3827)) -- Bump semver from 5.7.1 to 5.7.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3793](https://github.com/paperless-ngx/paperless-ngx/pull/3793)) -- Chore: Bump Angular to v16 and other frontend packages [@dependabot](https://github.com/dependabot) ([#3727](https://github.com/paperless-ngx/paperless-ngx/pull/3727)) +- Chore: Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@shamoon](https://github.com/shamoon) ([#3918](https://github.com/paperless-ngx/paperless-ngx/pull/3918)) +- Bump stumpylog/image-cleaner-action from 0.1.0 to 0.2.0 [@dependabot](https://github.com/dependabot) ([#3910](https://github.com/paperless-ngx/paperless-ngx/pull/3910)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#3911](https://github.com/paperless-ngx/paperless-ngx/pull/3911)) +- Bump tslib from 2.6.0 to 2.6.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3909](https://github.com/paperless-ngx/paperless-ngx/pull/3909)) +- Bump jest-environment-jsdom from 29.5.0 to 29.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3916](https://github.com/paperless-ngx/paperless-ngx/pull/3916)) +- Bump [@types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot](https://github.com/types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot) ([#3915](https://github.com/paperless-ngx/paperless-ngx/pull/3915)) +- Bump bootstrap from 5.3.0 to 5.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3914](https://github.com/paperless-ngx/paperless-ngx/pull/3914)) +- Bump [@playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot) ([#3912](https://github.com/paperless-ngx/paperless-ngx/pull/3912)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#3906](https://github.com/paperless-ngx/paperless-ngx/pull/3906)) +- Chore: Update dependencies [@stumpylog](https://github.com/stumpylog) ([#3883](https://github.com/paperless-ngx/paperless-ngx/pull/3883)) +- Chore: Update Python dependencies [@stumpylog](https://github.com/stumpylog) ([#3842](https://github.com/paperless-ngx/paperless-ngx/pull/3842)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#3826](https://github.com/paperless-ngx/paperless-ngx/pull/3826)) +- Bump [@typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot) ([#3829](https://github.com/paperless-ngx/paperless-ngx/pull/3829)) +- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#3828](https://github.com/paperless-ngx/paperless-ngx/pull/3828)) +- Bump [@playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot) ([#3827](https://github.com/paperless-ngx/paperless-ngx/pull/3827)) +- Bump semver from 5.7.1 to 5.7.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3793](https://github.com/paperless-ngx/paperless-ngx/pull/3793)) +- Chore: Bump Angular to v16 and other frontend packages [@dependabot](https://github.com/dependabot) ([#3727](https://github.com/paperless-ngx/paperless-ngx/pull/3727))
### All App Changes @@ -3825,241 +4219,241 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti
35 changes -- Fix: cancel possibly slow queries on doc details [@shamoon](https://github.com/shamoon) ([#3925](https://github.com/paperless-ngx/paperless-ngx/pull/3925)) -- [BUG] Set office document creation date with timezone, if it is naive [@a17t](https://github.com/a17t) ([#3760](https://github.com/paperless-ngx/paperless-ngx/pull/3760)) -- Fix: note creation / deletion should respect doc permissions [@shamoon](https://github.com/shamoon) ([#3903](https://github.com/paperless-ngx/paperless-ngx/pull/3903)) -- Chore: Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@shamoon](https://github.com/shamoon) ([#3918](https://github.com/paperless-ngx/paperless-ngx/pull/3918)) -- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#3911](https://github.com/paperless-ngx/paperless-ngx/pull/3911)) -- Bump tslib from 2.6.0 to 2.6.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3909](https://github.com/paperless-ngx/paperless-ngx/pull/3909)) -- Bump jest-environment-jsdom from 29.5.0 to 29.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3916](https://github.com/paperless-ngx/paperless-ngx/pull/3916)) -- Bump [@types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot](https://github.com/types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot) ([#3915](https://github.com/paperless-ngx/paperless-ngx/pull/3915)) -- Bump bootstrap from 5.3.0 to 5.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3914](https://github.com/paperless-ngx/paperless-ngx/pull/3914)) -- Bump [@playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot) ([#3912](https://github.com/paperless-ngx/paperless-ngx/pull/3912)) -- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#3906](https://github.com/paperless-ngx/paperless-ngx/pull/3906)) -- Fix: notes show persistent scrollbars [@shamoon](https://github.com/shamoon) ([#3904](https://github.com/paperless-ngx/paperless-ngx/pull/3904)) -- Add support for additional UK date formats [@brainrecursion](https://github.com/brainrecursion) ([#3887](https://github.com/paperless-ngx/paperless-ngx/pull/3887)) -- Add 'doc_pk' to PAPERLESS_FILENAME_FORMAT handling [@mechanarchy](https://github.com/mechanarchy) ([#3861](https://github.com/paperless-ngx/paperless-ngx/pull/3861)) -- Fix: Provide SSL context to IMAP client [@stumpylog](https://github.com/stumpylog) ([#3886](https://github.com/paperless-ngx/paperless-ngx/pull/3886)) -- Feature: hover buttons for saved view widgets [@shamoon](https://github.com/shamoon) ([#3875](https://github.com/paperless-ngx/paperless-ngx/pull/3875)) -- Fix/enhancement: permissions for mail rules \& accounts [@shamoon](https://github.com/shamoon) ([#3869](https://github.com/paperless-ngx/paperless-ngx/pull/3869)) -- Chore: typing improvements [@stumpylog](https://github.com/stumpylog) ([#3860](https://github.com/paperless-ngx/paperless-ngx/pull/3860)) -- Fix: Classifier special case when no items are set to automatic matching [@stumpylog](https://github.com/stumpylog) ([#3858](https://github.com/paperless-ngx/paperless-ngx/pull/3858)) -- Fix: issues with copy2 or copystat and SELinux permissions [@stumpylog](https://github.com/stumpylog) ([#3847](https://github.com/paperless-ngx/paperless-ngx/pull/3847)) -- Chore: Update Python dependencies [@stumpylog](https://github.com/stumpylog) ([#3842](https://github.com/paperless-ngx/paperless-ngx/pull/3842)) -- Feature: include global and object-level permissions in export / import [@shamoon](https://github.com/shamoon) ([#3672](https://github.com/paperless-ngx/paperless-ngx/pull/3672)) -- Fix: Parsing office document timestamps [@stumpylog](https://github.com/stumpylog) ([#3836](https://github.com/paperless-ngx/paperless-ngx/pull/3836)) -- Fix interaction between API and barcode archive serial number [@stumpylog](https://github.com/stumpylog) ([#3834](https://github.com/paperless-ngx/paperless-ngx/pull/3834)) -- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#3826](https://github.com/paperless-ngx/paperless-ngx/pull/3826)) -- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) -- Bump [@typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot) ([#3829](https://github.com/paperless-ngx/paperless-ngx/pull/3829)) -- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#3828](https://github.com/paperless-ngx/paperless-ngx/pull/3828)) -- Bump [@playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot) ([#3827](https://github.com/paperless-ngx/paperless-ngx/pull/3827)) -- Bump semver from 5.7.1 to 5.7.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3793](https://github.com/paperless-ngx/paperless-ngx/pull/3793)) -- Fix: add UI tour step padding [@hakimio](https://github.com/hakimio) ([#3791](https://github.com/paperless-ngx/paperless-ngx/pull/3791)) -- Fix: translate file tasks types in footer [@shamoon](https://github.com/shamoon) ([#3749](https://github.com/paperless-ngx/paperless-ngx/pull/3749)) -- Feature: Add Slovak translation [@shamoon](https://github.com/shamoon) ([#3722](https://github.com/paperless-ngx/paperless-ngx/pull/3722)) -- Fix: limit ng-select size for addition of filter button [@shamoon](https://github.com/shamoon) ([#3731](https://github.com/paperless-ngx/paperless-ngx/pull/3731)) -- Chore: Bump Angular to v16 and other frontend packages [@dependabot](https://github.com/dependabot) ([#3727](https://github.com/paperless-ngx/paperless-ngx/pull/3727)) +- Fix: cancel possibly slow queries on doc details [@shamoon](https://github.com/shamoon) ([#3925](https://github.com/paperless-ngx/paperless-ngx/pull/3925)) +- [BUG] Set office document creation date with timezone, if it is naive [@a17t](https://github.com/a17t) ([#3760](https://github.com/paperless-ngx/paperless-ngx/pull/3760)) +- Fix: note creation / deletion should respect doc permissions [@shamoon](https://github.com/shamoon) ([#3903](https://github.com/paperless-ngx/paperless-ngx/pull/3903)) +- Chore: Bump the frontend-angular-dependencies group in /src-ui with 11 updates [@shamoon](https://github.com/shamoon) ([#3918](https://github.com/paperless-ngx/paperless-ngx/pull/3918)) +- Bump the frontend-eslint-dependencies group in /src-ui with 3 updates [@dependabot](https://github.com/dependabot) ([#3911](https://github.com/paperless-ngx/paperless-ngx/pull/3911)) +- Bump tslib from 2.6.0 to 2.6.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3909](https://github.com/paperless-ngx/paperless-ngx/pull/3909)) +- Bump jest-environment-jsdom from 29.5.0 to 29.6.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3916](https://github.com/paperless-ngx/paperless-ngx/pull/3916)) +- Bump [@types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot](https://github.com/types/node from 20.3.3 to 20.4.5 in /src-ui @dependabot) ([#3915](https://github.com/paperless-ngx/paperless-ngx/pull/3915)) +- Bump bootstrap from 5.3.0 to 5.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3914](https://github.com/paperless-ngx/paperless-ngx/pull/3914)) +- Bump [@playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.1 to 1.36.2 in /src-ui @dependabot) ([#3912](https://github.com/paperless-ngx/paperless-ngx/pull/3912)) +- Bump the frontend-jest-dependencies group in /src-ui with 1 update [@dependabot](https://github.com/dependabot) ([#3906](https://github.com/paperless-ngx/paperless-ngx/pull/3906)) +- Fix: notes show persistent scrollbars [@shamoon](https://github.com/shamoon) ([#3904](https://github.com/paperless-ngx/paperless-ngx/pull/3904)) +- Add support for additional UK date formats [@brainrecursion](https://github.com/brainrecursion) ([#3887](https://github.com/paperless-ngx/paperless-ngx/pull/3887)) +- Add 'doc_pk' to PAPERLESS_FILENAME_FORMAT handling [@mechanarchy](https://github.com/mechanarchy) ([#3861](https://github.com/paperless-ngx/paperless-ngx/pull/3861)) +- Fix: Provide SSL context to IMAP client [@stumpylog](https://github.com/stumpylog) ([#3886](https://github.com/paperless-ngx/paperless-ngx/pull/3886)) +- Feature: hover buttons for saved view widgets [@shamoon](https://github.com/shamoon) ([#3875](https://github.com/paperless-ngx/paperless-ngx/pull/3875)) +- Fix/enhancement: permissions for mail rules \& accounts [@shamoon](https://github.com/shamoon) ([#3869](https://github.com/paperless-ngx/paperless-ngx/pull/3869)) +- Chore: typing improvements [@stumpylog](https://github.com/stumpylog) ([#3860](https://github.com/paperless-ngx/paperless-ngx/pull/3860)) +- Fix: Classifier special case when no items are set to automatic matching [@stumpylog](https://github.com/stumpylog) ([#3858](https://github.com/paperless-ngx/paperless-ngx/pull/3858)) +- Fix: issues with copy2 or copystat and SELinux permissions [@stumpylog](https://github.com/stumpylog) ([#3847](https://github.com/paperless-ngx/paperless-ngx/pull/3847)) +- Chore: Update Python dependencies [@stumpylog](https://github.com/stumpylog) ([#3842](https://github.com/paperless-ngx/paperless-ngx/pull/3842)) +- Feature: include global and object-level permissions in export / import [@shamoon](https://github.com/shamoon) ([#3672](https://github.com/paperless-ngx/paperless-ngx/pull/3672)) +- Fix: Parsing office document timestamps [@stumpylog](https://github.com/stumpylog) ([#3836](https://github.com/paperless-ngx/paperless-ngx/pull/3836)) +- Fix interaction between API and barcode archive serial number [@stumpylog](https://github.com/stumpylog) ([#3834](https://github.com/paperless-ngx/paperless-ngx/pull/3834)) +- Bump the frontend-angular-dependencies group in /src-ui with 16 updates [@dependabot](https://github.com/dependabot) ([#3826](https://github.com/paperless-ngx/paperless-ngx/pull/3826)) +- Enhancement / Fix: Migrate encrypted png thumbnails to webp [@shamoon](https://github.com/shamoon) ([#3719](https://github.com/paperless-ngx/paperless-ngx/pull/3719)) +- Bump [@typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.60.1 to 6.1.0 in /src-ui @dependabot) ([#3829](https://github.com/paperless-ngx/paperless-ngx/pull/3829)) +- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#3828](https://github.com/paperless-ngx/paperless-ngx/pull/3828)) +- Bump [@playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot](https://github.com/playwright/test from 1.36.0 to 1.36.1 in /src-ui @dependabot) ([#3827](https://github.com/paperless-ngx/paperless-ngx/pull/3827)) +- Bump semver from 5.7.1 to 5.7.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3793](https://github.com/paperless-ngx/paperless-ngx/pull/3793)) +- Fix: add UI tour step padding [@hakimio](https://github.com/hakimio) ([#3791](https://github.com/paperless-ngx/paperless-ngx/pull/3791)) +- Fix: translate file tasks types in footer [@shamoon](https://github.com/shamoon) ([#3749](https://github.com/paperless-ngx/paperless-ngx/pull/3749)) +- Feature: Add Slovak translation [@shamoon](https://github.com/shamoon) ([#3722](https://github.com/paperless-ngx/paperless-ngx/pull/3722)) +- Fix: limit ng-select size for addition of filter button [@shamoon](https://github.com/shamoon) ([#3731](https://github.com/paperless-ngx/paperless-ngx/pull/3731)) +- Chore: Bump Angular to v16 and other frontend packages [@dependabot](https://github.com/dependabot) ([#3727](https://github.com/paperless-ngx/paperless-ngx/pull/3727))
## paperless-ngx 1.16.5 ### Features -- Feature: support barcode upscaling for better detection of small barcodes [@bmachek](https://github.com/bmachek) ([#3655](https://github.com/paperless-ngx/paperless-ngx/pull/3655)) +- Feature: support barcode upscaling for better detection of small barcodes [@bmachek](https://github.com/bmachek) ([#3655](https://github.com/paperless-ngx/paperless-ngx/pull/3655)) ### Bug Fixes -- Fix: owner removed when set_permissions passed on object create [@shamoon](https://github.com/shamoon) ([#3702](https://github.com/paperless-ngx/paperless-ngx/pull/3702)) +- Fix: owner removed when set_permissions passed on object create [@shamoon](https://github.com/shamoon) ([#3702](https://github.com/paperless-ngx/paperless-ngx/pull/3702)) ### All App Changes
2 changes -- Feature: support barcode upscaling for better detection of small barcodes [@bmachek](https://github.com/bmachek) ([#3655](https://github.com/paperless-ngx/paperless-ngx/pull/3655)) -- Fix: owner removed when set_permissions passed on object create [@shamoon](https://github.com/shamoon) ([#3702](https://github.com/paperless-ngx/paperless-ngx/pull/3702)) +- Feature: support barcode upscaling for better detection of small barcodes [@bmachek](https://github.com/bmachek) ([#3655](https://github.com/paperless-ngx/paperless-ngx/pull/3655)) +- Fix: owner removed when set_permissions passed on object create [@shamoon](https://github.com/shamoon) ([#3702](https://github.com/paperless-ngx/paperless-ngx/pull/3702))
## paperless-ngx 1.16.4 ### Bug Fixes -- Fix: prevent button wrapping when sidebar narrows in MS Edge [@shamoon](https://github.com/shamoon) ([#3682](https://github.com/paperless-ngx/paperless-ngx/pull/3682)) -- Fix: Handling for filenames with non-ascii and no content attribute [@stumpylog](https://github.com/stumpylog) ([#3695](https://github.com/paperless-ngx/paperless-ngx/pull/3695)) -- Fix: Generation of thumbnails for existing stored emails [@stumpylog](https://github.com/stumpylog) ([#3696](https://github.com/paperless-ngx/paperless-ngx/pull/3696)) -- Fix: Use row gap for filter editor [@kleinweby](https://github.com/kleinweby) ([#3662](https://github.com/paperless-ngx/paperless-ngx/pull/3662)) +- Fix: prevent button wrapping when sidebar narrows in MS Edge [@shamoon](https://github.com/shamoon) ([#3682](https://github.com/paperless-ngx/paperless-ngx/pull/3682)) +- Fix: Handling for filenames with non-ascii and no content attribute [@stumpylog](https://github.com/stumpylog) ([#3695](https://github.com/paperless-ngx/paperless-ngx/pull/3695)) +- Fix: Generation of thumbnails for existing stored emails [@stumpylog](https://github.com/stumpylog) ([#3696](https://github.com/paperless-ngx/paperless-ngx/pull/3696)) +- Fix: Use row gap for filter editor [@kleinweby](https://github.com/kleinweby) ([#3662](https://github.com/paperless-ngx/paperless-ngx/pull/3662)) ### Documentation -- Documentation: update API docs re permissions [@shamoon](https://github.com/shamoon) ([#3697](https://github.com/paperless-ngx/paperless-ngx/pull/3697)) +- Documentation: update API docs re permissions [@shamoon](https://github.com/shamoon) ([#3697](https://github.com/paperless-ngx/paperless-ngx/pull/3697)) ### Maintenance -- Chore: Updates codecov configuration for the flag settings and notification delay [@stumpylog](https://github.com/stumpylog) ([#3656](https://github.com/paperless-ngx/paperless-ngx/pull/3656)) +- Chore: Updates codecov configuration for the flag settings and notification delay [@stumpylog](https://github.com/stumpylog) ([#3656](https://github.com/paperless-ngx/paperless-ngx/pull/3656)) ### All App Changes
4 changes -- Fix: prevent button wrapping when sidebar narrows in MS Edge [@shamoon](https://github.com/shamoon) ([#3682](https://github.com/paperless-ngx/paperless-ngx/pull/3682)) -- Fix: Handling for filenames with non-ascii and no content attribute [@stumpylog](https://github.com/stumpylog) ([#3695](https://github.com/paperless-ngx/paperless-ngx/pull/3695)) -- Fix: Generation of thumbnails for existing stored emails [@stumpylog](https://github.com/stumpylog) ([#3696](https://github.com/paperless-ngx/paperless-ngx/pull/3696)) -- Fix: Use row gap for filter editor [@kleinweby](https://github.com/kleinweby) ([#3662](https://github.com/paperless-ngx/paperless-ngx/pull/3662)) +- Fix: prevent button wrapping when sidebar narrows in MS Edge [@shamoon](https://github.com/shamoon) ([#3682](https://github.com/paperless-ngx/paperless-ngx/pull/3682)) +- Fix: Handling for filenames with non-ascii and no content attribute [@stumpylog](https://github.com/stumpylog) ([#3695](https://github.com/paperless-ngx/paperless-ngx/pull/3695)) +- Fix: Generation of thumbnails for existing stored emails [@stumpylog](https://github.com/stumpylog) ([#3696](https://github.com/paperless-ngx/paperless-ngx/pull/3696)) +- Fix: Use row gap for filter editor [@kleinweby](https://github.com/kleinweby) ([#3662](https://github.com/paperless-ngx/paperless-ngx/pull/3662))
## paperless-ngx 1.16.3 ### Bug Fixes -- Fix: Set user and home environment through supervisord [@stumpylog](https://github.com/stumpylog) ([#3638](https://github.com/paperless-ngx/paperless-ngx/pull/3638)) -- Fix: Ignore errors when trying to copy the original file's stats [@stumpylog](https://github.com/stumpylog) ([#3652](https://github.com/paperless-ngx/paperless-ngx/pull/3652)) -- Fix: Copy default thumbnail if thumbnail generation fails [@plu](https://github.com/plu) ([#3632](https://github.com/paperless-ngx/paperless-ngx/pull/3632)) -- Fix: Set user and home environment through supervisord [@stumpylog](https://github.com/stumpylog) ([#3638](https://github.com/paperless-ngx/paperless-ngx/pull/3638)) -- Fix: Fix quick install with external database not being fully ready [@stumpylog](https://github.com/stumpylog) ([#3637](https://github.com/paperless-ngx/paperless-ngx/pull/3637)) +- Fix: Set user and home environment through supervisord [@stumpylog](https://github.com/stumpylog) ([#3638](https://github.com/paperless-ngx/paperless-ngx/pull/3638)) +- Fix: Ignore errors when trying to copy the original file's stats [@stumpylog](https://github.com/stumpylog) ([#3652](https://github.com/paperless-ngx/paperless-ngx/pull/3652)) +- Fix: Copy default thumbnail if thumbnail generation fails [@plu](https://github.com/plu) ([#3632](https://github.com/paperless-ngx/paperless-ngx/pull/3632)) +- Fix: Set user and home environment through supervisord [@stumpylog](https://github.com/stumpylog) ([#3638](https://github.com/paperless-ngx/paperless-ngx/pull/3638)) +- Fix: Fix quick install with external database not being fully ready [@stumpylog](https://github.com/stumpylog) ([#3637](https://github.com/paperless-ngx/paperless-ngx/pull/3637)) ### Maintenance -- Chore: Update default Postgres version for new installs [@stumpylog](https://github.com/stumpylog) ([#3640](https://github.com/paperless-ngx/paperless-ngx/pull/3640)) +- Chore: Update default Postgres version for new installs [@stumpylog](https://github.com/stumpylog) ([#3640](https://github.com/paperless-ngx/paperless-ngx/pull/3640)) ### All App Changes
2 changes -- Fix: Ignore errors when trying to copy the original file's stats [@stumpylog](https://github.com/stumpylog) ([#3652](https://github.com/paperless-ngx/paperless-ngx/pull/3652)) -- Fix: Copy default thumbnail if thumbnail generation fails [@plu](https://github.com/plu) ([#3632](https://github.com/paperless-ngx/paperless-ngx/pull/3632)) +- Fix: Ignore errors when trying to copy the original file's stats [@stumpylog](https://github.com/stumpylog) ([#3652](https://github.com/paperless-ngx/paperless-ngx/pull/3652)) +- Fix: Copy default thumbnail if thumbnail generation fails [@plu](https://github.com/plu) ([#3632](https://github.com/paperless-ngx/paperless-ngx/pull/3632))
## paperless-ngx 1.16.2 ### Bug Fixes -- Fix: Increase httpx operation timeouts to 30s [@stumpylog](https://github.com/stumpylog) ([#3627](https://github.com/paperless-ngx/paperless-ngx/pull/3627)) -- Fix: Better error handling and checking when parsing documents via Tika [@stumpylog](https://github.com/stumpylog) ([#3617](https://github.com/paperless-ngx/paperless-ngx/pull/3617)) +- Fix: Increase httpx operation timeouts to 30s [@stumpylog](https://github.com/stumpylog) ([#3627](https://github.com/paperless-ngx/paperless-ngx/pull/3627)) +- Fix: Better error handling and checking when parsing documents via Tika [@stumpylog](https://github.com/stumpylog) ([#3617](https://github.com/paperless-ngx/paperless-ngx/pull/3617)) ### Development -- Development: frontend unit testing [@shamoon](https://github.com/shamoon) ([#3597](https://github.com/paperless-ngx/paperless-ngx/pull/3597)) +- Development: frontend unit testing [@shamoon](https://github.com/shamoon) ([#3597](https://github.com/paperless-ngx/paperless-ngx/pull/3597)) ### Maintenance -- Chore: Bumps the CI/Docker pipenv version [@stumpylog](https://github.com/stumpylog) ([#3622](https://github.com/paperless-ngx/paperless-ngx/pull/3622)) -- Chore: Set CI artifact retention days [@stumpylog](https://github.com/stumpylog) ([#3621](https://github.com/paperless-ngx/paperless-ngx/pull/3621)) +- Chore: Bumps the CI/Docker pipenv version [@stumpylog](https://github.com/stumpylog) ([#3622](https://github.com/paperless-ngx/paperless-ngx/pull/3622)) +- Chore: Set CI artifact retention days [@stumpylog](https://github.com/stumpylog) ([#3621](https://github.com/paperless-ngx/paperless-ngx/pull/3621)) ### All App Changes
3 changes -- Fix: Increase httpx operation timeouts to 30s [@stumpylog](https://github.com/stumpylog) ([#3627](https://github.com/paperless-ngx/paperless-ngx/pull/3627)) -- Fix: Better error handling and checking when parsing documents via Tika [@stumpylog](https://github.com/stumpylog) ([#3617](https://github.com/paperless-ngx/paperless-ngx/pull/3617)) -- Development: frontend unit testing [@shamoon](https://github.com/shamoon) ([#3597](https://github.com/paperless-ngx/paperless-ngx/pull/3597)) +- Fix: Increase httpx operation timeouts to 30s [@stumpylog](https://github.com/stumpylog) ([#3627](https://github.com/paperless-ngx/paperless-ngx/pull/3627)) +- Fix: Better error handling and checking when parsing documents via Tika [@stumpylog](https://github.com/stumpylog) ([#3617](https://github.com/paperless-ngx/paperless-ngx/pull/3617)) +- Development: frontend unit testing [@shamoon](https://github.com/shamoon) ([#3597](https://github.com/paperless-ngx/paperless-ngx/pull/3597))
## paperless-ngx 1.16.1 ### Bug Fixes -- Fix: PIL ImportError on ARM devices with Docker [@stumpylog](https://github.com/stumpylog) ([#3605](https://github.com/paperless-ngx/paperless-ngx/pull/3605)) +- Fix: PIL ImportError on ARM devices with Docker [@stumpylog](https://github.com/stumpylog) ([#3605](https://github.com/paperless-ngx/paperless-ngx/pull/3605)) ### Maintenance -- Chore: Enable the image cleanup action [@stumpylog](https://github.com/stumpylog) ([#3606](https://github.com/paperless-ngx/paperless-ngx/pull/3606)) +- Chore: Enable the image cleanup action [@stumpylog](https://github.com/stumpylog) ([#3606](https://github.com/paperless-ngx/paperless-ngx/pull/3606)) ## paperless-ngx 1.16.0 ### Notable Changes -- Chore: Update base image to Debian bookworm [@stumpylog](https://github.com/stumpylog) ([#3469](https://github.com/paperless-ngx/paperless-ngx/pull/3469)) +- Chore: Update base image to Debian bookworm [@stumpylog](https://github.com/stumpylog) ([#3469](https://github.com/paperless-ngx/paperless-ngx/pull/3469)) ### Features -- Feature: Update to a simpler Tika library [@stumpylog](https://github.com/stumpylog) ([#3517](https://github.com/paperless-ngx/paperless-ngx/pull/3517)) -- Feature: Allow to filter documents by original filename and checksum [@jayme-github](https://github.com/jayme-github) ([#3485](https://github.com/paperless-ngx/paperless-ngx/pull/3485)) +- Feature: Update to a simpler Tika library [@stumpylog](https://github.com/stumpylog) ([#3517](https://github.com/paperless-ngx/paperless-ngx/pull/3517)) +- Feature: Allow to filter documents by original filename and checksum [@jayme-github](https://github.com/jayme-github) ([#3485](https://github.com/paperless-ngx/paperless-ngx/pull/3485)) ### Bug Fixes -- Fix: return user first / last name from backend [@shamoon](https://github.com/shamoon) ([#3579](https://github.com/paperless-ngx/paperless-ngx/pull/3579)) -- Fix use of `PAPERLESS_DB_TIMEOUT` for all db types [@shamoon](https://github.com/shamoon) ([#3576](https://github.com/paperless-ngx/paperless-ngx/pull/3576)) -- Fix: handle mail rules with no filters on some imap servers [@shamoon](https://github.com/shamoon) ([#3554](https://github.com/paperless-ngx/paperless-ngx/pull/3554)) +- Fix: return user first / last name from backend [@shamoon](https://github.com/shamoon) ([#3579](https://github.com/paperless-ngx/paperless-ngx/pull/3579)) +- Fix use of `PAPERLESS_DB_TIMEOUT` for all db types [@shamoon](https://github.com/shamoon) ([#3576](https://github.com/paperless-ngx/paperless-ngx/pull/3576)) +- Fix: handle mail rules with no filters on some imap servers [@shamoon](https://github.com/shamoon) ([#3554](https://github.com/paperless-ngx/paperless-ngx/pull/3554)) ### Dependencies -- Chore: Python dependency updates (celery 5.3.0 in particular) [@stumpylog](https://github.com/stumpylog) ([#3584](https://github.com/paperless-ngx/paperless-ngx/pull/3584)) +- Chore: Python dependency updates (celery 5.3.0 in particular) [@stumpylog](https://github.com/stumpylog) ([#3584](https://github.com/paperless-ngx/paperless-ngx/pull/3584)) ### All App Changes
8 changes -- Chore: Python dependency updates (celery 5.3.0 in particular) [@stumpylog](https://github.com/stumpylog) ([#3584](https://github.com/paperless-ngx/paperless-ngx/pull/3584)) -- Fix: return user first / last name from backend [@shamoon](https://github.com/shamoon) ([#3579](https://github.com/paperless-ngx/paperless-ngx/pull/3579)) -- Fix use of `PAPERLESS_DB_TIMEOUT` for all db types [@shamoon](https://github.com/shamoon) ([#3576](https://github.com/paperless-ngx/paperless-ngx/pull/3576)) -- Fix: handle mail rules with no filters on some imap servers [@shamoon](https://github.com/shamoon) ([#3554](https://github.com/paperless-ngx/paperless-ngx/pull/3554)) -- Chore: Copy file stats from original file [@stumpylog](https://github.com/stumpylog) ([#3551](https://github.com/paperless-ngx/paperless-ngx/pull/3551)) -- Chore: Adds test for barcode ASN when it already exists [@stumpylog](https://github.com/stumpylog) ([#3550](https://github.com/paperless-ngx/paperless-ngx/pull/3550)) -- Feature: Update to a simpler Tika library [@stumpylog](https://github.com/stumpylog) ([#3517](https://github.com/paperless-ngx/paperless-ngx/pull/3517)) -- Feature: Allow to filter documents by original filename and checksum [@jayme-github](https://github.com/jayme-github) ([#3485](https://github.com/paperless-ngx/paperless-ngx/pull/3485)) +- Chore: Python dependency updates (celery 5.3.0 in particular) [@stumpylog](https://github.com/stumpylog) ([#3584](https://github.com/paperless-ngx/paperless-ngx/pull/3584)) +- Fix: return user first / last name from backend [@shamoon](https://github.com/shamoon) ([#3579](https://github.com/paperless-ngx/paperless-ngx/pull/3579)) +- Fix use of `PAPERLESS_DB_TIMEOUT` for all db types [@shamoon](https://github.com/shamoon) ([#3576](https://github.com/paperless-ngx/paperless-ngx/pull/3576)) +- Fix: handle mail rules with no filters on some imap servers [@shamoon](https://github.com/shamoon) ([#3554](https://github.com/paperless-ngx/paperless-ngx/pull/3554)) +- Chore: Copy file stats from original file [@stumpylog](https://github.com/stumpylog) ([#3551](https://github.com/paperless-ngx/paperless-ngx/pull/3551)) +- Chore: Adds test for barcode ASN when it already exists [@stumpylog](https://github.com/stumpylog) ([#3550](https://github.com/paperless-ngx/paperless-ngx/pull/3550)) +- Feature: Update to a simpler Tika library [@stumpylog](https://github.com/stumpylog) ([#3517](https://github.com/paperless-ngx/paperless-ngx/pull/3517)) +- Feature: Allow to filter documents by original filename and checksum [@jayme-github](https://github.com/jayme-github) ([#3485](https://github.com/paperless-ngx/paperless-ngx/pull/3485))
## paperless-ngx 1.15.1 ### Bug Fixes -- Fix incorrect colors in v1.15.0 [@shamoon](https://github.com/shamoon) ([#3523](https://github.com/paperless-ngx/paperless-ngx/pull/3523)) +- Fix incorrect colors in v1.15.0 [@shamoon](https://github.com/shamoon) ([#3523](https://github.com/paperless-ngx/paperless-ngx/pull/3523)) ### All App Changes -- Fix incorrect colors in v1.15.0 [@shamoon](https://github.com/shamoon) ([#3523](https://github.com/paperless-ngx/paperless-ngx/pull/3523)) +- Fix incorrect colors in v1.15.0 [@shamoon](https://github.com/shamoon) ([#3523](https://github.com/paperless-ngx/paperless-ngx/pull/3523)) ## paperless-ngx 1.15.0 ### Features -- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476)) -- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471)) -- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445)) -- Feature: Better encapsulation of barcode logic [@stumpylog](https://github.com/stumpylog) ([#3425](https://github.com/paperless-ngx/paperless-ngx/pull/3425)) -- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413)) +- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476)) +- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471)) +- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445)) +- Feature: Better encapsulation of barcode logic [@stumpylog](https://github.com/stumpylog) ([#3425](https://github.com/paperless-ngx/paperless-ngx/pull/3425)) +- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413)) ### Bug Fixes -- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516)) -- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487)) -- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472)) -- Sync Pipfile.lock based on latest Pipfile [@adamantike](https://github.com/adamantike) ([#3475](https://github.com/paperless-ngx/paperless-ngx/pull/3475)) -- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473)) -- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466)) -- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453)) +- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516)) +- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487)) +- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472)) +- Sync Pipfile.lock based on latest Pipfile [@adamantike](https://github.com/adamantike) ([#3475](https://github.com/paperless-ngx/paperless-ngx/pull/3475)) +- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473)) +- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466)) +- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453)) ### Documentation -- Adding doc on how to setup Fail2ban [@GuillaumeHullin](https://github.com/GuillaumeHullin) ([#3414](https://github.com/paperless-ngx/paperless-ngx/pull/3414)) -- Docs: Fix typo [@MarcelBochtler](https://github.com/MarcelBochtler) ([#3437](https://github.com/paperless-ngx/paperless-ngx/pull/3437)) -- [Documentation] Move nginx [@shamoon](https://github.com/shamoon) ([#3420](https://github.com/paperless-ngx/paperless-ngx/pull/3420)) -- Documentation: Note possible dependency removal for bare metal [@stumpylog](https://github.com/stumpylog) ([#3408](https://github.com/paperless-ngx/paperless-ngx/pull/3408)) +- Adding doc on how to setup Fail2ban [@GuillaumeHullin](https://github.com/GuillaumeHullin) ([#3414](https://github.com/paperless-ngx/paperless-ngx/pull/3414)) +- Docs: Fix typo [@MarcelBochtler](https://github.com/MarcelBochtler) ([#3437](https://github.com/paperless-ngx/paperless-ngx/pull/3437)) +- [Documentation] Move nginx [@shamoon](https://github.com/shamoon) ([#3420](https://github.com/paperless-ngx/paperless-ngx/pull/3420)) +- Documentation: Note possible dependency removal for bare metal [@stumpylog](https://github.com/stumpylog) ([#3408](https://github.com/paperless-ngx/paperless-ngx/pull/3408)) ### Development -- Development: migrate frontend tests to playwright [@shamoon](https://github.com/shamoon) ([#3401](https://github.com/paperless-ngx/paperless-ngx/pull/3401)) +- Development: migrate frontend tests to playwright [@shamoon](https://github.com/shamoon) ([#3401](https://github.com/paperless-ngx/paperless-ngx/pull/3401)) ### Dependencies
10 changes -- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513)) -- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510)) -- Bump [@ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507)) -- Bump [@popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508)) -- Bump [@typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505)) -- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497)) -- Bump [@typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500)) -- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501)) -- Bump [@types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498)) -- Bump [@playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499)) +- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513)) +- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510)) +- Bump [@ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507)) +- Bump [@popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508)) +- Bump [@typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505)) +- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497)) +- Bump [@typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500)) +- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501)) +- Bump [@types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498)) +- Bump [@playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499))
### All App Changes @@ -4067,123 +4461,123 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti
22 changes -- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516)) -- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513)) -- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510)) -- Bump [@ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507)) -- Bump [@popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508)) -- Bump [@typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505)) -- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497)) -- Bump [@typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500)) -- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501)) -- Bump [@types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498)) -- Bump [@playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499)) -- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476)) -- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487)) -- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472)) -- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471)) -- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473)) -- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466)) -- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453)) -- Chore: Improves the logging mixin and allows it to be typed better [@stumpylog](https://github.com/stumpylog) ([#3451](https://github.com/paperless-ngx/paperless-ngx/pull/3451)) -- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445)) -- Add SSL Support for MariaDB [@kimdre](https://github.com/kimdre) ([#3444](https://github.com/paperless-ngx/paperless-ngx/pull/3444)) -- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413)) +- Fix: KeyError error on unauthenticated API calls \& persist authentication when enabled [@ajgon](https://github.com/ajgon) ([#3516](https://github.com/paperless-ngx/paperless-ngx/pull/3516)) +- Bump eslint from 8.39.0 to 8.41.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3513](https://github.com/paperless-ngx/paperless-ngx/pull/3513)) +- Bump concurrently from 8.0.1 to 8.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3510](https://github.com/paperless-ngx/paperless-ngx/pull/3510)) +- Bump [@ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot](https://github.com/ng-bootstrap/ng-bootstrap from 14.1.0 to 14.2.0 in /src-ui @dependabot) ([#3507](https://github.com/paperless-ngx/paperless-ngx/pull/3507)) +- Bump [@popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.7 to 2.11.8 in /src-ui @dependabot) ([#3508](https://github.com/paperless-ngx/paperless-ngx/pull/3508)) +- Bump [@typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3505](https://github.com/paperless-ngx/paperless-ngx/pull/3505)) +- Bump bootstrap from 5.2.3 to 5.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3497](https://github.com/paperless-ngx/paperless-ngx/pull/3497)) +- Bump [@typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.59.2 to 5.59.8 in /src-ui @dependabot) ([#3500](https://github.com/paperless-ngx/paperless-ngx/pull/3500)) +- Bump tslib from 2.5.0 to 2.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#3501](https://github.com/paperless-ngx/paperless-ngx/pull/3501)) +- Bump [@types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot](https://github.com/types/node from 18.16.3 to 20.2.5 in /src-ui @dependabot) ([#3498](https://github.com/paperless-ngx/paperless-ngx/pull/3498)) +- Bump [@playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot](https://github.com/playwright/test from 1.33.0 to 1.34.3 in /src-ui @dependabot) ([#3499](https://github.com/paperless-ngx/paperless-ngx/pull/3499)) +- Feature: quick filters from document detail [@shamoon](https://github.com/shamoon) ([#3476](https://github.com/paperless-ngx/paperless-ngx/pull/3476)) +- Fix: exclude consumer \& AnonymousUser users from export manifest [@shamoon](https://github.com/shamoon) ([#3487](https://github.com/paperless-ngx/paperless-ngx/pull/3487)) +- Fix: prevent date suggestion search if disabled [@shamoon](https://github.com/shamoon) ([#3472](https://github.com/paperless-ngx/paperless-ngx/pull/3472)) +- Feature: Add explanations to relative dates [@shamoon](https://github.com/shamoon) ([#3471](https://github.com/paperless-ngx/paperless-ngx/pull/3471)) +- Fix: DocumentSerializer should return correct original filename [@jayme-github](https://github.com/jayme-github) ([#3473](https://github.com/paperless-ngx/paperless-ngx/pull/3473)) +- consumer.py: read from original file (instead of temp copy) [@chrisblech](https://github.com/chrisblech) ([#3466](https://github.com/paperless-ngx/paperless-ngx/pull/3466)) +- Bugfix: Catch an nltk AttributeError and handle it [@stumpylog](https://github.com/stumpylog) ([#3453](https://github.com/paperless-ngx/paperless-ngx/pull/3453)) +- Chore: Improves the logging mixin and allows it to be typed better [@stumpylog](https://github.com/stumpylog) ([#3451](https://github.com/paperless-ngx/paperless-ngx/pull/3451)) +- Enhancement: paginate frontend tasks [@shamoon](https://github.com/shamoon) ([#3445](https://github.com/paperless-ngx/paperless-ngx/pull/3445)) +- Add SSL Support for MariaDB [@kimdre](https://github.com/kimdre) ([#3444](https://github.com/paperless-ngx/paperless-ngx/pull/3444)) +- Enhancement: Improve frontend error handling [@shamoon](https://github.com/shamoon) ([#3413](https://github.com/paperless-ngx/paperless-ngx/pull/3413))
## paperless-ngx 1.14.5 ### Features -- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309)) -- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329)) -- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321)) +- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309)) +- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329)) +- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321)) ### Bug Fixes -- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387)) -- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359)) -- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382)) -- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366)) -- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347)) -- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336)) -- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345)) +- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387)) +- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359)) +- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382)) +- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366)) +- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347)) +- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336)) +- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345)) ### Maintenance -- Chore: Rework workflows [@stumpylog](https://github.com/stumpylog) ([#3242](https://github.com/paperless-ngx/paperless-ngx/pull/3242)) +- Chore: Rework workflows [@stumpylog](https://github.com/stumpylog) ([#3242](https://github.com/paperless-ngx/paperless-ngx/pull/3242)) ### Dependencies -- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383)) -- Chore: Upgrades Python dependencies to their latest allowed versions [@stumpylog](https://github.com/stumpylog) ([#3365](https://github.com/paperless-ngx/paperless-ngx/pull/3365)) +- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383)) +- Chore: Upgrades Python dependencies to their latest allowed versions [@stumpylog](https://github.com/stumpylog) ([#3365](https://github.com/paperless-ngx/paperless-ngx/pull/3365)) ### All App Changes
13 changes -- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387)) -- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359)) -- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383)) -- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382)) -- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309)) -- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366)) -- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329)) -- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347)) -- [Fix] Position:fixed for .global-dropzone-overlay [@denilsonsa](https://github.com/denilsonsa) ([#3367](https://github.com/paperless-ngx/paperless-ngx/pull/3367)) -- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336)) -- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321)) -- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345)) -- Fix: Add proper testing for \*\_\_id\_\_in testing [@shamoon](https://github.com/shamoon) ([#3315](https://github.com/paperless-ngx/paperless-ngx/pull/3315)) +- Fix: Adds better handling for files with invalid utf8 content [@stumpylog](https://github.com/stumpylog) ([#3387](https://github.com/paperless-ngx/paperless-ngx/pull/3387)) +- Fix: respect permissions for autocomplete suggestions [@shamoon](https://github.com/shamoon) ([#3359](https://github.com/paperless-ngx/paperless-ngx/pull/3359)) +- Chore: Upgrade channels to v4 [@stumpylog](https://github.com/stumpylog) ([#3383](https://github.com/paperless-ngx/paperless-ngx/pull/3383)) +- Fix: Transition to new library for finding IPs for failed logins [@stumpylog](https://github.com/stumpylog) ([#3382](https://github.com/paperless-ngx/paperless-ngx/pull/3382)) +- Feature: owner filtering [@shamoon](https://github.com/shamoon) ([#3309](https://github.com/paperless-ngx/paperless-ngx/pull/3309)) +- [Security] Render frontend text as plain text [@shamoon](https://github.com/shamoon) ([#3366](https://github.com/paperless-ngx/paperless-ngx/pull/3366)) +- Enhancement: dynamic counts include all pages, hide for Any [@shamoon](https://github.com/shamoon) ([#3329](https://github.com/paperless-ngx/paperless-ngx/pull/3329)) +- Fix: default frontend to current owner, allow setting no owner on create [@shamoon](https://github.com/shamoon) ([#3347](https://github.com/paperless-ngx/paperless-ngx/pull/3347)) +- [Fix] Position:fixed for .global-dropzone-overlay [@denilsonsa](https://github.com/denilsonsa) ([#3367](https://github.com/paperless-ngx/paperless-ngx/pull/3367)) +- Fix: dont perform mail actions when rule filename filter not met [@shamoon](https://github.com/shamoon) ([#3336](https://github.com/paperless-ngx/paperless-ngx/pull/3336)) +- Enhancement: save tour completion, hide welcome widget [@shamoon](https://github.com/shamoon) ([#3321](https://github.com/paperless-ngx/paperless-ngx/pull/3321)) +- Fix: permission-aware bulk editing in 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3345](https://github.com/paperless-ngx/paperless-ngx/pull/3345)) +- Fix: Add proper testing for \*\_\_id\_\_in testing [@shamoon](https://github.com/shamoon) ([#3315](https://github.com/paperless-ngx/paperless-ngx/pull/3315))
## paperless-ngx 1.14.4 ### Bug Fixes -- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305)) -- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303)) +- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305)) +- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303)) ### All App Changes
3 changes -- New Crowdin updates [@paperlessngx-bot](https://github.com/paperlessngx-bot) ([#3298](https://github.com/paperless-ngx/paperless-ngx/pull/3298)) -- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305)) -- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303)) +- New Crowdin updates [@paperlessngx-bot](https://github.com/paperlessngx-bot) ([#3298](https://github.com/paperless-ngx/paperless-ngx/pull/3298)) +- Fix: Inversion in tagged mail searching [@stumpylog](https://github.com/stumpylog) ([#3305](https://github.com/paperless-ngx/paperless-ngx/pull/3305)) +- Fix dynamic count labels hidden in light mode [@shamoon](https://github.com/shamoon) ([#3303](https://github.com/paperless-ngx/paperless-ngx/pull/3303))
## paperless-ngx 1.14.3 ### Features -- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227)) +- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227)) ### Bug Fixes -- Bump filelock from 3.10.2 to 3.12.0 to fix permissions bug [@rbrownwsws](https://github.com/rbrownwsws) ([#3282](https://github.com/paperless-ngx/paperless-ngx/pull/3282)) -- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261)) -- Fix: Prevent erroneous warning when starting container [@stumpylog](https://github.com/stumpylog) ([#3262](https://github.com/paperless-ngx/paperless-ngx/pull/3262)) -- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243)) -- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240)) -- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232)) -- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222)) -- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218)) +- Bump filelock from 3.10.2 to 3.12.0 to fix permissions bug [@rbrownwsws](https://github.com/rbrownwsws) ([#3282](https://github.com/paperless-ngx/paperless-ngx/pull/3282)) +- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261)) +- Fix: Prevent erroneous warning when starting container [@stumpylog](https://github.com/stumpylog) ([#3262](https://github.com/paperless-ngx/paperless-ngx/pull/3262)) +- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243)) +- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240)) +- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232)) +- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222)) +- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218)) ### Dependencies
7 changes -- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276)) -- Bump [@typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278)) -- Bump [@types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275)) -- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277)) -- Bump [@typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274)) -- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268)) -- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270)) +- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276)) +- Bump [@typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278)) +- Bump [@types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275)) +- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277)) +- Bump [@typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274)) +- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268)) +- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270))
### All App Changes @@ -4191,192 +4585,192 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti
14 changes -- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276)) -- Bump [@typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278)) -- Bump [@types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275)) -- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277)) -- Bump [@typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274)) -- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268)) -- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270)) -- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261)) -- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243)) -- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240)) -- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232)) -- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227)) -- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222)) -- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218)) +- Bump eslint from 8.38.0 to 8.39.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3276](https://github.com/paperless-ngx/paperless-ngx/pull/3276)) +- Bump [@typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3278](https://github.com/paperless-ngx/paperless-ngx/pull/3278)) +- Bump [@types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot](https://github.com/types/node from 18.15.11 to 18.16.3 in /src-ui @dependabot) ([#3275](https://github.com/paperless-ngx/paperless-ngx/pull/3275)) +- Bump rxjs from 7.8.0 to 7.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#3277](https://github.com/paperless-ngx/paperless-ngx/pull/3277)) +- Bump [@typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.58.0 to 5.59.2 in /src-ui @dependabot) ([#3274](https://github.com/paperless-ngx/paperless-ngx/pull/3274)) +- Bump cypress from 12.9.0 to 12.11.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#3268](https://github.com/paperless-ngx/paperless-ngx/pull/3268)) +- Bulk bump angular packages to 15.2.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#3270](https://github.com/paperless-ngx/paperless-ngx/pull/3270)) +- Fix: Handle cases where media files aren't all in the same filesystem [@stumpylog](https://github.com/stumpylog) ([#3261](https://github.com/paperless-ngx/paperless-ngx/pull/3261)) +- Retain doc changes on tab switch after refresh doc [@shamoon](https://github.com/shamoon) ([#3243](https://github.com/paperless-ngx/paperless-ngx/pull/3243)) +- Fix: Don't send Gmail related setting if the server doesn't support it [@stumpylog](https://github.com/stumpylog) ([#3240](https://github.com/paperless-ngx/paperless-ngx/pull/3240)) +- Fix: close all docs on logout [@shamoon](https://github.com/shamoon) ([#3232](https://github.com/paperless-ngx/paperless-ngx/pull/3232)) +- Enhancement: better keyboard nav for filter/edit dropdowns [@shamoon](https://github.com/shamoon) ([#3227](https://github.com/paperless-ngx/paperless-ngx/pull/3227)) +- Fix: Respect superuser for advanced queries, test coverage for object perms [@shamoon](https://github.com/shamoon) ([#3222](https://github.com/paperless-ngx/paperless-ngx/pull/3222)) +- Fix: ALLOWED_HOSTS logic being overwritten when \* is set [@ikaruswill](https://github.com/ikaruswill) ([#3218](https://github.com/paperless-ngx/paperless-ngx/pull/3218))
## paperless-ngx 1.14.2 ### Features -- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215)) +- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215)) ### Bug Fixes -- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211)) -- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209)) -- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212)) +- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211)) +- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209)) +- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212)) ### All App Changes
4 changes -- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215)) -- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211)) -- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209)) -- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212)) +- Feature: Finnish translation [@shamoon](https://github.com/shamoon) ([#3215](https://github.com/paperless-ngx/paperless-ngx/pull/3215)) +- Fix: Load saved views from app frame, not dashboard [@shamoon](https://github.com/shamoon) ([#3211](https://github.com/paperless-ngx/paperless-ngx/pull/3211)) +- Fix: advanced search or date searching + doc type/correspondent/storage path broken [@shamoon](https://github.com/shamoon) ([#3209](https://github.com/paperless-ngx/paperless-ngx/pull/3209)) +- Fix MixedContentTypeError in add_inbox_tags handler [@e1mo](https://github.com/e1mo) ([#3212](https://github.com/paperless-ngx/paperless-ngx/pull/3212))
## paperless-ngx 1.14.1 ### Bug Fixes -- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201)) -- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199)) -- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198)) -- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174)) -- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191)) -- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189)) -- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190)) -- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188)) -- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163)) -- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180)) -- Fix: Redis socket connections fail due to redis-py [@stumpylog](https://github.com/stumpylog) ([#3176](https://github.com/paperless-ngx/paperless-ngx/pull/3176)) -- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161)) -- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171)) +- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201)) +- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199)) +- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198)) +- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174)) +- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191)) +- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189)) +- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190)) +- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188)) +- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163)) +- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180)) +- Fix: Redis socket connections fail due to redis-py [@stumpylog](https://github.com/stumpylog) ([#3176](https://github.com/paperless-ngx/paperless-ngx/pull/3176)) +- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161)) +- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171)) ### Documentation -- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190)) -- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171)) +- Documentation: add note for macOS [@shamoon](https://github.com/shamoon) ([#3190](https://github.com/paperless-ngx/paperless-ngx/pull/3190)) +- Fix typos and wrong version number in doc [@FizzyMUC](https://github.com/FizzyMUC) ([#3171](https://github.com/paperless-ngx/paperless-ngx/pull/3171)) ### Maintenance -- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177)) +- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177)) ### All App Changes
11 changes -- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201)) -- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199)) -- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198)) -- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177)) -- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174)) -- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191)) -- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189)) -- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188)) -- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163)) -- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180)) -- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161)) +- Fix: reduce frequency of permissions queries to speed up v1.14.0 [@shamoon](https://github.com/shamoon) ([#3201](https://github.com/paperless-ngx/paperless-ngx/pull/3201)) +- Fix: permissions-aware statistics [@shamoon](https://github.com/shamoon) ([#3199](https://github.com/paperless-ngx/paperless-ngx/pull/3199)) +- Fix: Use document owner for matching if set [@shamoon](https://github.com/shamoon) ([#3198](https://github.com/paperless-ngx/paperless-ngx/pull/3198)) +- Chore: Fix isort not running, upgrade to the latest black [@stumpylog](https://github.com/stumpylog) ([#3177](https://github.com/paperless-ngx/paperless-ngx/pull/3177)) +- Fix: respect permissions on document view actions [@shamoon](https://github.com/shamoon) ([#3174](https://github.com/paperless-ngx/paperless-ngx/pull/3174)) +- Increment API version for 1.14.1+ [@shamoon](https://github.com/shamoon) ([#3191](https://github.com/paperless-ngx/paperless-ngx/pull/3191)) +- Fix: dropdown Private items with empty set [@shamoon](https://github.com/shamoon) ([#3189](https://github.com/paperless-ngx/paperless-ngx/pull/3189)) +- Fix: make the importer a little more robust against some errors [@stumpylog](https://github.com/stumpylog) ([#3188](https://github.com/paperless-ngx/paperless-ngx/pull/3188)) +- Fix: Specify backend for auto-login [@shamoon](https://github.com/shamoon) ([#3163](https://github.com/paperless-ngx/paperless-ngx/pull/3163)) +- Fix: StoragePath missing the owned or granted filter [@stumpylog](https://github.com/stumpylog) ([#3180](https://github.com/paperless-ngx/paperless-ngx/pull/3180)) +- Fix: Handle delete mail action with no filters [@shamoon](https://github.com/shamoon) ([#3161](https://github.com/paperless-ngx/paperless-ngx/pull/3161))
## paperless-ngx 1.14.0 ### Notable Changes -- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) +- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) ### Features -- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744)) -- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966)) -- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907)) -- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972)) -- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949)) -- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954)) -- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) -- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930)) -- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) -- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910)) -- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904)) -- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899)) -- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893)) -- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861)) -- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873)) -- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871)) -- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827)) -- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718)) -- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733)) -- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743)) -- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704)) -- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713)) -- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359)) -- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696)) -- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689)) -- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) +- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744)) +- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966)) +- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907)) +- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972)) +- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949)) +- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954)) +- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) +- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930)) +- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) +- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910)) +- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904)) +- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899)) +- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893)) +- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861)) +- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873)) +- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871)) +- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827)) +- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718)) +- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733)) +- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743)) +- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704)) +- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713)) +- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359)) +- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696)) +- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689)) +- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) ### Bug Fixes -- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135)) -- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983)) -- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818)) -- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) -- Fix: unable to edit correspondents (in ) [@shamoon](https://github.com/shamoon) ([#2938](https://github.com/paperless-ngx/paperless-ngx/pull/2938)) -- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) -- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892)) -- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880)) -- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863)) -- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820)) -- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860)) -- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837)) -- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819)) -- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808)) -- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813)) -- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804)) -- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775)) -- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777)) -- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739)) -- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717)) -- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703)) -- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701)) -- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692)) +- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135)) +- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983)) +- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818)) +- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) +- Fix: unable to edit correspondents (in ) [@shamoon](https://github.com/shamoon) ([#2938](https://github.com/paperless-ngx/paperless-ngx/pull/2938)) +- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) +- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892)) +- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880)) +- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863)) +- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820)) +- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860)) +- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837)) +- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819)) +- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808)) +- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813)) +- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804)) +- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775)) +- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777)) +- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739)) +- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717)) +- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703)) +- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701)) +- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692)) ### Documentation -- Whitespace changes, making sure the example is correctly aligned [@denilsonsa](https://github.com/denilsonsa) ([#3089](https://github.com/paperless-ngx/paperless-ngx/pull/3089)) -- Docs: Include additional information about barcodes [@stumpylog](https://github.com/stumpylog) ([#2889](https://github.com/paperless-ngx/paperless-ngx/pull/2889)) -- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880)) -- [Documentation] Update docker-compose steps to support podman [@white-gecko](https://github.com/white-gecko) ([#2855](https://github.com/paperless-ngx/paperless-ngx/pull/2855)) -- docs: better language code help [@tooomm](https://github.com/tooomm) ([#2830](https://github.com/paperless-ngx/paperless-ngx/pull/2830)) -- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727)) -- Docs: Remove outdated PAPERLESS_WORKER_RETRY [@shamoon](https://github.com/shamoon) ([#2694](https://github.com/paperless-ngx/paperless-ngx/pull/2694)) -- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692)) +- Whitespace changes, making sure the example is correctly aligned [@denilsonsa](https://github.com/denilsonsa) ([#3089](https://github.com/paperless-ngx/paperless-ngx/pull/3089)) +- Docs: Include additional information about barcodes [@stumpylog](https://github.com/stumpylog) ([#2889](https://github.com/paperless-ngx/paperless-ngx/pull/2889)) +- Fix formatting in Setup documentation page [@igrybkov](https://github.com/igrybkov) ([#2880](https://github.com/paperless-ngx/paperless-ngx/pull/2880)) +- [Documentation] Update docker-compose steps to support podman [@white-gecko](https://github.com/white-gecko) ([#2855](https://github.com/paperless-ngx/paperless-ngx/pull/2855)) +- docs: better language code help [@tooomm](https://github.com/tooomm) ([#2830](https://github.com/paperless-ngx/paperless-ngx/pull/2830)) +- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727)) +- Docs: Remove outdated PAPERLESS_WORKER_RETRY [@shamoon](https://github.com/shamoon) ([#2694](https://github.com/paperless-ngx/paperless-ngx/pull/2694)) +- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692)) ### Maintenance -- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988)) -- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972)) -- Chore: Updates locked pipenv to latest version [@stumpylog](https://github.com/stumpylog) ([#2943](https://github.com/paperless-ngx/paperless-ngx/pull/2943)) -- Chore: Properly collapse section in releases [@tooomm](https://github.com/tooomm) ([#2838](https://github.com/paperless-ngx/paperless-ngx/pull/2838)) -- Chore: Don't include changelog PR for different releases [@tooomm](https://github.com/tooomm) ([#2832](https://github.com/paperless-ngx/paperless-ngx/pull/2832)) -- Chore: Speed up frontend CI testing [@stumpylog](https://github.com/stumpylog) ([#2796](https://github.com/paperless-ngx/paperless-ngx/pull/2796)) -- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789)) +- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988)) +- Feature: Enable images to be released on Quay.io [@stumpylog](https://github.com/stumpylog) ([#2972](https://github.com/paperless-ngx/paperless-ngx/pull/2972)) +- Chore: Updates locked pipenv to latest version [@stumpylog](https://github.com/stumpylog) ([#2943](https://github.com/paperless-ngx/paperless-ngx/pull/2943)) +- Chore: Properly collapse section in releases [@tooomm](https://github.com/tooomm) ([#2838](https://github.com/paperless-ngx/paperless-ngx/pull/2838)) +- Chore: Don't include changelog PR for different releases [@tooomm](https://github.com/tooomm) ([#2832](https://github.com/paperless-ngx/paperless-ngx/pull/2832)) +- Chore: Speed up frontend CI testing [@stumpylog](https://github.com/stumpylog) ([#2796](https://github.com/paperless-ngx/paperless-ngx/pull/2796)) +- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789)) ### Dependencies
15 changes -- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109)) -- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108)) -- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071)) -- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068)) -- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990)) -- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991)) -- Bump [@types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993)) -- Bump [@ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992)) -- Bump [@typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989)) -- Chore: Update cryptography to latest version [@stumpylog](https://github.com/stumpylog) ([#2891](https://github.com/paperless-ngx/paperless-ngx/pull/2891)) -- Chore: Update to qpdf 11.3.0 in Docker image [@stumpylog](https://github.com/stumpylog) ([#2862](https://github.com/paperless-ngx/paperless-ngx/pull/2862)) -- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789)) -- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793)) -- Bump [@typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792)) -- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788)) +- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109)) +- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108)) +- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071)) +- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068)) +- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990)) +- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991)) +- Bump [@types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993)) +- Bump [@ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992)) +- Bump [@typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989)) +- Chore: Update cryptography to latest version [@stumpylog](https://github.com/stumpylog) ([#2891](https://github.com/paperless-ngx/paperless-ngx/pull/2891)) +- Chore: Update to qpdf 11.3.0 in Docker image [@stumpylog](https://github.com/stumpylog) ([#2862](https://github.com/paperless-ngx/paperless-ngx/pull/2862)) +- Bump leonsteinhaeuser/project-beta-automations from 2.0.1 to 2.1.0 [@dependabot](https://github.com/dependabot) ([#2789](https://github.com/paperless-ngx/paperless-ngx/pull/2789)) +- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793)) +- Bump [@typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792)) +- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788))
### All App Changes @@ -4384,119 +4778,119 @@ Exports generated in Paperless-ngx v2.0.0–2.0.1 will **not** contain consumpti
72 changes -- Feature: Catalan translation [@shamoon](https://github.com/shamoon) ([#3146](https://github.com/paperless-ngx/paperless-ngx/pull/3146)) -- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135)) -- Fix: Increase mail account password field length [@stumpylog](https://github.com/stumpylog) ([#3134](https://github.com/paperless-ngx/paperless-ngx/pull/3134)) -- Fix: respect permissions for matching suggestions [@shamoon](https://github.com/shamoon) ([#3103](https://github.com/paperless-ngx/paperless-ngx/pull/3103)) -- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109)) -- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108)) -- Fix: update PaperlessTask on hard failures [@shamoon](https://github.com/shamoon) ([#3062](https://github.com/paperless-ngx/paperless-ngx/pull/3062)) -- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071)) -- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068)) -- Fix: Hide UI tour steps if user doesn't have permissions [@shamoon](https://github.com/shamoon) ([#3060](https://github.com/paperless-ngx/paperless-ngx/pull/3060)) -- Fix: Hide Permissions tab if user cannot view users [@shamoon](https://github.com/shamoon) ([#3061](https://github.com/paperless-ngx/paperless-ngx/pull/3061)) -- v1.14.0 delete document fixes [@shamoon](https://github.com/shamoon) ([#3020](https://github.com/paperless-ngx/paperless-ngx/pull/3020)) -- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990)) -- Fix: inline plaintext docs to enforce styling [@shamoon](https://github.com/shamoon) ([#3013](https://github.com/paperless-ngx/paperless-ngx/pull/3013)) -- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988)) -- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991)) -- Bump [@types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993)) -- Bump [@ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992)) -- Bump [@typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989)) -- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744)) -- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983)) -- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818)) -- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966)) -- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907)) -- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949)) -- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954)) -- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) -- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930)) -- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) -- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910)) -- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904)) -- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899)) -- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893)) -- Fix: frontend handle private tags, doctypes, correspondents [@shamoon](https://github.com/shamoon) ([#2839](https://github.com/paperless-ngx/paperless-ngx/pull/2839)) -- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892)) -- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861)) -- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873)) -- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871)) -- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863)) -- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820)) -- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860)) -- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827)) -- Chore: Create list parsing utility for settings [@stumpylog](https://github.com/stumpylog) ([#2816](https://github.com/paperless-ngx/paperless-ngx/pull/2816)) -- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837)) -- Chore: Convert more code to pathlib [@stumpylog](https://github.com/stumpylog) ([#2817](https://github.com/paperless-ngx/paperless-ngx/pull/2817)) -- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819)) -- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808)) -- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813)) -- update django.po messages [@jonaswinkler](https://github.com/jonaswinkler) ([#2806](https://github.com/paperless-ngx/paperless-ngx/pull/2806)) -- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804)) -- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718)) -- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793)) -- Bump [@typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792)) -- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788)) -- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775)) -- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777)) -- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733)) -- Chore: Setup for mypy typing checks [@stumpylog](https://github.com/stumpylog) ([#2742](https://github.com/paperless-ngx/paperless-ngx/pull/2742)) -- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743)) -- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739)) -- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704)) -- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717)) -- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703)) -- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727)) -- Chore: Improve clarity of some test asserting [@stumpylog](https://github.com/stumpylog) ([#2714](https://github.com/paperless-ngx/paperless-ngx/pull/2714)) -- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713)) -- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701)) -- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359)) -- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696)) -- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689)) -- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) -- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692)) +- Feature: Catalan translation [@shamoon](https://github.com/shamoon) ([#3146](https://github.com/paperless-ngx/paperless-ngx/pull/3146)) +- Fix: Allow setting additional Django settings for proxies [@stumpylog](https://github.com/stumpylog) ([#3135](https://github.com/paperless-ngx/paperless-ngx/pull/3135)) +- Fix: Increase mail account password field length [@stumpylog](https://github.com/stumpylog) ([#3134](https://github.com/paperless-ngx/paperless-ngx/pull/3134)) +- Fix: respect permissions for matching suggestions [@shamoon](https://github.com/shamoon) ([#3103](https://github.com/paperless-ngx/paperless-ngx/pull/3103)) +- Bump ng2-pdf-viewer from 9.1.4 to 9.1.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3109](https://github.com/paperless-ngx/paperless-ngx/pull/3109)) +- Grouped bump angular packages from 15.2.6 to 15.2.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#3108](https://github.com/paperless-ngx/paperless-ngx/pull/3108)) +- Fix: update PaperlessTask on hard failures [@shamoon](https://github.com/shamoon) ([#3062](https://github.com/paperless-ngx/paperless-ngx/pull/3062)) +- Bump typescript from 4.8.4 to 4.9.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#3071](https://github.com/paperless-ngx/paperless-ngx/pull/3071)) +- Bulk Bump npm packages 04.23 [@dependabot](https://github.com/dependabot) ([#3068](https://github.com/paperless-ngx/paperless-ngx/pull/3068)) +- Fix: Hide UI tour steps if user doesn't have permissions [@shamoon](https://github.com/shamoon) ([#3060](https://github.com/paperless-ngx/paperless-ngx/pull/3060)) +- Fix: Hide Permissions tab if user cannot view users [@shamoon](https://github.com/shamoon) ([#3061](https://github.com/paperless-ngx/paperless-ngx/pull/3061)) +- v1.14.0 delete document fixes [@shamoon](https://github.com/shamoon) ([#3020](https://github.com/paperless-ngx/paperless-ngx/pull/3020)) +- Bump wait-on from 6.0.1 to 7.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2990](https://github.com/paperless-ngx/paperless-ngx/pull/2990)) +- Fix: inline plaintext docs to enforce styling [@shamoon](https://github.com/shamoon) ([#3013](https://github.com/paperless-ngx/paperless-ngx/pull/3013)) +- Chore: Configure ruff as the primary linter for Python [@stumpylog](https://github.com/stumpylog) ([#2988](https://github.com/paperless-ngx/paperless-ngx/pull/2988)) +- Bulk bump angular packages to 15.2.5 in /src-ui [@dependabot](https://github.com/dependabot) ([#2991](https://github.com/paperless-ngx/paperless-ngx/pull/2991)) +- Bump [@types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot](https://github.com/types/node from 18.11.18 to 18.15.11 in /src-ui @dependabot) ([#2993](https://github.com/paperless-ngx/paperless-ngx/pull/2993)) +- Bump [@ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot](https://github.com/ng-select/ng-select from 10.0.3 to 10.0.4 in /src-ui @dependabot) ([#2992](https://github.com/paperless-ngx/paperless-ngx/pull/2992)) +- Bump [@typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.50.0 to 5.57.0 in /src-ui @dependabot) ([#2989](https://github.com/paperless-ngx/paperless-ngx/pull/2989)) +- Feature: Stronger typing for file consumption [@stumpylog](https://github.com/stumpylog) ([#2744](https://github.com/paperless-ngx/paperless-ngx/pull/2744)) +- Fix: Use exclude instead of difference for mariadb [@shamoon](https://github.com/shamoon) ([#2983](https://github.com/paperless-ngx/paperless-ngx/pull/2983)) +- Fix: permissions display should not show users with inherited permissions \& unable to change owner [@shamoon](https://github.com/shamoon) ([#2818](https://github.com/paperless-ngx/paperless-ngx/pull/2818)) +- Feature: double-click docs [@shamoon](https://github.com/shamoon) ([#2966](https://github.com/paperless-ngx/paperless-ngx/pull/2966)) +- feature: Add support for zxing as barcode scanning lib [@margau](https://github.com/margau) ([#2907](https://github.com/paperless-ngx/paperless-ngx/pull/2907)) +- Feature: test mail account [@shamoon](https://github.com/shamoon) ([#2949](https://github.com/paperless-ngx/paperless-ngx/pull/2949)) +- Feature: Capture celery and kombu logs to a file [@stumpylog](https://github.com/stumpylog) ([#2954](https://github.com/paperless-ngx/paperless-ngx/pull/2954)) +- Fix: Resolve Redis connection issues with ACLs [@stumpylog](https://github.com/stumpylog) ([#2939](https://github.com/paperless-ngx/paperless-ngx/pull/2939)) +- Feature: Allow mail account to use access tokens [@stumpylog](https://github.com/stumpylog) ([#2930](https://github.com/paperless-ngx/paperless-ngx/pull/2930)) +- Fix: Consumer polling could overwhelm database [@stumpylog](https://github.com/stumpylog) ([#2922](https://github.com/paperless-ngx/paperless-ngx/pull/2922)) +- Feature: Improved statistics widget [@shamoon](https://github.com/shamoon) ([#2910](https://github.com/paperless-ngx/paperless-ngx/pull/2910)) +- Enhancement: rename comments to notes and improve notes UI [@shamoon](https://github.com/shamoon) ([#2904](https://github.com/paperless-ngx/paperless-ngx/pull/2904)) +- Allow psql client certificate authentication [@Ongy](https://github.com/Ongy) ([#2899](https://github.com/paperless-ngx/paperless-ngx/pull/2899)) +- Enhancement: support filtering multiple correspondents, doctypes \& storage paths [@shamoon](https://github.com/shamoon) ([#2893](https://github.com/paperless-ngx/paperless-ngx/pull/2893)) +- Fix: frontend handle private tags, doctypes, correspondents [@shamoon](https://github.com/shamoon) ([#2839](https://github.com/paperless-ngx/paperless-ngx/pull/2839)) +- Fix: Chrome struggles with commas [@stumpylog](https://github.com/stumpylog) ([#2892](https://github.com/paperless-ngx/paperless-ngx/pull/2892)) +- Feature: Change celery serializer to pickle [@stumpylog](https://github.com/stumpylog) ([#2861](https://github.com/paperless-ngx/paperless-ngx/pull/2861)) +- Feature: Allow naming to include owner and original name [@stumpylog](https://github.com/stumpylog) ([#2873](https://github.com/paperless-ngx/paperless-ngx/pull/2873)) +- Feature: Allows filtering email by the TO value(s) as well [@stumpylog](https://github.com/stumpylog) ([#2871](https://github.com/paperless-ngx/paperless-ngx/pull/2871)) +- Fix: logout on change password via frontend [@shamoon](https://github.com/shamoon) ([#2863](https://github.com/paperless-ngx/paperless-ngx/pull/2863)) +- Fix: give superuser full doc perms [@shamoon](https://github.com/shamoon) ([#2820](https://github.com/paperless-ngx/paperless-ngx/pull/2820)) +- Fix: Append Gmail labels instead of replacing [@stumpylog](https://github.com/stumpylog) ([#2860](https://github.com/paperless-ngx/paperless-ngx/pull/2860)) +- Feature: owner-aware unique model name constraint [@shamoon](https://github.com/shamoon) ([#2827](https://github.com/paperless-ngx/paperless-ngx/pull/2827)) +- Chore: Create list parsing utility for settings [@stumpylog](https://github.com/stumpylog) ([#2816](https://github.com/paperless-ngx/paperless-ngx/pull/2816)) +- Fix: Ensure email date is made aware during action processing [@stumpylog](https://github.com/stumpylog) ([#2837](https://github.com/paperless-ngx/paperless-ngx/pull/2837)) +- Chore: Convert more code to pathlib [@stumpylog](https://github.com/stumpylog) ([#2817](https://github.com/paperless-ngx/paperless-ngx/pull/2817)) +- Fix: disable bulk edit dialog buttons during operation [@shamoon](https://github.com/shamoon) ([#2819](https://github.com/paperless-ngx/paperless-ngx/pull/2819)) +- fix database locked error [@jonaswinkler](https://github.com/jonaswinkler) ([#2808](https://github.com/paperless-ngx/paperless-ngx/pull/2808)) +- Fix: Disable suggestions for read-only docs [@shamoon](https://github.com/shamoon) ([#2813](https://github.com/paperless-ngx/paperless-ngx/pull/2813)) +- update django.po messages [@jonaswinkler](https://github.com/jonaswinkler) ([#2806](https://github.com/paperless-ngx/paperless-ngx/pull/2806)) +- Update processed mail migration [@shamoon](https://github.com/shamoon) ([#2804](https://github.com/paperless-ngx/paperless-ngx/pull/2804)) +- Feature/2396 better mail actions [@jonaswinkler](https://github.com/jonaswinkler) ([#2718](https://github.com/paperless-ngx/paperless-ngx/pull/2718)) +- Bump zone.js from 0.11.8 to 0.12.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#2793](https://github.com/paperless-ngx/paperless-ngx/pull/2793)) +- Bump [@typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.50.0 to 5.54.0 in /src-ui @dependabot) ([#2792](https://github.com/paperless-ngx/paperless-ngx/pull/2792)) +- Bulk Bump angular packages to 15.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#2788](https://github.com/paperless-ngx/paperless-ngx/pull/2788)) +- Fix: Ensure scratch directory exists before using [@stumpylog](https://github.com/stumpylog) ([#2775](https://github.com/paperless-ngx/paperless-ngx/pull/2775)) +- Don't submit owner via API on document upload [@jonaswinkler](https://github.com/jonaswinkler) ([#2777](https://github.com/paperless-ngx/paperless-ngx/pull/2777)) +- Feature: Reduce classifier memory usage somewhat during training [@stumpylog](https://github.com/stumpylog) ([#2733](https://github.com/paperless-ngx/paperless-ngx/pull/2733)) +- Chore: Setup for mypy typing checks [@stumpylog](https://github.com/stumpylog) ([#2742](https://github.com/paperless-ngx/paperless-ngx/pull/2742)) +- Feature: Add PAPERLESS_OCR_SKIP_ARCHIVE_FILE config setting [@bdr99](https://github.com/bdr99) ([#2743](https://github.com/paperless-ngx/paperless-ngx/pull/2743)) +- Fix: only offer log files that exist [@shamoon](https://github.com/shamoon) ([#2739](https://github.com/paperless-ngx/paperless-ngx/pull/2739)) +- Feature: dynamic document counts in dropdowns [@shamoon](https://github.com/shamoon) ([#2704](https://github.com/paperless-ngx/paperless-ngx/pull/2704)) +- Fix: permissions editing and initial view issues [@shamoon](https://github.com/shamoon) ([#2717](https://github.com/paperless-ngx/paperless-ngx/pull/2717)) +- Fix: reset saved view ID on quickFilter [@shamoon](https://github.com/shamoon) ([#2703](https://github.com/paperless-ngx/paperless-ngx/pull/2703)) +- Feature: Add an option to disable matching [@bdr99](https://github.com/bdr99) ([#2727](https://github.com/paperless-ngx/paperless-ngx/pull/2727)) +- Chore: Improve clarity of some test asserting [@stumpylog](https://github.com/stumpylog) ([#2714](https://github.com/paperless-ngx/paperless-ngx/pull/2714)) +- Allow setting the ASN on document upload [@stumpylog](https://github.com/stumpylog) ([#2713](https://github.com/paperless-ngx/paperless-ngx/pull/2713)) +- Fix: bulk edit reset apply button state [@shamoon](https://github.com/shamoon) ([#2701](https://github.com/paperless-ngx/paperless-ngx/pull/2701)) +- Feature: Log failed login attempts [@shamoon](https://github.com/shamoon) ([#2359](https://github.com/paperless-ngx/paperless-ngx/pull/2359)) +- Feature: Rename documents when storage path format changes [@stumpylog](https://github.com/stumpylog) ([#2696](https://github.com/paperless-ngx/paperless-ngx/pull/2696)) +- Feature: update error message colors \& show on document failures [@shamoon](https://github.com/shamoon) ([#2689](https://github.com/paperless-ngx/paperless-ngx/pull/2689)) +- Feature: multi-user permissions [@shamoon](https://github.com/shamoon) ([#2147](https://github.com/paperless-ngx/paperless-ngx/pull/2147)) +- Fix: add missing i18n for mobile preview tab title [@nathanaelhoun](https://github.com/nathanaelhoun) ([#2692](https://github.com/paperless-ngx/paperless-ngx/pull/2692))
## paperless-ngx 1.13.0 ### Features -- Feature: allow disable warn on close saved view with changes [@shamoon](https://github.com/shamoon) ([#2681](https://github.com/paperless-ngx/paperless-ngx/pull/2681)) -- Feature: Add option to enable response compression [@stumpylog](https://github.com/stumpylog) ([#2621](https://github.com/paperless-ngx/paperless-ngx/pull/2621)) -- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554)) +- Feature: allow disable warn on close saved view with changes [@shamoon](https://github.com/shamoon) ([#2681](https://github.com/paperless-ngx/paperless-ngx/pull/2681)) +- Feature: Add option to enable response compression [@stumpylog](https://github.com/stumpylog) ([#2621](https://github.com/paperless-ngx/paperless-ngx/pull/2621)) +- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554)) ### Bug Fixes -- Fix: Ignore path filtering didn't handle sub directories [@stumpylog](https://github.com/stumpylog) ([#2674](https://github.com/paperless-ngx/paperless-ngx/pull/2674)) -- Bugfix: Generation of secret key hangs during install script [@stumpylog](https://github.com/stumpylog) ([#2657](https://github.com/paperless-ngx/paperless-ngx/pull/2657)) -- Fix: Remove files produced by barcode splitting when completed [@stumpylog](https://github.com/stumpylog) ([#2648](https://github.com/paperless-ngx/paperless-ngx/pull/2648)) -- Fix: add missing storage path placeholders [@shamoon](https://github.com/shamoon) ([#2651](https://github.com/paperless-ngx/paperless-ngx/pull/2651)) -- Fix long dropdown contents break document detail column view [@shamoon](https://github.com/shamoon) ([#2638](https://github.com/paperless-ngx/paperless-ngx/pull/2638)) -- Fix: tags dropdown should stay closed when removing [@shamoon](https://github.com/shamoon) ([#2625](https://github.com/paperless-ngx/paperless-ngx/pull/2625)) -- Bugfix: Configure scheduled tasks to expire after some time [@stumpylog](https://github.com/stumpylog) ([#2614](https://github.com/paperless-ngx/paperless-ngx/pull/2614)) -- Bugfix: Limit management list pagination maxSize to 5 [@Kaaybi](https://github.com/Kaaybi) ([#2618](https://github.com/paperless-ngx/paperless-ngx/pull/2618)) -- Fix: Don't crash on bad ASNs during indexing [@stumpylog](https://github.com/stumpylog) ([#2586](https://github.com/paperless-ngx/paperless-ngx/pull/2586)) -- Fix: Prevent mktime OverflowError except in even more rare caes [@stumpylog](https://github.com/stumpylog) ([#2574](https://github.com/paperless-ngx/paperless-ngx/pull/2574)) -- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566)) -- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555)) +- Fix: Ignore path filtering didn't handle sub directories [@stumpylog](https://github.com/stumpylog) ([#2674](https://github.com/paperless-ngx/paperless-ngx/pull/2674)) +- Bugfix: Generation of secret key hangs during install script [@stumpylog](https://github.com/stumpylog) ([#2657](https://github.com/paperless-ngx/paperless-ngx/pull/2657)) +- Fix: Remove files produced by barcode splitting when completed [@stumpylog](https://github.com/stumpylog) ([#2648](https://github.com/paperless-ngx/paperless-ngx/pull/2648)) +- Fix: add missing storage path placeholders [@shamoon](https://github.com/shamoon) ([#2651](https://github.com/paperless-ngx/paperless-ngx/pull/2651)) +- Fix long dropdown contents break document detail column view [@shamoon](https://github.com/shamoon) ([#2638](https://github.com/paperless-ngx/paperless-ngx/pull/2638)) +- Fix: tags dropdown should stay closed when removing [@shamoon](https://github.com/shamoon) ([#2625](https://github.com/paperless-ngx/paperless-ngx/pull/2625)) +- Bugfix: Configure scheduled tasks to expire after some time [@stumpylog](https://github.com/stumpylog) ([#2614](https://github.com/paperless-ngx/paperless-ngx/pull/2614)) +- Bugfix: Limit management list pagination maxSize to 5 [@Kaaybi](https://github.com/Kaaybi) ([#2618](https://github.com/paperless-ngx/paperless-ngx/pull/2618)) +- Fix: Don't crash on bad ASNs during indexing [@stumpylog](https://github.com/stumpylog) ([#2586](https://github.com/paperless-ngx/paperless-ngx/pull/2586)) +- Fix: Prevent mktime OverflowError except in even more rare caes [@stumpylog](https://github.com/stumpylog) ([#2574](https://github.com/paperless-ngx/paperless-ngx/pull/2574)) +- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566)) +- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555)) ### Documentation -- Chore: update recommended Gotenberg to 7.8, docs note possible incompatibility [@shamoon](https://github.com/shamoon) ([#2608](https://github.com/paperless-ngx/paperless-ngx/pull/2608)) -- [Documentation] Add v1.12.2 changelog [@github-actions](https://github.com/github-actions) ([#2553](https://github.com/paperless-ngx/paperless-ngx/pull/2553)) +- Chore: update recommended Gotenberg to 7.8, docs note possible incompatibility [@shamoon](https://github.com/shamoon) ([#2608](https://github.com/paperless-ngx/paperless-ngx/pull/2608)) +- [Documentation] Add v1.12.2 changelog [@github-actions](https://github.com/github-actions) ([#2553](https://github.com/paperless-ngx/paperless-ngx/pull/2553)) ### Maintenance -- Chore: Faster Docker image cleanup [@stumpylog](https://github.com/stumpylog) ([#2687](https://github.com/paperless-ngx/paperless-ngx/pull/2687)) -- Chore: Remove duplicated folder [@stumpylog](https://github.com/stumpylog) ([#2561](https://github.com/paperless-ngx/paperless-ngx/pull/2561)) -- Chore: Switch test coverage to Codecov [@stumpylog](https://github.com/stumpylog) ([#2582](https://github.com/paperless-ngx/paperless-ngx/pull/2582)) -- Bump docker/build-push-action from 3 to 4 [@dependabot](https://github.com/dependabot) ([#2576](https://github.com/paperless-ngx/paperless-ngx/pull/2576)) -- Chore: Run tests which require convert in the CI [@stumpylog](https://github.com/stumpylog) ([#2570](https://github.com/paperless-ngx/paperless-ngx/pull/2570)) +- Chore: Faster Docker image cleanup [@stumpylog](https://github.com/stumpylog) ([#2687](https://github.com/paperless-ngx/paperless-ngx/pull/2687)) +- Chore: Remove duplicated folder [@stumpylog](https://github.com/stumpylog) ([#2561](https://github.com/paperless-ngx/paperless-ngx/pull/2561)) +- Chore: Switch test coverage to Codecov [@stumpylog](https://github.com/stumpylog) ([#2582](https://github.com/paperless-ngx/paperless-ngx/pull/2582)) +- Bump docker/build-push-action from 3 to 4 [@dependabot](https://github.com/dependabot) ([#2576](https://github.com/paperless-ngx/paperless-ngx/pull/2576)) +- Chore: Run tests which require convert in the CI [@stumpylog](https://github.com/stumpylog) ([#2570](https://github.com/paperless-ngx/paperless-ngx/pull/2570)) -- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554)) -- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566)) -- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555)) +- Feature: split documents on ASN barcode [@muued](https://github.com/muued) ([#2554](https://github.com/paperless-ngx/paperless-ngx/pull/2554)) +- Bugfix: Whoosh relative date queries weren't handling timezones [@stumpylog](https://github.com/stumpylog) ([#2566](https://github.com/paperless-ngx/paperless-ngx/pull/2566)) +- Fix importing files with non-ascii names [@Kexogg](https://github.com/Kexogg) ([#2555](https://github.com/paperless-ngx/paperless-ngx/pull/2555)) ## paperless-ngx 1.12.2 @@ -4505,147 +4899,147 @@ older comments. The Docker image will automatically perform this reindex, bare m ### Bug Fixes -- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) -- Bugfix: Return to page based barcode scanning [@stumpylog](https://github.com/stumpylog) ([#2544](https://github.com/paperless-ngx/paperless-ngx/pull/2544)) -- Fix: Try to prevent title debounce overwriting [@shamoon](https://github.com/shamoon) ([#2543](https://github.com/paperless-ngx/paperless-ngx/pull/2543)) -- Fix comment search highlight + multi-word search [@shamoon](https://github.com/shamoon) ([#2542](https://github.com/paperless-ngx/paperless-ngx/pull/2542)) -- Bugfix: Request PDF/A format from Gotenberg [@stumpylog](https://github.com/stumpylog) ([#2530](https://github.com/paperless-ngx/paperless-ngx/pull/2530)) -- Fix: Trigger reindex for pre-existing comments [@shamoon](https://github.com/shamoon) ([#2519](https://github.com/paperless-ngx/paperless-ngx/pull/2519)) +- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) +- Bugfix: Return to page based barcode scanning [@stumpylog](https://github.com/stumpylog) ([#2544](https://github.com/paperless-ngx/paperless-ngx/pull/2544)) +- Fix: Try to prevent title debounce overwriting [@shamoon](https://github.com/shamoon) ([#2543](https://github.com/paperless-ngx/paperless-ngx/pull/2543)) +- Fix comment search highlight + multi-word search [@shamoon](https://github.com/shamoon) ([#2542](https://github.com/paperless-ngx/paperless-ngx/pull/2542)) +- Bugfix: Request PDF/A format from Gotenberg [@stumpylog](https://github.com/stumpylog) ([#2530](https://github.com/paperless-ngx/paperless-ngx/pull/2530)) +- Fix: Trigger reindex for pre-existing comments [@shamoon](https://github.com/shamoon) ([#2519](https://github.com/paperless-ngx/paperless-ngx/pull/2519)) ### Documentation -- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) -- Fix: Trigger reindex for pre-existing comments [@shamoon](https://github.com/shamoon) ([#2519](https://github.com/paperless-ngx/paperless-ngx/pull/2519)) -- Minor updates to development documentation [@clemensrieder](https://github.com/clemensrieder) ([#2474](https://github.com/paperless-ngx/paperless-ngx/pull/2474)) -- [Documentation] Add v1.12.1 changelog [@github-actions](https://github.com/github-actions) ([#2515](https://github.com/paperless-ngx/paperless-ngx/pull/2515)) +- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) +- Fix: Trigger reindex for pre-existing comments [@shamoon](https://github.com/shamoon) ([#2519](https://github.com/paperless-ngx/paperless-ngx/pull/2519)) +- Minor updates to development documentation [@clemensrieder](https://github.com/clemensrieder) ([#2474](https://github.com/paperless-ngx/paperless-ngx/pull/2474)) +- [Documentation] Add v1.12.1 changelog [@github-actions](https://github.com/github-actions) ([#2515](https://github.com/paperless-ngx/paperless-ngx/pull/2515)) ### Maintenance -- Chore: Fix tag cleaner to work with attestations [@stumpylog](https://github.com/stumpylog) ([#2532](https://github.com/paperless-ngx/paperless-ngx/pull/2532)) -- Chore: Make installers statically versioned [@stumpylog](https://github.com/stumpylog) ([#2517](https://github.com/paperless-ngx/paperless-ngx/pull/2517)) +- Chore: Fix tag cleaner to work with attestations [@stumpylog](https://github.com/stumpylog) ([#2532](https://github.com/paperless-ngx/paperless-ngx/pull/2532)) +- Chore: Make installers statically versioned [@stumpylog](https://github.com/stumpylog) ([#2517](https://github.com/paperless-ngx/paperless-ngx/pull/2517)) ### All App Changes -- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) -- Bugfix: Return to page based barcode scanning [@stumpylog](https://github.com/stumpylog) ([#2544](https://github.com/paperless-ngx/paperless-ngx/pull/2544)) -- Fix: Try to prevent title debounce overwriting [@shamoon](https://github.com/shamoon) ([#2543](https://github.com/paperless-ngx/paperless-ngx/pull/2543)) -- Fix comment search highlight + multi-word search [@shamoon](https://github.com/shamoon) ([#2542](https://github.com/paperless-ngx/paperless-ngx/pull/2542)) -- Bugfix: Request PDF/A format from Gotenberg [@stumpylog](https://github.com/stumpylog) ([#2530](https://github.com/paperless-ngx/paperless-ngx/pull/2530)) +- Bugfix: Allow pre-consume scripts to modify incoming file [@stumpylog](https://github.com/stumpylog) ([#2547](https://github.com/paperless-ngx/paperless-ngx/pull/2547)) +- Bugfix: Return to page based barcode scanning [@stumpylog](https://github.com/stumpylog) ([#2544](https://github.com/paperless-ngx/paperless-ngx/pull/2544)) +- Fix: Try to prevent title debounce overwriting [@shamoon](https://github.com/shamoon) ([#2543](https://github.com/paperless-ngx/paperless-ngx/pull/2543)) +- Fix comment search highlight + multi-word search [@shamoon](https://github.com/shamoon) ([#2542](https://github.com/paperless-ngx/paperless-ngx/pull/2542)) +- Bugfix: Request PDF/A format from Gotenberg [@stumpylog](https://github.com/stumpylog) ([#2530](https://github.com/paperless-ngx/paperless-ngx/pull/2530)) ## paperless-ngx 1.12.1 ### Bug Fixes -- Fix: comments not showing in search until after manual reindex in v1.12 [@shamoon](https://github.com/shamoon) ([#2513](https://github.com/paperless-ngx/paperless-ngx/pull/2513)) -- Fix: date range search broken in 1.12 [@shamoon](https://github.com/shamoon) ([#2509](https://github.com/paperless-ngx/paperless-ngx/pull/2509)) +- Fix: comments not showing in search until after manual reindex in v1.12 [@shamoon](https://github.com/shamoon) ([#2513](https://github.com/paperless-ngx/paperless-ngx/pull/2513)) +- Fix: date range search broken in 1.12 [@shamoon](https://github.com/shamoon) ([#2509](https://github.com/paperless-ngx/paperless-ngx/pull/2509)) ### Documentation -- [Documentation] Add v1.12.0 changelog [@github-actions](https://github.com/github-actions) ([#2507](https://github.com/paperless-ngx/paperless-ngx/pull/2507)) +- [Documentation] Add v1.12.0 changelog [@github-actions](https://github.com/github-actions) ([#2507](https://github.com/paperless-ngx/paperless-ngx/pull/2507)) ### Maintenance -- Moves back to the main release-drafter now that it does what we wanted [@stumpylog](https://github.com/stumpylog) ([#2503](https://github.com/paperless-ngx/paperless-ngx/pull/2503)) +- Moves back to the main release-drafter now that it does what we wanted [@stumpylog](https://github.com/stumpylog) ([#2503](https://github.com/paperless-ngx/paperless-ngx/pull/2503)) ### All App Changes -- Fix: comments not showing in search until after manual reindex in v1.12 [@shamoon](https://github.com/shamoon) ([#2513](https://github.com/paperless-ngx/paperless-ngx/pull/2513)) -- Fix: date range search broken in 1.12 [@shamoon](https://github.com/shamoon) ([#2509](https://github.com/paperless-ngx/paperless-ngx/pull/2509)) +- Fix: comments not showing in search until after manual reindex in v1.12 [@shamoon](https://github.com/shamoon) ([#2513](https://github.com/paperless-ngx/paperless-ngx/pull/2513)) +- Fix: date range search broken in 1.12 [@shamoon](https://github.com/shamoon) ([#2509](https://github.com/paperless-ngx/paperless-ngx/pull/2509)) ## paperless-ngx 1.12.0 ### Features -- New document_exporter options [@mhelleboid](https://github.com/mhelleboid) ([#2448](https://github.com/paperless-ngx/paperless-ngx/pull/2448)) -- Read ASN from barcode on page [@peterkappelt](https://github.com/peterkappelt) ([#2437](https://github.com/paperless-ngx/paperless-ngx/pull/2437)) -- Add AppleMail color tag support [@clemensrieder](https://github.com/clemensrieder) ([#2407](https://github.com/paperless-ngx/paperless-ngx/pull/2407)) -- Feature: Retain original filename on upload [@stumpylog](https://github.com/stumpylog) ([#2404](https://github.com/paperless-ngx/paperless-ngx/pull/2404)) -- Feature: Control scheduled tasks via cron expressions [@stumpylog](https://github.com/stumpylog) ([#2403](https://github.com/paperless-ngx/paperless-ngx/pull/2403)) -- Simplify json parsing in build scripts [@tribut](https://github.com/tribut) ([#2370](https://github.com/paperless-ngx/paperless-ngx/pull/2370)) -- Feature: include comments in advanced search [@shamoon](https://github.com/shamoon) ([#2351](https://github.com/paperless-ngx/paperless-ngx/pull/2351)) +- New document_exporter options [@mhelleboid](https://github.com/mhelleboid) ([#2448](https://github.com/paperless-ngx/paperless-ngx/pull/2448)) +- Read ASN from barcode on page [@peterkappelt](https://github.com/peterkappelt) ([#2437](https://github.com/paperless-ngx/paperless-ngx/pull/2437)) +- Add AppleMail color tag support [@clemensrieder](https://github.com/clemensrieder) ([#2407](https://github.com/paperless-ngx/paperless-ngx/pull/2407)) +- Feature: Retain original filename on upload [@stumpylog](https://github.com/stumpylog) ([#2404](https://github.com/paperless-ngx/paperless-ngx/pull/2404)) +- Feature: Control scheduled tasks via cron expressions [@stumpylog](https://github.com/stumpylog) ([#2403](https://github.com/paperless-ngx/paperless-ngx/pull/2403)) +- Simplify json parsing in build scripts [@tribut](https://github.com/tribut) ([#2370](https://github.com/paperless-ngx/paperless-ngx/pull/2370)) +- Feature: include comments in advanced search [@shamoon](https://github.com/shamoon) ([#2351](https://github.com/paperless-ngx/paperless-ngx/pull/2351)) ### Bug Fixes -- Fix: limit asn integer size [@shamoon](https://github.com/shamoon) ([#2498](https://github.com/paperless-ngx/paperless-ngx/pull/2498)) -- Bugfix: Rescales images for better barcode locating [@stumpylog](https://github.com/stumpylog) ([#2468](https://github.com/paperless-ngx/paperless-ngx/pull/2468)) -- Fix: fix downgrade migration [@shamoon](https://github.com/shamoon) ([#2494](https://github.com/paperless-ngx/paperless-ngx/pull/2494)) -- Fix: Allow setting mailrule order from frontend [@shamoon](https://github.com/shamoon) ([#2459](https://github.com/paperless-ngx/paperless-ngx/pull/2459)) -- Fix: tag color ordering [@shamoon](https://github.com/shamoon) ([#2456](https://github.com/paperless-ngx/paperless-ngx/pull/2456)) -- Fix: Better Handle arbitrary ISO 8601 strings after celery serializing [@shamoon](https://github.com/shamoon) ([#2441](https://github.com/paperless-ngx/paperless-ngx/pull/2441)) -- Use correct canonical path for nltk_data [@amo13](https://github.com/amo13) ([#2429](https://github.com/paperless-ngx/paperless-ngx/pull/2429)) -- Fix: Include optional socket file in release [@stumpylog](https://github.com/stumpylog) ([#2409](https://github.com/paperless-ngx/paperless-ngx/pull/2409)) -- Fix: display rtl content in correct direction [@shamoon](https://github.com/shamoon) ([#2302](https://github.com/paperless-ngx/paperless-ngx/pull/2302)) -- Fixed endpoint count in Docs The REST API [@PascalSenn](https://github.com/PascalSenn) ([#2386](https://github.com/paperless-ngx/paperless-ngx/pull/2386)) -- Fix subpath for websockets [@tribut](https://github.com/tribut) ([#2371](https://github.com/paperless-ngx/paperless-ngx/pull/2371)) -- Fix: Make missing environment from file files informational only [@stumpylog](https://github.com/stumpylog) ([#2368](https://github.com/paperless-ngx/paperless-ngx/pull/2368)) -- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) -- Fix: preview content remains hidden on mobile [@shamoon](https://github.com/shamoon) ([#2346](https://github.com/paperless-ngx/paperless-ngx/pull/2346)) -- Bugfix: Removal of alpha channel truncates multipage TIFFs [@stumpylog](https://github.com/stumpylog) ([#2335](https://github.com/paperless-ngx/paperless-ngx/pull/2335)) -- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) +- Fix: limit asn integer size [@shamoon](https://github.com/shamoon) ([#2498](https://github.com/paperless-ngx/paperless-ngx/pull/2498)) +- Bugfix: Rescales images for better barcode locating [@stumpylog](https://github.com/stumpylog) ([#2468](https://github.com/paperless-ngx/paperless-ngx/pull/2468)) +- Fix: fix downgrade migration [@shamoon](https://github.com/shamoon) ([#2494](https://github.com/paperless-ngx/paperless-ngx/pull/2494)) +- Fix: Allow setting mailrule order from frontend [@shamoon](https://github.com/shamoon) ([#2459](https://github.com/paperless-ngx/paperless-ngx/pull/2459)) +- Fix: tag color ordering [@shamoon](https://github.com/shamoon) ([#2456](https://github.com/paperless-ngx/paperless-ngx/pull/2456)) +- Fix: Better Handle arbitrary ISO 8601 strings after celery serializing [@shamoon](https://github.com/shamoon) ([#2441](https://github.com/paperless-ngx/paperless-ngx/pull/2441)) +- Use correct canonical path for nltk_data [@amo13](https://github.com/amo13) ([#2429](https://github.com/paperless-ngx/paperless-ngx/pull/2429)) +- Fix: Include optional socket file in release [@stumpylog](https://github.com/stumpylog) ([#2409](https://github.com/paperless-ngx/paperless-ngx/pull/2409)) +- Fix: display rtl content in correct direction [@shamoon](https://github.com/shamoon) ([#2302](https://github.com/paperless-ngx/paperless-ngx/pull/2302)) +- Fixed endpoint count in Docs The REST API [@PascalSenn](https://github.com/PascalSenn) ([#2386](https://github.com/paperless-ngx/paperless-ngx/pull/2386)) +- Fix subpath for websockets [@tribut](https://github.com/tribut) ([#2371](https://github.com/paperless-ngx/paperless-ngx/pull/2371)) +- Fix: Make missing environment from file files informational only [@stumpylog](https://github.com/stumpylog) ([#2368](https://github.com/paperless-ngx/paperless-ngx/pull/2368)) +- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) +- Fix: preview content remains hidden on mobile [@shamoon](https://github.com/shamoon) ([#2346](https://github.com/paperless-ngx/paperless-ngx/pull/2346)) +- Bugfix: Removal of alpha channel truncates multipage TIFFs [@stumpylog](https://github.com/stumpylog) ([#2335](https://github.com/paperless-ngx/paperless-ngx/pull/2335)) +- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) ### Documentation -- Docs: Fix typo - docker-compose.yml file name in setup doc [@muli](https://github.com/muli) ([#2477](https://github.com/paperless-ngx/paperless-ngx/pull/2477)) -- document existence of document_thumbnails [@frrad](https://github.com/frrad) ([#2470](https://github.com/paperless-ngx/paperless-ngx/pull/2470)) -- Add optional sudo command to bare metal docs [@shamoon](https://github.com/shamoon) ([#2464](https://github.com/paperless-ngx/paperless-ngx/pull/2464)) -- Fix link [@edenhaus](https://github.com/edenhaus) ([#2458](https://github.com/paperless-ngx/paperless-ngx/pull/2458)) -- Documentation: Fix comment re bare metal runserver command [@shamoon](https://github.com/shamoon) ([#2420](https://github.com/paperless-ngx/paperless-ngx/pull/2420)) -- Fix formatting of config variable in docs [@peterkappelt](https://github.com/peterkappelt) ([#2445](https://github.com/paperless-ngx/paperless-ngx/pull/2445)) -- Update docs nginx reverse proxy example [@Sprinterfreak](https://github.com/Sprinterfreak) ([#2443](https://github.com/paperless-ngx/paperless-ngx/pull/2443)) -- [Documentation] Add note re for dev server [@shamoon](https://github.com/shamoon) ([#2387](https://github.com/paperless-ngx/paperless-ngx/pull/2387)) -- Fixed endpoint count in Docs The REST API [@PascalSenn](https://github.com/PascalSenn) ([#2386](https://github.com/paperless-ngx/paperless-ngx/pull/2386)) -- [ Docs] Update bare metal setup instructions [@natrius](https://github.com/natrius) ([#2281](https://github.com/paperless-ngx/paperless-ngx/pull/2281)) -- [Docs] Add Paperless Mobile app to docs [@astubenbord](https://github.com/astubenbord) ([#2378](https://github.com/paperless-ngx/paperless-ngx/pull/2378)) -- Tiny spelling change [@veverkap](https://github.com/veverkap) ([#2369](https://github.com/paperless-ngx/paperless-ngx/pull/2369)) -- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) -- [Documentation] Add note that PAPERLESS_URL can't contain a path [@shamoon](https://github.com/shamoon) ([#2319](https://github.com/paperless-ngx/paperless-ngx/pull/2319)) -- [Documentation] Add v1.11.3 changelog [@github-actions](https://github.com/github-actions) ([#2311](https://github.com/paperless-ngx/paperless-ngx/pull/2311)) +- Docs: Fix typo - docker-compose.yml file name in setup doc [@muli](https://github.com/muli) ([#2477](https://github.com/paperless-ngx/paperless-ngx/pull/2477)) +- document existence of document_thumbnails [@frrad](https://github.com/frrad) ([#2470](https://github.com/paperless-ngx/paperless-ngx/pull/2470)) +- Add optional sudo command to bare metal docs [@shamoon](https://github.com/shamoon) ([#2464](https://github.com/paperless-ngx/paperless-ngx/pull/2464)) +- Fix link [@edenhaus](https://github.com/edenhaus) ([#2458](https://github.com/paperless-ngx/paperless-ngx/pull/2458)) +- Documentation: Fix comment re bare metal runserver command [@shamoon](https://github.com/shamoon) ([#2420](https://github.com/paperless-ngx/paperless-ngx/pull/2420)) +- Fix formatting of config variable in docs [@peterkappelt](https://github.com/peterkappelt) ([#2445](https://github.com/paperless-ngx/paperless-ngx/pull/2445)) +- Update docs nginx reverse proxy example [@Sprinterfreak](https://github.com/Sprinterfreak) ([#2443](https://github.com/paperless-ngx/paperless-ngx/pull/2443)) +- [Documentation] Add note re for dev server [@shamoon](https://github.com/shamoon) ([#2387](https://github.com/paperless-ngx/paperless-ngx/pull/2387)) +- Fixed endpoint count in Docs The REST API [@PascalSenn](https://github.com/PascalSenn) ([#2386](https://github.com/paperless-ngx/paperless-ngx/pull/2386)) +- [ Docs] Update bare metal setup instructions [@natrius](https://github.com/natrius) ([#2281](https://github.com/paperless-ngx/paperless-ngx/pull/2281)) +- [Docs] Add Paperless Mobile app to docs [@astubenbord](https://github.com/astubenbord) ([#2378](https://github.com/paperless-ngx/paperless-ngx/pull/2378)) +- Tiny spelling change [@veverkap](https://github.com/veverkap) ([#2369](https://github.com/paperless-ngx/paperless-ngx/pull/2369)) +- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) +- [Documentation] Add note that PAPERLESS_URL can't contain a path [@shamoon](https://github.com/shamoon) ([#2319](https://github.com/paperless-ngx/paperless-ngx/pull/2319)) +- [Documentation] Add v1.11.3 changelog [@github-actions](https://github.com/github-actions) ([#2311](https://github.com/paperless-ngx/paperless-ngx/pull/2311)) ### Maintenance -- Fix: Include optional socket file in release [@stumpylog](https://github.com/stumpylog) ([#2409](https://github.com/paperless-ngx/paperless-ngx/pull/2409)) -- Chore: remove helm chart code [@shamoon](https://github.com/shamoon) ([#2388](https://github.com/paperless-ngx/paperless-ngx/pull/2388)) -- Simplify json parsing in build scripts [@tribut](https://github.com/tribut) ([#2370](https://github.com/paperless-ngx/paperless-ngx/pull/2370)) -- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) -- Bump tj-actions/changed-files from 34 to 35 [@dependabot](https://github.com/dependabot) ([#2303](https://github.com/paperless-ngx/paperless-ngx/pull/2303)) +- Fix: Include optional socket file in release [@stumpylog](https://github.com/stumpylog) ([#2409](https://github.com/paperless-ngx/paperless-ngx/pull/2409)) +- Chore: remove helm chart code [@shamoon](https://github.com/shamoon) ([#2388](https://github.com/paperless-ngx/paperless-ngx/pull/2388)) +- Simplify json parsing in build scripts [@tribut](https://github.com/tribut) ([#2370](https://github.com/paperless-ngx/paperless-ngx/pull/2370)) +- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) +- Bump tj-actions/changed-files from 34 to 35 [@dependabot](https://github.com/dependabot) ([#2303](https://github.com/paperless-ngx/paperless-ngx/pull/2303)) ### Dependencies
4 changes -- Chore: Backend library updates [@stumpylog](https://github.com/stumpylog) ([#2401](https://github.com/paperless-ngx/paperless-ngx/pull/2401)) -- Bump tj-actions/changed-files from 34 to 35 [@dependabot](https://github.com/dependabot) ([#2303](https://github.com/paperless-ngx/paperless-ngx/pull/2303)) -- Bump [@typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2306](https://github.com/paperless-ngx/paperless-ngx/pull/2306)) -- Bump [@typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2308](https://github.com/paperless-ngx/paperless-ngx/pull/2308)) +- Chore: Backend library updates [@stumpylog](https://github.com/stumpylog) ([#2401](https://github.com/paperless-ngx/paperless-ngx/pull/2401)) +- Bump tj-actions/changed-files from 34 to 35 [@dependabot](https://github.com/dependabot) ([#2303](https://github.com/paperless-ngx/paperless-ngx/pull/2303)) +- Bump [@typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2306](https://github.com/paperless-ngx/paperless-ngx/pull/2306)) +- Bump [@typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2308](https://github.com/paperless-ngx/paperless-ngx/pull/2308))
### All App Changes -- New document_exporter options [@mhelleboid](https://github.com/mhelleboid) ([#2448](https://github.com/paperless-ngx/paperless-ngx/pull/2448)) -- Fix: limit asn integer size [@shamoon](https://github.com/shamoon) ([#2498](https://github.com/paperless-ngx/paperless-ngx/pull/2498)) -- Fix: fix downgrade migration [@shamoon](https://github.com/shamoon) ([#2494](https://github.com/paperless-ngx/paperless-ngx/pull/2494)) -- Read ASN from barcode on page [@peterkappelt](https://github.com/peterkappelt) ([#2437](https://github.com/paperless-ngx/paperless-ngx/pull/2437)) -- Fix: Allow setting mailrule order from frontend [@shamoon](https://github.com/shamoon) ([#2459](https://github.com/paperless-ngx/paperless-ngx/pull/2459)) -- Chore: Update to Angular 15 \& associated frontend deps [@shamoon](https://github.com/shamoon) ([#2411](https://github.com/paperless-ngx/paperless-ngx/pull/2411)) -- Fix: tag color ordering [@shamoon](https://github.com/shamoon) ([#2456](https://github.com/paperless-ngx/paperless-ngx/pull/2456)) -- Fix: Better Handle arbitrary ISO 8601 strings after celery serializing [@shamoon](https://github.com/shamoon) ([#2441](https://github.com/paperless-ngx/paperless-ngx/pull/2441)) -- Use correct canonical path for nltk_data [@amo13](https://github.com/amo13) ([#2429](https://github.com/paperless-ngx/paperless-ngx/pull/2429)) -- Add AppleMail color tag support [@clemensrieder](https://github.com/clemensrieder) ([#2407](https://github.com/paperless-ngx/paperless-ngx/pull/2407)) -- Chore: Convert document exporter to use pathlib [@stumpylog](https://github.com/stumpylog) ([#2416](https://github.com/paperless-ngx/paperless-ngx/pull/2416)) -- Feature: Retain original filename on upload [@stumpylog](https://github.com/stumpylog) ([#2404](https://github.com/paperless-ngx/paperless-ngx/pull/2404)) -- Feature: Control scheduled tasks via cron expressions [@stumpylog](https://github.com/stumpylog) ([#2403](https://github.com/paperless-ngx/paperless-ngx/pull/2403)) -- Fix: display rtl content in correct direction [@shamoon](https://github.com/shamoon) ([#2302](https://github.com/paperless-ngx/paperless-ngx/pull/2302)) -- Fix subpath for websockets [@tribut](https://github.com/tribut) ([#2371](https://github.com/paperless-ngx/paperless-ngx/pull/2371)) -- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) -- Feature: include comments in advanced search [@shamoon](https://github.com/shamoon) ([#2351](https://github.com/paperless-ngx/paperless-ngx/pull/2351)) -- Chore: More frontend tests [@shamoon](https://github.com/shamoon) ([#2352](https://github.com/paperless-ngx/paperless-ngx/pull/2352)) -- Chore: Fixing up some minor annoyances [@stumpylog](https://github.com/stumpylog) ([#2348](https://github.com/paperless-ngx/paperless-ngx/pull/2348)) -- Bugfix: Removal of alpha channel truncates multipage TIFFs [@stumpylog](https://github.com/stumpylog) ([#2335](https://github.com/paperless-ngx/paperless-ngx/pull/2335)) -- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) -- Add Arabic language to frontend [@KhaledEmad7](https://github.com/KhaledEmad7) ([#2313](https://github.com/paperless-ngx/paperless-ngx/pull/2313)) -- Bump [@typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2306](https://github.com/paperless-ngx/paperless-ngx/pull/2306)) -- Bump [@typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2308](https://github.com/paperless-ngx/paperless-ngx/pull/2308)) +- New document_exporter options [@mhelleboid](https://github.com/mhelleboid) ([#2448](https://github.com/paperless-ngx/paperless-ngx/pull/2448)) +- Fix: limit asn integer size [@shamoon](https://github.com/shamoon) ([#2498](https://github.com/paperless-ngx/paperless-ngx/pull/2498)) +- Fix: fix downgrade migration [@shamoon](https://github.com/shamoon) ([#2494](https://github.com/paperless-ngx/paperless-ngx/pull/2494)) +- Read ASN from barcode on page [@peterkappelt](https://github.com/peterkappelt) ([#2437](https://github.com/paperless-ngx/paperless-ngx/pull/2437)) +- Fix: Allow setting mailrule order from frontend [@shamoon](https://github.com/shamoon) ([#2459](https://github.com/paperless-ngx/paperless-ngx/pull/2459)) +- Chore: Update to Angular 15 \& associated frontend deps [@shamoon](https://github.com/shamoon) ([#2411](https://github.com/paperless-ngx/paperless-ngx/pull/2411)) +- Fix: tag color ordering [@shamoon](https://github.com/shamoon) ([#2456](https://github.com/paperless-ngx/paperless-ngx/pull/2456)) +- Fix: Better Handle arbitrary ISO 8601 strings after celery serializing [@shamoon](https://github.com/shamoon) ([#2441](https://github.com/paperless-ngx/paperless-ngx/pull/2441)) +- Use correct canonical path for nltk_data [@amo13](https://github.com/amo13) ([#2429](https://github.com/paperless-ngx/paperless-ngx/pull/2429)) +- Add AppleMail color tag support [@clemensrieder](https://github.com/clemensrieder) ([#2407](https://github.com/paperless-ngx/paperless-ngx/pull/2407)) +- Chore: Convert document exporter to use pathlib [@stumpylog](https://github.com/stumpylog) ([#2416](https://github.com/paperless-ngx/paperless-ngx/pull/2416)) +- Feature: Retain original filename on upload [@stumpylog](https://github.com/stumpylog) ([#2404](https://github.com/paperless-ngx/paperless-ngx/pull/2404)) +- Feature: Control scheduled tasks via cron expressions [@stumpylog](https://github.com/stumpylog) ([#2403](https://github.com/paperless-ngx/paperless-ngx/pull/2403)) +- Fix: display rtl content in correct direction [@shamoon](https://github.com/shamoon) ([#2302](https://github.com/paperless-ngx/paperless-ngx/pull/2302)) +- Fix subpath for websockets [@tribut](https://github.com/tribut) ([#2371](https://github.com/paperless-ngx/paperless-ngx/pull/2371)) +- Bugfix: Backend tests weren't using correct Python version [@stumpylog](https://github.com/stumpylog) ([#2363](https://github.com/paperless-ngx/paperless-ngx/pull/2363)) +- Feature: include comments in advanced search [@shamoon](https://github.com/shamoon) ([#2351](https://github.com/paperless-ngx/paperless-ngx/pull/2351)) +- Chore: More frontend tests [@shamoon](https://github.com/shamoon) ([#2352](https://github.com/paperless-ngx/paperless-ngx/pull/2352)) +- Chore: Fixing up some minor annoyances [@stumpylog](https://github.com/stumpylog) ([#2348](https://github.com/paperless-ngx/paperless-ngx/pull/2348)) +- Bugfix: Removal of alpha channel truncates multipage TIFFs [@stumpylog](https://github.com/stumpylog) ([#2335](https://github.com/paperless-ngx/paperless-ngx/pull/2335)) +- Documentation: update build instructions to remove deprecated [@shamoon](https://github.com/shamoon) ([#2334](https://github.com/paperless-ngx/paperless-ngx/pull/2334)) +- Add Arabic language to frontend [@KhaledEmad7](https://github.com/KhaledEmad7) ([#2313](https://github.com/paperless-ngx/paperless-ngx/pull/2313)) +- Bump [@typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/parser from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2306](https://github.com/paperless-ngx/paperless-ngx/pull/2306)) +- Bump [@typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot](https://github.com/typescript-eslint/eslint-plugin from 5.43.0 to 5.47.1 in /src-ui @dependabot) ([#2308](https://github.com/paperless-ngx/paperless-ngx/pull/2308)) ## paperless-ngx 1.11.3 @@ -4653,22 +5047,22 @@ older comments. The Docker image will automatically perform this reindex, bare m _Note: PR #2279 could represent a breaking change to the API which may affect third party applications that were only checking the `post_document` endpoint for e.g. result = 'OK' as opposed to e.g. HTTP status = 200_ -- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) +- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) ### Bug Fixes -- Bugfix: Fix no content when processing some RTL files [@stumpylog](https://github.com/stumpylog) ([#2295](https://github.com/paperless-ngx/paperless-ngx/pull/2295)) -- Bugfix: Handle email dates maybe being naive [@stumpylog](https://github.com/stumpylog) ([#2293](https://github.com/paperless-ngx/paperless-ngx/pull/2293)) -- Fix: live filterable dropdowns broken in 1.11.x [@shamoon](https://github.com/shamoon) ([#2292](https://github.com/paperless-ngx/paperless-ngx/pull/2292)) -- Bugfix: Reading environment from files didn't work for management commands [@stumpylog](https://github.com/stumpylog) ([#2261](https://github.com/paperless-ngx/paperless-ngx/pull/2261)) -- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) +- Bugfix: Fix no content when processing some RTL files [@stumpylog](https://github.com/stumpylog) ([#2295](https://github.com/paperless-ngx/paperless-ngx/pull/2295)) +- Bugfix: Handle email dates maybe being naive [@stumpylog](https://github.com/stumpylog) ([#2293](https://github.com/paperless-ngx/paperless-ngx/pull/2293)) +- Fix: live filterable dropdowns broken in 1.11.x [@shamoon](https://github.com/shamoon) ([#2292](https://github.com/paperless-ngx/paperless-ngx/pull/2292)) +- Bugfix: Reading environment from files didn't work for management commands [@stumpylog](https://github.com/stumpylog) ([#2261](https://github.com/paperless-ngx/paperless-ngx/pull/2261)) +- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) ### All App Changes -- Bugfix: Fix no content when processing some RTL files [@stumpylog](https://github.com/stumpylog) ([#2295](https://github.com/paperless-ngx/paperless-ngx/pull/2295)) -- Bugfix: Handle email dates maybe being naive [@stumpylog](https://github.com/stumpylog) ([#2293](https://github.com/paperless-ngx/paperless-ngx/pull/2293)) -- Fix: live filterable dropdowns broken in 1.11.x [@shamoon](https://github.com/shamoon) ([#2292](https://github.com/paperless-ngx/paperless-ngx/pull/2292)) -- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) +- Bugfix: Fix no content when processing some RTL files [@stumpylog](https://github.com/stumpylog) ([#2295](https://github.com/paperless-ngx/paperless-ngx/pull/2295)) +- Bugfix: Handle email dates maybe being naive [@stumpylog](https://github.com/stumpylog) ([#2293](https://github.com/paperless-ngx/paperless-ngx/pull/2293)) +- Fix: live filterable dropdowns broken in 1.11.x [@shamoon](https://github.com/shamoon) ([#2292](https://github.com/paperless-ngx/paperless-ngx/pull/2292)) +- Bugfix: Return created task ID when posting document to API [@stumpylog](https://github.com/stumpylog) ([#2279](https://github.com/paperless-ngx/paperless-ngx/pull/2279)) ## paperless-ngx 1.11.2 @@ -4676,848 +5070,848 @@ Versions 1.11.1 and 1.11.2 contain bug fixes from v1.11.0 that prevented use of ### Bug Fixes -- Fix frontend mailrule missing consumption scope parameter [@shamoon](https://github.com/shamoon) ([#2280](https://github.com/paperless-ngx/paperless-ngx/pull/2280)) -- Fix: missing frontend email attachment options [@shamoon](https://github.com/shamoon) ([#2272](https://github.com/paperless-ngx/paperless-ngx/pull/2272)) -- Fix: edit dialog creation in v1.11.0 [@shamoon](https://github.com/shamoon) ([#2273](https://github.com/paperless-ngx/paperless-ngx/pull/2273)) +- Fix frontend mailrule missing consumption scope parameter [@shamoon](https://github.com/shamoon) ([#2280](https://github.com/paperless-ngx/paperless-ngx/pull/2280)) +- Fix: missing frontend email attachment options [@shamoon](https://github.com/shamoon) ([#2272](https://github.com/paperless-ngx/paperless-ngx/pull/2272)) +- Fix: edit dialog creation in v1.11.0 [@shamoon](https://github.com/shamoon) ([#2273](https://github.com/paperless-ngx/paperless-ngx/pull/2273)) ### All App Changes -- Fix frontend mailrule missing consumption scope parameter [@shamoon](https://github.com/shamoon) ([#2280](https://github.com/paperless-ngx/paperless-ngx/pull/2280)) -- Fix: missing frontend email attachment options [@shamoon](https://github.com/shamoon) ([#2272](https://github.com/paperless-ngx/paperless-ngx/pull/2272)) -- Fix: edit dialog creation in v1.11.0 [@shamoon](https://github.com/shamoon) ([#2273](https://github.com/paperless-ngx/paperless-ngx/pull/2273)) +- Fix frontend mailrule missing consumption scope parameter [@shamoon](https://github.com/shamoon) ([#2280](https://github.com/paperless-ngx/paperless-ngx/pull/2280)) +- Fix: missing frontend email attachment options [@shamoon](https://github.com/shamoon) ([#2272](https://github.com/paperless-ngx/paperless-ngx/pull/2272)) +- Fix: edit dialog creation in v1.11.0 [@shamoon](https://github.com/shamoon) ([#2273](https://github.com/paperless-ngx/paperless-ngx/pull/2273)) ## paperless-ngx 1.11.0 ### Notable Changes -- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) -- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) +- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) +- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) ### Features -- Chore: Downgrade hiredis to 2.0.0 [@stumpylog](https://github.com/stumpylog) ([#2262](https://github.com/paperless-ngx/paperless-ngx/pull/2262)) -- Add ability to provide the configuration file path using an env variable [@hashworks](https://github.com/hashworks) ([#2241](https://github.com/paperless-ngx/paperless-ngx/pull/2241)) -- Feature: Adds option to allow a user to export directly to a zipfile [@stumpylog](https://github.com/stumpylog) ([#2004](https://github.com/paperless-ngx/paperless-ngx/pull/2004)) -- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) -- Feature: speed up frontend by truncating content [@shamoon](https://github.com/shamoon) ([#2028](https://github.com/paperless-ngx/paperless-ngx/pull/2028)) -- Feature: Allow bulk download API to follow file name formatting [@stumpylog](https://github.com/stumpylog) ([#2003](https://github.com/paperless-ngx/paperless-ngx/pull/2003)) -- Feature: Bake NLTK into Docker image [@stumpylog](https://github.com/stumpylog) ([#2129](https://github.com/paperless-ngx/paperless-ngx/pull/2129)) -- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) -- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) +- Chore: Downgrade hiredis to 2.0.0 [@stumpylog](https://github.com/stumpylog) ([#2262](https://github.com/paperless-ngx/paperless-ngx/pull/2262)) +- Add ability to provide the configuration file path using an env variable [@hashworks](https://github.com/hashworks) ([#2241](https://github.com/paperless-ngx/paperless-ngx/pull/2241)) +- Feature: Adds option to allow a user to export directly to a zipfile [@stumpylog](https://github.com/stumpylog) ([#2004](https://github.com/paperless-ngx/paperless-ngx/pull/2004)) +- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) +- Feature: speed up frontend by truncating content [@shamoon](https://github.com/shamoon) ([#2028](https://github.com/paperless-ngx/paperless-ngx/pull/2028)) +- Feature: Allow bulk download API to follow file name formatting [@stumpylog](https://github.com/stumpylog) ([#2003](https://github.com/paperless-ngx/paperless-ngx/pull/2003)) +- Feature: Bake NLTK into Docker image [@stumpylog](https://github.com/stumpylog) ([#2129](https://github.com/paperless-ngx/paperless-ngx/pull/2129)) +- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) +- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) ### Bug Fixes -- Bugfix: Handle RTL languages better [@stumpylog](https://github.com/stumpylog) ([#1665](https://github.com/paperless-ngx/paperless-ngx/pull/1665)) -- Fixed typo in docs [@mendelk](https://github.com/mendelk) ([#2256](https://github.com/paperless-ngx/paperless-ngx/pull/2256)) -- Fix: support in advanced search, fix tags filter badge count for excluded [@shamoon](https://github.com/shamoon) ([#2205](https://github.com/paperless-ngx/paperless-ngx/pull/2205)) -- Bugfix: Don't run system checks on migrate [@stumpylog](https://github.com/stumpylog) ([#2183](https://github.com/paperless-ngx/paperless-ngx/pull/2183)) -- Bugfix: Decoding task signals could fail on datetime type [@stumpylog](https://github.com/stumpylog) ([#2058](https://github.com/paperless-ngx/paperless-ngx/pull/2058)) +- Bugfix: Handle RTL languages better [@stumpylog](https://github.com/stumpylog) ([#1665](https://github.com/paperless-ngx/paperless-ngx/pull/1665)) +- Fixed typo in docs [@mendelk](https://github.com/mendelk) ([#2256](https://github.com/paperless-ngx/paperless-ngx/pull/2256)) +- Fix: support in advanced search, fix tags filter badge count for excluded [@shamoon](https://github.com/shamoon) ([#2205](https://github.com/paperless-ngx/paperless-ngx/pull/2205)) +- Bugfix: Don't run system checks on migrate [@stumpylog](https://github.com/stumpylog) ([#2183](https://github.com/paperless-ngx/paperless-ngx/pull/2183)) +- Bugfix: Decoding task signals could fail on datetime type [@stumpylog](https://github.com/stumpylog) ([#2058](https://github.com/paperless-ngx/paperless-ngx/pull/2058)) ### Documentation -- Fixed typo in docs [@mendelk](https://github.com/mendelk) ([#2256](https://github.com/paperless-ngx/paperless-ngx/pull/2256)) -- Docs: More fixes and improvements [@tooomm](https://github.com/tooomm) ([#2203](https://github.com/paperless-ngx/paperless-ngx/pull/2203)) -- Docs: Fix leftover issues from conversion [@tooomm](https://github.com/tooomm) ([#2172](https://github.com/paperless-ngx/paperless-ngx/pull/2172)) -- Docs: Fix broken internal links [@tooomm](https://github.com/tooomm) ([#2165](https://github.com/paperless-ngx/paperless-ngx/pull/2165)) -- Update setup.md [@Weltraumschaf](https://github.com/Weltraumschaf) ([#2157](https://github.com/paperless-ngx/paperless-ngx/pull/2157)) -- Chore: Cleanup of new documentation [@stumpylog](https://github.com/stumpylog) ([#2137](https://github.com/paperless-ngx/paperless-ngx/pull/2137)) -- [Documentation] Add v1.10.2 changelog [@github-actions](https://github.com/github-actions) ([#2114](https://github.com/paperless-ngx/paperless-ngx/pull/2114)) +- Fixed typo in docs [@mendelk](https://github.com/mendelk) ([#2256](https://github.com/paperless-ngx/paperless-ngx/pull/2256)) +- Docs: More fixes and improvements [@tooomm](https://github.com/tooomm) ([#2203](https://github.com/paperless-ngx/paperless-ngx/pull/2203)) +- Docs: Fix leftover issues from conversion [@tooomm](https://github.com/tooomm) ([#2172](https://github.com/paperless-ngx/paperless-ngx/pull/2172)) +- Docs: Fix broken internal links [@tooomm](https://github.com/tooomm) ([#2165](https://github.com/paperless-ngx/paperless-ngx/pull/2165)) +- Update setup.md [@Weltraumschaf](https://github.com/Weltraumschaf) ([#2157](https://github.com/paperless-ngx/paperless-ngx/pull/2157)) +- Chore: Cleanup of new documentation [@stumpylog](https://github.com/stumpylog) ([#2137](https://github.com/paperless-ngx/paperless-ngx/pull/2137)) +- [Documentation] Add v1.10.2 changelog [@github-actions](https://github.com/github-actions) ([#2114](https://github.com/paperless-ngx/paperless-ngx/pull/2114)) ### Maintenance -- Chore: Adds notable label for release drafter [@stumpylog](https://github.com/stumpylog) ([#2200](https://github.com/paperless-ngx/paperless-ngx/pull/2200)) -- Chore: Prevent forks from having failing CI runs by default [@tooomm](https://github.com/tooomm) ([#2166](https://github.com/paperless-ngx/paperless-ngx/pull/2166)) -- Chore: migrate to eslint [@shamoon](https://github.com/shamoon) ([#2199](https://github.com/paperless-ngx/paperless-ngx/pull/2199)) -- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) -- Chore: Changes qpdf to be cross compiled for large speed up [@stumpylog](https://github.com/stumpylog) ([#2181](https://github.com/paperless-ngx/paperless-ngx/pull/2181)) -- Chore: Decrease time to build pikepdf [@stumpylog](https://github.com/stumpylog) ([#2178](https://github.com/paperless-ngx/paperless-ngx/pull/2178)) -- Chore: Minor CI cleanups [@stumpylog](https://github.com/stumpylog) ([#2175](https://github.com/paperless-ngx/paperless-ngx/pull/2175)) +- Chore: Adds notable label for release drafter [@stumpylog](https://github.com/stumpylog) ([#2200](https://github.com/paperless-ngx/paperless-ngx/pull/2200)) +- Chore: Prevent forks from having failing CI runs by default [@tooomm](https://github.com/tooomm) ([#2166](https://github.com/paperless-ngx/paperless-ngx/pull/2166)) +- Chore: migrate to eslint [@shamoon](https://github.com/shamoon) ([#2199](https://github.com/paperless-ngx/paperless-ngx/pull/2199)) +- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) +- Chore: Changes qpdf to be cross compiled for large speed up [@stumpylog](https://github.com/stumpylog) ([#2181](https://github.com/paperless-ngx/paperless-ngx/pull/2181)) +- Chore: Decrease time to build pikepdf [@stumpylog](https://github.com/stumpylog) ([#2178](https://github.com/paperless-ngx/paperless-ngx/pull/2178)) +- Chore: Minor CI cleanups [@stumpylog](https://github.com/stumpylog) ([#2175](https://github.com/paperless-ngx/paperless-ngx/pull/2175)) ### All App Changes -- Add ability to provide the configuration file path using an env variable [@hashworks](https://github.com/hashworks) ([#2241](https://github.com/paperless-ngx/paperless-ngx/pull/2241)) -- Fix: support in advanced search, fix tags filter badge count for excluded [@shamoon](https://github.com/shamoon) ([#2205](https://github.com/paperless-ngx/paperless-ngx/pull/2205)) -- Chore: migrate to eslint [@shamoon](https://github.com/shamoon) ([#2199](https://github.com/paperless-ngx/paperless-ngx/pull/2199)) -- Feature: Adds option to allow a user to export directly to a zipfile [@stumpylog](https://github.com/stumpylog) ([#2004](https://github.com/paperless-ngx/paperless-ngx/pull/2004)) -- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) -- Bugfix: Decoding task signals could fail on datetime type [@stumpylog](https://github.com/stumpylog) ([#2058](https://github.com/paperless-ngx/paperless-ngx/pull/2058)) -- Feature: speed up frontend by truncating content [@shamoon](https://github.com/shamoon) ([#2028](https://github.com/paperless-ngx/paperless-ngx/pull/2028)) -- Feature: Allow bulk download API to follow file name formatting [@stumpylog](https://github.com/stumpylog) ([#2003](https://github.com/paperless-ngx/paperless-ngx/pull/2003)) -- Feature: Bake NLTK into Docker image [@stumpylog](https://github.com/stumpylog) ([#2129](https://github.com/paperless-ngx/paperless-ngx/pull/2129)) -- Chore: Apply live testing backoff logic to new mail tests [@stumpylog](https://github.com/stumpylog) ([#2134](https://github.com/paperless-ngx/paperless-ngx/pull/2134)) -- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) -- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) +- Add ability to provide the configuration file path using an env variable [@hashworks](https://github.com/hashworks) ([#2241](https://github.com/paperless-ngx/paperless-ngx/pull/2241)) +- Fix: support in advanced search, fix tags filter badge count for excluded [@shamoon](https://github.com/shamoon) ([#2205](https://github.com/paperless-ngx/paperless-ngx/pull/2205)) +- Chore: migrate to eslint [@shamoon](https://github.com/shamoon) ([#2199](https://github.com/paperless-ngx/paperless-ngx/pull/2199)) +- Feature: Adds option to allow a user to export directly to a zipfile [@stumpylog](https://github.com/stumpylog) ([#2004](https://github.com/paperless-ngx/paperless-ngx/pull/2004)) +- Feature: Adds PaperlessTask admin page interface [@stumpylog](https://github.com/stumpylog) ([#2184](https://github.com/paperless-ngx/paperless-ngx/pull/2184)) +- Bugfix: Decoding task signals could fail on datetime type [@stumpylog](https://github.com/stumpylog) ([#2058](https://github.com/paperless-ngx/paperless-ngx/pull/2058)) +- Feature: speed up frontend by truncating content [@shamoon](https://github.com/shamoon) ([#2028](https://github.com/paperless-ngx/paperless-ngx/pull/2028)) +- Feature: Allow bulk download API to follow file name formatting [@stumpylog](https://github.com/stumpylog) ([#2003](https://github.com/paperless-ngx/paperless-ngx/pull/2003)) +- Feature: Bake NLTK into Docker image [@stumpylog](https://github.com/stumpylog) ([#2129](https://github.com/paperless-ngx/paperless-ngx/pull/2129)) +- Chore: Apply live testing backoff logic to new mail tests [@stumpylog](https://github.com/stumpylog) ([#2134](https://github.com/paperless-ngx/paperless-ngx/pull/2134)) +- Feature: frontend paperless mail [@shamoon](https://github.com/shamoon) ([#2000](https://github.com/paperless-ngx/paperless-ngx/pull/2000)) +- Feature: Ability to consume mails and eml files [@p-h-a-i-l](https://github.com/p-h-a-i-l) ([#848](https://github.com/paperless-ngx/paperless-ngx/pull/848)) ## paperless-ngx 1.10.2 ### Features -- Take ownership of k8s-at-home Helm chart [@alexander-bauer](https://github.com/alexander-bauer) ([#1947](https://github.com/paperless-ngx/paperless-ngx/pull/1947)) +- Take ownership of k8s-at-home Helm chart [@alexander-bauer](https://github.com/alexander-bauer) ([#1947](https://github.com/paperless-ngx/paperless-ngx/pull/1947)) ### Bug Fixes -- Bugfix: Language code checks around two part languages [@stumpylog](https://github.com/stumpylog) ([#2112](https://github.com/paperless-ngx/paperless-ngx/pull/2112)) -- Bugfix: Redis socket compatibility didn't handle URLs with ports [@stumpylog](https://github.com/stumpylog) ([#2109](https://github.com/paperless-ngx/paperless-ngx/pull/2109)) -- Bugfix: Incompatible URL schemes for socket based Redis [@stumpylog](https://github.com/stumpylog) ([#2092](https://github.com/paperless-ngx/paperless-ngx/pull/2092)) -- Fix doc links in contributing [@tooomm](https://github.com/tooomm) ([#2102](https://github.com/paperless-ngx/paperless-ngx/pull/2102)) +- Bugfix: Language code checks around two part languages [@stumpylog](https://github.com/stumpylog) ([#2112](https://github.com/paperless-ngx/paperless-ngx/pull/2112)) +- Bugfix: Redis socket compatibility didn't handle URLs with ports [@stumpylog](https://github.com/stumpylog) ([#2109](https://github.com/paperless-ngx/paperless-ngx/pull/2109)) +- Bugfix: Incompatible URL schemes for socket based Redis [@stumpylog](https://github.com/stumpylog) ([#2092](https://github.com/paperless-ngx/paperless-ngx/pull/2092)) +- Fix doc links in contributing [@tooomm](https://github.com/tooomm) ([#2102](https://github.com/paperless-ngx/paperless-ngx/pull/2102)) ### Documentation -- Docs: Some more small MkDocs updates [@tooomm](https://github.com/tooomm) ([#2106](https://github.com/paperless-ngx/paperless-ngx/pull/2106)) -- Chore: Cleans up documentation links [@stumpylog](https://github.com/stumpylog) ([#2104](https://github.com/paperless-ngx/paperless-ngx/pull/2104)) -- Feature: Move docs to material-mkdocs [@shamoon](https://github.com/shamoon) ([#2067](https://github.com/paperless-ngx/paperless-ngx/pull/2067)) -- Chore: Add v1.10.1 changelong [@shamoon](https://github.com/shamoon) ([#2082](https://github.com/paperless-ngx/paperless-ngx/pull/2082)) +- Docs: Some more small MkDocs updates [@tooomm](https://github.com/tooomm) ([#2106](https://github.com/paperless-ngx/paperless-ngx/pull/2106)) +- Chore: Cleans up documentation links [@stumpylog](https://github.com/stumpylog) ([#2104](https://github.com/paperless-ngx/paperless-ngx/pull/2104)) +- Feature: Move docs to material-mkdocs [@shamoon](https://github.com/shamoon) ([#2067](https://github.com/paperless-ngx/paperless-ngx/pull/2067)) +- Chore: Add v1.10.1 changelong [@shamoon](https://github.com/shamoon) ([#2082](https://github.com/paperless-ngx/paperless-ngx/pull/2082)) ### Maintenance -- Take ownership of k8s-at-home Helm chart [@alexander-bauer](https://github.com/alexander-bauer) ([#1947](https://github.com/paperless-ngx/paperless-ngx/pull/1947)) +- Take ownership of k8s-at-home Helm chart [@alexander-bauer](https://github.com/alexander-bauer) ([#1947](https://github.com/paperless-ngx/paperless-ngx/pull/1947)) ### All App Changes -- Bugfix: Language code checks around two part languages [@stumpylog](https://github.com/stumpylog) ([#2112](https://github.com/paperless-ngx/paperless-ngx/pull/2112)) -- Bugfix: Redis socket compatibility didn't handle URLs with ports [@stumpylog](https://github.com/stumpylog) ([#2109](https://github.com/paperless-ngx/paperless-ngx/pull/2109)) -- Bugfix: Incompatible URL schemes for socket based Redis [@stumpylog](https://github.com/stumpylog) ([#2092](https://github.com/paperless-ngx/paperless-ngx/pull/2092)) +- Bugfix: Language code checks around two part languages [@stumpylog](https://github.com/stumpylog) ([#2112](https://github.com/paperless-ngx/paperless-ngx/pull/2112)) +- Bugfix: Redis socket compatibility didn't handle URLs with ports [@stumpylog](https://github.com/stumpylog) ([#2109](https://github.com/paperless-ngx/paperless-ngx/pull/2109)) +- Bugfix: Incompatible URL schemes for socket based Redis [@stumpylog](https://github.com/stumpylog) ([#2092](https://github.com/paperless-ngx/paperless-ngx/pull/2092)) ## paperless-ngx 1.10.1 ### Features -- Feature: Allows documents in WebP format [@stumpylog](https://github.com/stumpylog) ([#1984](https://github.com/paperless-ngx/paperless-ngx/pull/1984)) +- Feature: Allows documents in WebP format [@stumpylog](https://github.com/stumpylog) ([#1984](https://github.com/paperless-ngx/paperless-ngx/pull/1984)) ### Bug Fixes -- Fix: frontend tasks display in 1.10.0 [@shamoon](https://github.com/shamoon) ([#2073](https://github.com/paperless-ngx/paperless-ngx/pull/2073)) -- Bugfix: Custom startup commands weren't run as root [@stumpylog](https://github.com/stumpylog) ([#2069](https://github.com/paperless-ngx/paperless-ngx/pull/2069)) -- Bugfix: Add libatomic for armv7 compatibility [@stumpylog](https://github.com/stumpylog) ([#2066](https://github.com/paperless-ngx/paperless-ngx/pull/2066)) -- Bugfix: Don't silence an exception when trying to handle file naming [@stumpylog](https://github.com/stumpylog) ([#2062](https://github.com/paperless-ngx/paperless-ngx/pull/2062)) -- Bugfix: Some tesseract languages aren't detected as installed. [@stumpylog](https://github.com/stumpylog) ([#2057](https://github.com/paperless-ngx/paperless-ngx/pull/2057)) +- Fix: frontend tasks display in 1.10.0 [@shamoon](https://github.com/shamoon) ([#2073](https://github.com/paperless-ngx/paperless-ngx/pull/2073)) +- Bugfix: Custom startup commands weren't run as root [@stumpylog](https://github.com/stumpylog) ([#2069](https://github.com/paperless-ngx/paperless-ngx/pull/2069)) +- Bugfix: Add libatomic for armv7 compatibility [@stumpylog](https://github.com/stumpylog) ([#2066](https://github.com/paperless-ngx/paperless-ngx/pull/2066)) +- Bugfix: Don't silence an exception when trying to handle file naming [@stumpylog](https://github.com/stumpylog) ([#2062](https://github.com/paperless-ngx/paperless-ngx/pull/2062)) +- Bugfix: Some tesseract languages aren't detected as installed. [@stumpylog](https://github.com/stumpylog) ([#2057](https://github.com/paperless-ngx/paperless-ngx/pull/2057)) ### Maintenance -- Chore: Use a maintained upload-release-asset [@stumpylog](https://github.com/stumpylog) ([#2055](https://github.com/paperless-ngx/paperless-ngx/pull/2055)) +- Chore: Use a maintained upload-release-asset [@stumpylog](https://github.com/stumpylog) ([#2055](https://github.com/paperless-ngx/paperless-ngx/pull/2055)) ### Dependencies
5 changes -- Bump tslib from 2.4.0 to 2.4.1 in /src-ui @dependabot ([#2076](https://github.com/paperless-ngx/paperless-ngx/pull/2076)) -- Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui @dependabot ([#2079](https://github.com/paperless-ngx/paperless-ngx/pull/2079)) -- Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui @dependabot ([#2078](https://github.com/paperless-ngx/paperless-ngx/pull/2078)) -- Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui @dependabot ([#2080](https://github.com/paperless-ngx/paperless-ngx/pull/2080)) -- Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui @dependabot ([#2077](https://github.com/paperless-ngx/paperless-ngx/pull/2077)) +- Bump tslib from 2.4.0 to 2.4.1 in /src-ui @dependabot ([#2076](https://github.com/paperless-ngx/paperless-ngx/pull/2076)) +- Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui @dependabot ([#2079](https://github.com/paperless-ngx/paperless-ngx/pull/2079)) +- Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui @dependabot ([#2078](https://github.com/paperless-ngx/paperless-ngx/pull/2078)) +- Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui @dependabot ([#2080](https://github.com/paperless-ngx/paperless-ngx/pull/2080)) +- Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui @dependabot ([#2077](https://github.com/paperless-ngx/paperless-ngx/pull/2077))
### All App Changes -- Bump tslib from 2.4.0 to 2.4.1 in /src-ui @dependabot ([#2076](https://github.com/paperless-ngx/paperless-ngx/pull/2076)) -- Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui @dependabot ([#2079](https://github.com/paperless-ngx/paperless-ngx/pull/2079)) -- Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui @dependabot ([#2078](https://github.com/paperless-ngx/paperless-ngx/pull/2078)) -- Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui @dependabot ([#2080](https://github.com/paperless-ngx/paperless-ngx/pull/2080)) -- Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui @dependabot ([#2077](https://github.com/paperless-ngx/paperless-ngx/pull/2077)) -- Fix: frontend tasks display in 1.10.0 [@shamoon](https://github.com/shamoon) ([#2073](https://github.com/paperless-ngx/paperless-ngx/pull/2073)) -- Bugfix: Don't silence an exception when trying to handle file naming [@stumpylog](https://github.com/stumpylog) ([#2062](https://github.com/paperless-ngx/paperless-ngx/pull/2062)) -- Bugfix: Some tesseract languages aren't detected as installed. [@stumpylog](https://github.com/stumpylog) ([#2057](https://github.com/paperless-ngx/paperless-ngx/pull/2057)) +- Bump tslib from 2.4.0 to 2.4.1 in /src-ui @dependabot ([#2076](https://github.com/paperless-ngx/paperless-ngx/pull/2076)) +- Bump @angular-builders/jest from 14.0.1 to 14.1.0 in /src-ui @dependabot ([#2079](https://github.com/paperless-ngx/paperless-ngx/pull/2079)) +- Bump jest-preset-angular from 12.2.2 to 12.2.3 in /src-ui @dependabot ([#2078](https://github.com/paperless-ngx/paperless-ngx/pull/2078)) +- Bump ngx-file-drop from 14.0.1 to 14.0.2 in /src-ui @dependabot ([#2080](https://github.com/paperless-ngx/paperless-ngx/pull/2080)) +- Bump @ngneat/dirty-check-forms from 3.0.2 to 3.0.3 in /src-ui @dependabot ([#2077](https://github.com/paperless-ngx/paperless-ngx/pull/2077)) +- Fix: frontend tasks display in 1.10.0 [@shamoon](https://github.com/shamoon) ([#2073](https://github.com/paperless-ngx/paperless-ngx/pull/2073)) +- Bugfix: Don't silence an exception when trying to handle file naming [@stumpylog](https://github.com/stumpylog) ([#2062](https://github.com/paperless-ngx/paperless-ngx/pull/2062)) +- Bugfix: Some tesseract languages aren't detected as installed. [@stumpylog](https://github.com/stumpylog) ([#2057](https://github.com/paperless-ngx/paperless-ngx/pull/2057)) ## paperless-ngx 1.10.0 ### Features -- Feature: Capture stdout \& stderr of the pre/post consume scripts [@stumpylog](https://github.com/stumpylog) ([#1967](https://github.com/paperless-ngx/paperless-ngx/pull/1967)) -- Feature: Allow running custom container initialization scripts [@stumpylog](https://github.com/stumpylog) ([#1838](https://github.com/paperless-ngx/paperless-ngx/pull/1838)) -- Feature: Add more file name formatting options [@stumpylog](https://github.com/stumpylog) ([#1906](https://github.com/paperless-ngx/paperless-ngx/pull/1906)) -- Feature: 1.9.2 UI tweaks [@shamoon](https://github.com/shamoon) ([#1886](https://github.com/paperless-ngx/paperless-ngx/pull/1886)) -- Feature: Optional celery monitoring with Flower [@stumpylog](https://github.com/stumpylog) ([#1810](https://github.com/paperless-ngx/paperless-ngx/pull/1810)) -- Feature: Save pending tasks for frontend [@stumpylog](https://github.com/stumpylog) ([#1816](https://github.com/paperless-ngx/paperless-ngx/pull/1816)) -- Feature: Improved processing for automatic matching [@stumpylog](https://github.com/stumpylog) ([#1609](https://github.com/paperless-ngx/paperless-ngx/pull/1609)) -- Feature: Transition to celery for background tasks [@stumpylog](https://github.com/stumpylog) ([#1648](https://github.com/paperless-ngx/paperless-ngx/pull/1648)) -- Feature: UI Welcome Tour [@shamoon](https://github.com/shamoon) ([#1644](https://github.com/paperless-ngx/paperless-ngx/pull/1644)) -- Feature: slim sidebar [@shamoon](https://github.com/shamoon) ([#1641](https://github.com/paperless-ngx/paperless-ngx/pull/1641)) -- change default matching algo to auto and move to constant [@NiFNi](https://github.com/NiFNi) ([#1754](https://github.com/paperless-ngx/paperless-ngx/pull/1754)) -- Feature: Enable end to end Tika testing in CI [@stumpylog](https://github.com/stumpylog) ([#1757](https://github.com/paperless-ngx/paperless-ngx/pull/1757)) -- Feature: frontend update checking settings [@shamoon](https://github.com/shamoon) ([#1692](https://github.com/paperless-ngx/paperless-ngx/pull/1692)) -- Feature: Upgrade to qpdf 11, pikepdf 6 \& ocrmypdf 14 [@stumpylog](https://github.com/stumpylog) ([#1642](https://github.com/paperless-ngx/paperless-ngx/pull/1642)) +- Feature: Capture stdout \& stderr of the pre/post consume scripts [@stumpylog](https://github.com/stumpylog) ([#1967](https://github.com/paperless-ngx/paperless-ngx/pull/1967)) +- Feature: Allow running custom container initialization scripts [@stumpylog](https://github.com/stumpylog) ([#1838](https://github.com/paperless-ngx/paperless-ngx/pull/1838)) +- Feature: Add more file name formatting options [@stumpylog](https://github.com/stumpylog) ([#1906](https://github.com/paperless-ngx/paperless-ngx/pull/1906)) +- Feature: 1.9.2 UI tweaks [@shamoon](https://github.com/shamoon) ([#1886](https://github.com/paperless-ngx/paperless-ngx/pull/1886)) +- Feature: Optional celery monitoring with Flower [@stumpylog](https://github.com/stumpylog) ([#1810](https://github.com/paperless-ngx/paperless-ngx/pull/1810)) +- Feature: Save pending tasks for frontend [@stumpylog](https://github.com/stumpylog) ([#1816](https://github.com/paperless-ngx/paperless-ngx/pull/1816)) +- Feature: Improved processing for automatic matching [@stumpylog](https://github.com/stumpylog) ([#1609](https://github.com/paperless-ngx/paperless-ngx/pull/1609)) +- Feature: Transition to celery for background tasks [@stumpylog](https://github.com/stumpylog) ([#1648](https://github.com/paperless-ngx/paperless-ngx/pull/1648)) +- Feature: UI Welcome Tour [@shamoon](https://github.com/shamoon) ([#1644](https://github.com/paperless-ngx/paperless-ngx/pull/1644)) +- Feature: slim sidebar [@shamoon](https://github.com/shamoon) ([#1641](https://github.com/paperless-ngx/paperless-ngx/pull/1641)) +- change default matching algo to auto and move to constant [@NiFNi](https://github.com/NiFNi) ([#1754](https://github.com/paperless-ngx/paperless-ngx/pull/1754)) +- Feature: Enable end to end Tika testing in CI [@stumpylog](https://github.com/stumpylog) ([#1757](https://github.com/paperless-ngx/paperless-ngx/pull/1757)) +- Feature: frontend update checking settings [@shamoon](https://github.com/shamoon) ([#1692](https://github.com/paperless-ngx/paperless-ngx/pull/1692)) +- Feature: Upgrade to qpdf 11, pikepdf 6 \& ocrmypdf 14 [@stumpylog](https://github.com/stumpylog) ([#1642](https://github.com/paperless-ngx/paperless-ngx/pull/1642)) ### Bug Fixes -- Bugfix: Fix created_date being a string [@stumpylog](https://github.com/stumpylog) ([#2023](https://github.com/paperless-ngx/paperless-ngx/pull/2023)) -- Bugfix: Fixes an issue with mixed text and images when redoing OCR [@stumpylog](https://github.com/stumpylog) ([#2017](https://github.com/paperless-ngx/paperless-ngx/pull/2017)) -- Bugfix: Always re-try barcodes with pdf2image [@stumpylog](https://github.com/stumpylog) ([#1953](https://github.com/paperless-ngx/paperless-ngx/pull/1953)) -- Fix: using `CONSUMER_SUBDIRS_AS_TAGS` causes failure with Celery in `dev` [@shamoon](https://github.com/shamoon) ([#1942](https://github.com/paperless-ngx/paperless-ngx/pull/1942)) -- Fix mail consumption broken in `dev` after move to celery [@shamoon](https://github.com/shamoon) ([#1934](https://github.com/paperless-ngx/paperless-ngx/pull/1934)) -- Bugfix: Prevent file handling from running with stale data [@stumpylog](https://github.com/stumpylog) ([#1905](https://github.com/paperless-ngx/paperless-ngx/pull/1905)) -- Chore: Reduce nuisance CI test failures [@stumpylog](https://github.com/stumpylog) ([#1922](https://github.com/paperless-ngx/paperless-ngx/pull/1922)) -- Bugfix: Unintentional deletion of feature tagged Docker images [@stumpylog](https://github.com/stumpylog) ([#1896](https://github.com/paperless-ngx/paperless-ngx/pull/1896)) -- Fix: independent control of saved views [@shamoon](https://github.com/shamoon) ([#1868](https://github.com/paperless-ngx/paperless-ngx/pull/1868)) -- Fix: frontend relative date searches [@shamoon](https://github.com/shamoon) ([#1865](https://github.com/paperless-ngx/paperless-ngx/pull/1865)) -- Chore: Fixes pipenv issues [@stumpylog](https://github.com/stumpylog) ([#1873](https://github.com/paperless-ngx/paperless-ngx/pull/1873)) -- Bugfix: Handle password protected PDFs during barcode detection [@stumpylog](https://github.com/stumpylog) ([#1858](https://github.com/paperless-ngx/paperless-ngx/pull/1858)) -- Fix: Allows configuring barcodes with pdf2image instead of pikepdf [@stumpylog](https://github.com/stumpylog) ([#1857](https://github.com/paperless-ngx/paperless-ngx/pull/1857)) -- Bugfix: Reverts the change around skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1829](https://github.com/paperless-ngx/paperless-ngx/pull/1829)) -- Fix: missing loadViewConfig breaks loading saved view [@shamoon](https://github.com/shamoon) ([#1792](https://github.com/paperless-ngx/paperless-ngx/pull/1792)) -- Bugfix: Fallback to pdf2image if pikepdf fails [@stumpylog](https://github.com/stumpylog) ([#1745](https://github.com/paperless-ngx/paperless-ngx/pull/1745)) -- Fix: creating new storage path on document edit fails to update menu [@shamoon](https://github.com/shamoon) ([#1777](https://github.com/paperless-ngx/paperless-ngx/pull/1777)) -- Bugfix: Files containing barcodes uploaded via web are not consumed after splitting [@stumpylog](https://github.com/stumpylog) ([#1762](https://github.com/paperless-ngx/paperless-ngx/pull/1762)) -- Bugfix: Fix email labeling for non-Gmail servers [@stumpylog](https://github.com/stumpylog) ([#1755](https://github.com/paperless-ngx/paperless-ngx/pull/1755)) -- Fix: allow preview for .csv files [@shamoon](https://github.com/shamoon) ([#1744](https://github.com/paperless-ngx/paperless-ngx/pull/1744)) -- Bugfix: csv recognition by consumer [@bin101](https://github.com/bin101) ([#1726](https://github.com/paperless-ngx/paperless-ngx/pull/1726)) -- Bugfix: Include document title when a duplicate is detected [@stumpylog](https://github.com/stumpylog) ([#1696](https://github.com/paperless-ngx/paperless-ngx/pull/1696)) -- Bugfix: Set MySql charset [@stumpylog](https://github.com/stumpylog) ([#1687](https://github.com/paperless-ngx/paperless-ngx/pull/1687)) -- Mariadb compose files should use `PAPERLESS_DBPASS` [@shamoon](https://github.com/shamoon) ([#1683](https://github.com/paperless-ngx/paperless-ngx/pull/1683)) +- Bugfix: Fix created_date being a string [@stumpylog](https://github.com/stumpylog) ([#2023](https://github.com/paperless-ngx/paperless-ngx/pull/2023)) +- Bugfix: Fixes an issue with mixed text and images when redoing OCR [@stumpylog](https://github.com/stumpylog) ([#2017](https://github.com/paperless-ngx/paperless-ngx/pull/2017)) +- Bugfix: Always re-try barcodes with pdf2image [@stumpylog](https://github.com/stumpylog) ([#1953](https://github.com/paperless-ngx/paperless-ngx/pull/1953)) +- Fix: using `CONSUMER_SUBDIRS_AS_TAGS` causes failure with Celery in `dev` [@shamoon](https://github.com/shamoon) ([#1942](https://github.com/paperless-ngx/paperless-ngx/pull/1942)) +- Fix mail consumption broken in `dev` after move to celery [@shamoon](https://github.com/shamoon) ([#1934](https://github.com/paperless-ngx/paperless-ngx/pull/1934)) +- Bugfix: Prevent file handling from running with stale data [@stumpylog](https://github.com/stumpylog) ([#1905](https://github.com/paperless-ngx/paperless-ngx/pull/1905)) +- Chore: Reduce nuisance CI test failures [@stumpylog](https://github.com/stumpylog) ([#1922](https://github.com/paperless-ngx/paperless-ngx/pull/1922)) +- Bugfix: Unintentional deletion of feature tagged Docker images [@stumpylog](https://github.com/stumpylog) ([#1896](https://github.com/paperless-ngx/paperless-ngx/pull/1896)) +- Fix: independent control of saved views [@shamoon](https://github.com/shamoon) ([#1868](https://github.com/paperless-ngx/paperless-ngx/pull/1868)) +- Fix: frontend relative date searches [@shamoon](https://github.com/shamoon) ([#1865](https://github.com/paperless-ngx/paperless-ngx/pull/1865)) +- Chore: Fixes pipenv issues [@stumpylog](https://github.com/stumpylog) ([#1873](https://github.com/paperless-ngx/paperless-ngx/pull/1873)) +- Bugfix: Handle password protected PDFs during barcode detection [@stumpylog](https://github.com/stumpylog) ([#1858](https://github.com/paperless-ngx/paperless-ngx/pull/1858)) +- Fix: Allows configuring barcodes with pdf2image instead of pikepdf [@stumpylog](https://github.com/stumpylog) ([#1857](https://github.com/paperless-ngx/paperless-ngx/pull/1857)) +- Bugfix: Reverts the change around skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1829](https://github.com/paperless-ngx/paperless-ngx/pull/1829)) +- Fix: missing loadViewConfig breaks loading saved view [@shamoon](https://github.com/shamoon) ([#1792](https://github.com/paperless-ngx/paperless-ngx/pull/1792)) +- Bugfix: Fallback to pdf2image if pikepdf fails [@stumpylog](https://github.com/stumpylog) ([#1745](https://github.com/paperless-ngx/paperless-ngx/pull/1745)) +- Fix: creating new storage path on document edit fails to update menu [@shamoon](https://github.com/shamoon) ([#1777](https://github.com/paperless-ngx/paperless-ngx/pull/1777)) +- Bugfix: Files containing barcodes uploaded via web are not consumed after splitting [@stumpylog](https://github.com/stumpylog) ([#1762](https://github.com/paperless-ngx/paperless-ngx/pull/1762)) +- Bugfix: Fix email labeling for non-Gmail servers [@stumpylog](https://github.com/stumpylog) ([#1755](https://github.com/paperless-ngx/paperless-ngx/pull/1755)) +- Fix: allow preview for .csv files [@shamoon](https://github.com/shamoon) ([#1744](https://github.com/paperless-ngx/paperless-ngx/pull/1744)) +- Bugfix: csv recognition by consumer [@bin101](https://github.com/bin101) ([#1726](https://github.com/paperless-ngx/paperless-ngx/pull/1726)) +- Bugfix: Include document title when a duplicate is detected [@stumpylog](https://github.com/stumpylog) ([#1696](https://github.com/paperless-ngx/paperless-ngx/pull/1696)) +- Bugfix: Set MySql charset [@stumpylog](https://github.com/stumpylog) ([#1687](https://github.com/paperless-ngx/paperless-ngx/pull/1687)) +- Mariadb compose files should use `PAPERLESS_DBPASS` [@shamoon](https://github.com/shamoon) ([#1683](https://github.com/paperless-ngx/paperless-ngx/pull/1683)) ### Documentation -- Documentation: Update MariaDB docs to note some potential issues [@stumpylog](https://github.com/stumpylog) ([#2016](https://github.com/paperless-ngx/paperless-ngx/pull/2016)) -- Documentation: Add note re MS exchange servers [@shamoon](https://github.com/shamoon) ([#1780](https://github.com/paperless-ngx/paperless-ngx/pull/1780)) -- Chore: Updates Gotenberg versions [@stumpylog](https://github.com/stumpylog) ([#1768](https://github.com/paperless-ngx/paperless-ngx/pull/1768)) -- Documentation: Tweak LinuxServer [@stumpylog](https://github.com/stumpylog) ([#1761](https://github.com/paperless-ngx/paperless-ngx/pull/1761)) -- Documentation: Adds troubleshooting note about Kubernetes and ports [@stumpylog](https://github.com/stumpylog) ([#1731](https://github.com/paperless-ngx/paperless-ngx/pull/1731)) -- Documentation: LinuxServer.io Migration [@stumpylog](https://github.com/stumpylog) ([#1733](https://github.com/paperless-ngx/paperless-ngx/pull/1733)) -- [Documentation] Add v1.9.2 changelog [@github-actions](https://github.com/github-actions) ([#1671](https://github.com/paperless-ngx/paperless-ngx/pull/1671)) +- Documentation: Update MariaDB docs to note some potential issues [@stumpylog](https://github.com/stumpylog) ([#2016](https://github.com/paperless-ngx/paperless-ngx/pull/2016)) +- Documentation: Add note re MS exchange servers [@shamoon](https://github.com/shamoon) ([#1780](https://github.com/paperless-ngx/paperless-ngx/pull/1780)) +- Chore: Updates Gotenberg versions [@stumpylog](https://github.com/stumpylog) ([#1768](https://github.com/paperless-ngx/paperless-ngx/pull/1768)) +- Documentation: Tweak LinuxServer [@stumpylog](https://github.com/stumpylog) ([#1761](https://github.com/paperless-ngx/paperless-ngx/pull/1761)) +- Documentation: Adds troubleshooting note about Kubernetes and ports [@stumpylog](https://github.com/stumpylog) ([#1731](https://github.com/paperless-ngx/paperless-ngx/pull/1731)) +- Documentation: LinuxServer.io Migration [@stumpylog](https://github.com/stumpylog) ([#1733](https://github.com/paperless-ngx/paperless-ngx/pull/1733)) +- [Documentation] Add v1.9.2 changelog [@github-actions](https://github.com/github-actions) ([#1671](https://github.com/paperless-ngx/paperless-ngx/pull/1671)) ### Maintenance -- Bump tj-actions/changed-files from 32 to 34 [@dependabot](https://github.com/dependabot) ([#1915](https://github.com/paperless-ngx/paperless-ngx/pull/1915)) -- Chore: Fix `dev` trying to build Pillow or lxml [@stumpylog](https://github.com/stumpylog) ([#1909](https://github.com/paperless-ngx/paperless-ngx/pull/1909)) -- Chore: Fixes pipenv issues [@stumpylog](https://github.com/stumpylog) ([#1873](https://github.com/paperless-ngx/paperless-ngx/pull/1873)) -- Chore: Simplified registry cleanup [@stumpylog](https://github.com/stumpylog) ([#1812](https://github.com/paperless-ngx/paperless-ngx/pull/1812)) -- Chore: Fixing deprecated workflow commands [@stumpylog](https://github.com/stumpylog) ([#1786](https://github.com/paperless-ngx/paperless-ngx/pull/1786)) -- Chore: Python library update + test fixes [@stumpylog](https://github.com/stumpylog) ([#1773](https://github.com/paperless-ngx/paperless-ngx/pull/1773)) -- Chore: Updates Gotenberg versions [@stumpylog](https://github.com/stumpylog) ([#1768](https://github.com/paperless-ngx/paperless-ngx/pull/1768)) -- Bump leonsteinhaeuser/project-beta-automations from 1.3.0 to 2.0.1 [@dependabot](https://github.com/dependabot) ([#1703](https://github.com/paperless-ngx/paperless-ngx/pull/1703)) -- Bump tj-actions/changed-files from 29.0.2 to 31.0.2 [@dependabot](https://github.com/dependabot) ([#1702](https://github.com/paperless-ngx/paperless-ngx/pull/1702)) -- Bump actions/checkout from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1704](https://github.com/paperless-ngx/paperless-ngx/pull/1704)) -- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1705](https://github.com/paperless-ngx/paperless-ngx/pull/1705)) +- Bump tj-actions/changed-files from 32 to 34 [@dependabot](https://github.com/dependabot) ([#1915](https://github.com/paperless-ngx/paperless-ngx/pull/1915)) +- Chore: Fix `dev` trying to build Pillow or lxml [@stumpylog](https://github.com/stumpylog) ([#1909](https://github.com/paperless-ngx/paperless-ngx/pull/1909)) +- Chore: Fixes pipenv issues [@stumpylog](https://github.com/stumpylog) ([#1873](https://github.com/paperless-ngx/paperless-ngx/pull/1873)) +- Chore: Simplified registry cleanup [@stumpylog](https://github.com/stumpylog) ([#1812](https://github.com/paperless-ngx/paperless-ngx/pull/1812)) +- Chore: Fixing deprecated workflow commands [@stumpylog](https://github.com/stumpylog) ([#1786](https://github.com/paperless-ngx/paperless-ngx/pull/1786)) +- Chore: Python library update + test fixes [@stumpylog](https://github.com/stumpylog) ([#1773](https://github.com/paperless-ngx/paperless-ngx/pull/1773)) +- Chore: Updates Gotenberg versions [@stumpylog](https://github.com/stumpylog) ([#1768](https://github.com/paperless-ngx/paperless-ngx/pull/1768)) +- Bump leonsteinhaeuser/project-beta-automations from 1.3.0 to 2.0.1 [@dependabot](https://github.com/dependabot) ([#1703](https://github.com/paperless-ngx/paperless-ngx/pull/1703)) +- Bump tj-actions/changed-files from 29.0.2 to 31.0.2 [@dependabot](https://github.com/dependabot) ([#1702](https://github.com/paperless-ngx/paperless-ngx/pull/1702)) +- Bump actions/checkout from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1704](https://github.com/paperless-ngx/paperless-ngx/pull/1704)) +- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1705](https://github.com/paperless-ngx/paperless-ngx/pull/1705)) ### Dependencies
31 changes -- Bugfix: Downgrade cryptography for armv7 compatibility [@stumpylog](https://github.com/stumpylog) ([#1954](https://github.com/paperless-ngx/paperless-ngx/pull/1954)) -- Chore: Bulk library updates + loosen restrictions [@stumpylog](https://github.com/stumpylog) ([#1949](https://github.com/paperless-ngx/paperless-ngx/pull/1949)) -- Bump tj-actions/changed-files from 32 to 34 [@dependabot](https://github.com/dependabot) ([#1915](https://github.com/paperless-ngx/paperless-ngx/pull/1915)) -- Bump scikit-learn from 1.1.2 to 1.1.3 [@dependabot](https://github.com/dependabot) ([#1903](https://github.com/paperless-ngx/paperless-ngx/pull/1903)) -- Bump angular packages as bundle [@dependabot](https://github.com/dependabot) ([#1910](https://github.com/paperless-ngx/paperless-ngx/pull/1910)) -- Bump ngx-ui-tour-ng-bootstrap from 11.0.0 to 11.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1911](https://github.com/paperless-ngx/paperless-ngx/pull/1911)) -- Bump jest-environment-jsdom from 29.1.2 to 29.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1914](https://github.com/paperless-ngx/paperless-ngx/pull/1914)) -- Bump pillow from 9.2.0 to 9.3.0 [@dependabot](https://github.com/dependabot) ([#1904](https://github.com/paperless-ngx/paperless-ngx/pull/1904)) -- Bump pytest from 7.1.3 to 7.2.0 [@dependabot](https://github.com/dependabot) ([#1902](https://github.com/paperless-ngx/paperless-ngx/pull/1902)) -- Bump tox from 3.26.0 to 3.27.0 [@dependabot](https://github.com/dependabot) ([#1901](https://github.com/paperless-ngx/paperless-ngx/pull/1901)) -- Bump zipp from 3.9.0 to 3.10.0 [@dependabot](https://github.com/dependabot) ([#1860](https://github.com/paperless-ngx/paperless-ngx/pull/1860)) -- Bump pytest-env from 0.6.2 to 0.8.1 [@dependabot](https://github.com/dependabot) ([#1859](https://github.com/paperless-ngx/paperless-ngx/pull/1859)) -- Bump sphinx from 5.2.3 to 5.3.0 [@dependabot](https://github.com/dependabot) ([#1817](https://github.com/paperless-ngx/paperless-ngx/pull/1817)) -- Chore: downgrade channels-redis [@stumpylog](https://github.com/stumpylog) ([#1802](https://github.com/paperless-ngx/paperless-ngx/pull/1802)) -- Chore: Update to qpdf 11.1.1 and update backend libraries [@stumpylog](https://github.com/stumpylog) ([#1749](https://github.com/paperless-ngx/paperless-ngx/pull/1749)) -- Bump myst-parser from 0.18.0 to 0.18.1 [@dependabot](https://github.com/dependabot) ([#1738](https://github.com/paperless-ngx/paperless-ngx/pull/1738)) -- Bump leonsteinhaeuser/project-beta-automations from 1.3.0 to 2.0.1 [@dependabot](https://github.com/dependabot) ([#1703](https://github.com/paperless-ngx/paperless-ngx/pull/1703)) -- Bump tj-actions/changed-files from 29.0.2 to 31.0.2 [@dependabot](https://github.com/dependabot) ([#1702](https://github.com/paperless-ngx/paperless-ngx/pull/1702)) -- Bump actions/checkout from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1704](https://github.com/paperless-ngx/paperless-ngx/pull/1704)) -- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1705](https://github.com/paperless-ngx/paperless-ngx/pull/1705)) -- Bump rxjs from 7.5.6 to 7.5.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#1720](https://github.com/paperless-ngx/paperless-ngx/pull/1720)) -- Bump uuid from 8.3.2 to 9.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1716](https://github.com/paperless-ngx/paperless-ngx/pull/1716)) -- Bump ng2-pdf-viewer from 9.1.0 to 9.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1717](https://github.com/paperless-ngx/paperless-ngx/pull/1717)) -- Bump ngx-color from 8.0.2 to 8.0.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1715](https://github.com/paperless-ngx/paperless-ngx/pull/1715)) -- Bump concurrently from 7.3.0 to 7.4.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1719](https://github.com/paperless-ngx/paperless-ngx/pull/1719)) -- Bump [@types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot](https://github.com/types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot) ([#1718](https://github.com/paperless-ngx/paperless-ngx/pull/1718)) -- Bump jest-environment-jsdom from 29.0.1 to 29.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1714](https://github.com/paperless-ngx/paperless-ngx/pull/1714)) -- Bump [@angular/cli @angular/core @dependabot](https://github.com/angular/cli @angular/core @dependabot) ([#1708](https://github.com/paperless-ngx/paperless-ngx/pull/1708)) -- Bump cypress from 10.7.0 to 10.9.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1707](https://github.com/paperless-ngx/paperless-ngx/pull/1707)) -- Bump bootstrap from 5.2.0 to 5.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1710](https://github.com/paperless-ngx/paperless-ngx/pull/1710)) -- Bump typescript from 4.7.4 to 4.8.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1706](https://github.com/paperless-ngx/paperless-ngx/pull/1706)) +- Bugfix: Downgrade cryptography for armv7 compatibility [@stumpylog](https://github.com/stumpylog) ([#1954](https://github.com/paperless-ngx/paperless-ngx/pull/1954)) +- Chore: Bulk library updates + loosen restrictions [@stumpylog](https://github.com/stumpylog) ([#1949](https://github.com/paperless-ngx/paperless-ngx/pull/1949)) +- Bump tj-actions/changed-files from 32 to 34 [@dependabot](https://github.com/dependabot) ([#1915](https://github.com/paperless-ngx/paperless-ngx/pull/1915)) +- Bump scikit-learn from 1.1.2 to 1.1.3 [@dependabot](https://github.com/dependabot) ([#1903](https://github.com/paperless-ngx/paperless-ngx/pull/1903)) +- Bump angular packages as bundle [@dependabot](https://github.com/dependabot) ([#1910](https://github.com/paperless-ngx/paperless-ngx/pull/1910)) +- Bump ngx-ui-tour-ng-bootstrap from 11.0.0 to 11.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1911](https://github.com/paperless-ngx/paperless-ngx/pull/1911)) +- Bump jest-environment-jsdom from 29.1.2 to 29.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1914](https://github.com/paperless-ngx/paperless-ngx/pull/1914)) +- Bump pillow from 9.2.0 to 9.3.0 [@dependabot](https://github.com/dependabot) ([#1904](https://github.com/paperless-ngx/paperless-ngx/pull/1904)) +- Bump pytest from 7.1.3 to 7.2.0 [@dependabot](https://github.com/dependabot) ([#1902](https://github.com/paperless-ngx/paperless-ngx/pull/1902)) +- Bump tox from 3.26.0 to 3.27.0 [@dependabot](https://github.com/dependabot) ([#1901](https://github.com/paperless-ngx/paperless-ngx/pull/1901)) +- Bump zipp from 3.9.0 to 3.10.0 [@dependabot](https://github.com/dependabot) ([#1860](https://github.com/paperless-ngx/paperless-ngx/pull/1860)) +- Bump pytest-env from 0.6.2 to 0.8.1 [@dependabot](https://github.com/dependabot) ([#1859](https://github.com/paperless-ngx/paperless-ngx/pull/1859)) +- Bump sphinx from 5.2.3 to 5.3.0 [@dependabot](https://github.com/dependabot) ([#1817](https://github.com/paperless-ngx/paperless-ngx/pull/1817)) +- Chore: downgrade channels-redis [@stumpylog](https://github.com/stumpylog) ([#1802](https://github.com/paperless-ngx/paperless-ngx/pull/1802)) +- Chore: Update to qpdf 11.1.1 and update backend libraries [@stumpylog](https://github.com/stumpylog) ([#1749](https://github.com/paperless-ngx/paperless-ngx/pull/1749)) +- Bump myst-parser from 0.18.0 to 0.18.1 [@dependabot](https://github.com/dependabot) ([#1738](https://github.com/paperless-ngx/paperless-ngx/pull/1738)) +- Bump leonsteinhaeuser/project-beta-automations from 1.3.0 to 2.0.1 [@dependabot](https://github.com/dependabot) ([#1703](https://github.com/paperless-ngx/paperless-ngx/pull/1703)) +- Bump tj-actions/changed-files from 29.0.2 to 31.0.2 [@dependabot](https://github.com/dependabot) ([#1702](https://github.com/paperless-ngx/paperless-ngx/pull/1702)) +- Bump actions/checkout from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1704](https://github.com/paperless-ngx/paperless-ngx/pull/1704)) +- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1705](https://github.com/paperless-ngx/paperless-ngx/pull/1705)) +- Bump rxjs from 7.5.6 to 7.5.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#1720](https://github.com/paperless-ngx/paperless-ngx/pull/1720)) +- Bump uuid from 8.3.2 to 9.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1716](https://github.com/paperless-ngx/paperless-ngx/pull/1716)) +- Bump ng2-pdf-viewer from 9.1.0 to 9.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1717](https://github.com/paperless-ngx/paperless-ngx/pull/1717)) +- Bump ngx-color from 8.0.2 to 8.0.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1715](https://github.com/paperless-ngx/paperless-ngx/pull/1715)) +- Bump concurrently from 7.3.0 to 7.4.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1719](https://github.com/paperless-ngx/paperless-ngx/pull/1719)) +- Bump [@types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot](https://github.com/types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot) ([#1718](https://github.com/paperless-ngx/paperless-ngx/pull/1718)) +- Bump jest-environment-jsdom from 29.0.1 to 29.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1714](https://github.com/paperless-ngx/paperless-ngx/pull/1714)) +- Bump [@angular/cli @angular/core @dependabot](https://github.com/angular/cli @angular/core @dependabot) ([#1708](https://github.com/paperless-ngx/paperless-ngx/pull/1708)) +- Bump cypress from 10.7.0 to 10.9.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1707](https://github.com/paperless-ngx/paperless-ngx/pull/1707)) +- Bump bootstrap from 5.2.0 to 5.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1710](https://github.com/paperless-ngx/paperless-ngx/pull/1710)) +- Bump typescript from 4.7.4 to 4.8.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1706](https://github.com/paperless-ngx/paperless-ngx/pull/1706))
### All App Changes -- Add info that re-do OCR doesn't automatically refresh content [@shamoon](https://github.com/shamoon) ([#2025](https://github.com/paperless-ngx/paperless-ngx/pull/2025)) -- Bugfix: Fix created_date being a string [@stumpylog](https://github.com/stumpylog) ([#2023](https://github.com/paperless-ngx/paperless-ngx/pull/2023)) -- Bugfix: Fixes an issue with mixed text and images when redoing OCR [@stumpylog](https://github.com/stumpylog) ([#2017](https://github.com/paperless-ngx/paperless-ngx/pull/2017)) -- Bugfix: Don't allow exceptions during date parsing to fail consume [@stumpylog](https://github.com/stumpylog) ([#1998](https://github.com/paperless-ngx/paperless-ngx/pull/1998)) -- Feature: Capture stdout \& stderr of the pre/post consume scripts [@stumpylog](https://github.com/stumpylog) ([#1967](https://github.com/paperless-ngx/paperless-ngx/pull/1967)) -- Bugfix: Always re-try barcodes with pdf2image [@stumpylog](https://github.com/stumpylog) ([#1953](https://github.com/paperless-ngx/paperless-ngx/pull/1953)) -- Fix: using `CONSUMER_SUBDIRS_AS_TAGS` causes failure with Celery in `dev` [@shamoon](https://github.com/shamoon) ([#1942](https://github.com/paperless-ngx/paperless-ngx/pull/1942)) -- Fix mail consumption broken in `dev` after move to celery [@shamoon](https://github.com/shamoon) ([#1934](https://github.com/paperless-ngx/paperless-ngx/pull/1934)) -- Bugfix: Prevent file handling from running with stale data [@stumpylog](https://github.com/stumpylog) ([#1905](https://github.com/paperless-ngx/paperless-ngx/pull/1905)) -- Chore: Reduce nuisance CI test failures [@stumpylog](https://github.com/stumpylog) ([#1922](https://github.com/paperless-ngx/paperless-ngx/pull/1922)) -- Bump scikit-learn from 1.1.2 to 1.1.3 [@dependabot](https://github.com/dependabot) ([#1903](https://github.com/paperless-ngx/paperless-ngx/pull/1903)) -- Bump angular packages as bundle [@dependabot](https://github.com/dependabot) ([#1910](https://github.com/paperless-ngx/paperless-ngx/pull/1910)) -- Bump ngx-ui-tour-ng-bootstrap from 11.0.0 to 11.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1911](https://github.com/paperless-ngx/paperless-ngx/pull/1911)) -- Bump jest-environment-jsdom from 29.1.2 to 29.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1914](https://github.com/paperless-ngx/paperless-ngx/pull/1914)) -- Feature: Add more file name formatting options [@stumpylog](https://github.com/stumpylog) ([#1906](https://github.com/paperless-ngx/paperless-ngx/pull/1906)) -- Bump pillow from 9.2.0 to 9.3.0 [@dependabot](https://github.com/dependabot) ([#1904](https://github.com/paperless-ngx/paperless-ngx/pull/1904)) -- Bump pytest from 7.1.3 to 7.2.0 [@dependabot](https://github.com/dependabot) ([#1902](https://github.com/paperless-ngx/paperless-ngx/pull/1902)) -- Bump tox from 3.26.0 to 3.27.0 [@dependabot](https://github.com/dependabot) ([#1901](https://github.com/paperless-ngx/paperless-ngx/pull/1901)) -- directly use rapidfuzz [@maxbachmann](https://github.com/maxbachmann) ([#1899](https://github.com/paperless-ngx/paperless-ngx/pull/1899)) -- Feature: 1.9.2 UI tweaks [@shamoon](https://github.com/shamoon) ([#1886](https://github.com/paperless-ngx/paperless-ngx/pull/1886)) -- Bump zipp from 3.9.0 to 3.10.0 [@dependabot](https://github.com/dependabot) ([#1860](https://github.com/paperless-ngx/paperless-ngx/pull/1860)) -- Fix: independent control of saved views [@shamoon](https://github.com/shamoon) ([#1868](https://github.com/paperless-ngx/paperless-ngx/pull/1868)) -- Fix: frontend relative date searches [@shamoon](https://github.com/shamoon) ([#1865](https://github.com/paperless-ngx/paperless-ngx/pull/1865)) -- Django error W003 - MariaDB may not allow unique CharFields to have a max_length > 255. [@Sblop](https://github.com/Sblop) ([#1881](https://github.com/paperless-ngx/paperless-ngx/pull/1881)) -- Bump pytest-env from 0.6.2 to 0.8.1 [@dependabot](https://github.com/dependabot) ([#1859](https://github.com/paperless-ngx/paperless-ngx/pull/1859)) -- Fix: Allows configuring barcodes with pdf2image instead of pikepdf [@stumpylog](https://github.com/stumpylog) ([#1857](https://github.com/paperless-ngx/paperless-ngx/pull/1857)) -- Feature: Save pending tasks for frontend [@stumpylog](https://github.com/stumpylog) ([#1816](https://github.com/paperless-ngx/paperless-ngx/pull/1816)) -- Bugfix: Reverts the change around skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1829](https://github.com/paperless-ngx/paperless-ngx/pull/1829)) -- Bump sphinx from 5.2.3 to 5.3.0 [@dependabot](https://github.com/dependabot) ([#1817](https://github.com/paperless-ngx/paperless-ngx/pull/1817)) -- Fix: missing loadViewConfig breaks loading saved view [@shamoon](https://github.com/shamoon) ([#1792](https://github.com/paperless-ngx/paperless-ngx/pull/1792)) -- Bugfix: Fallback to pdf2image if pikepdf fails [@stumpylog](https://github.com/stumpylog) ([#1745](https://github.com/paperless-ngx/paperless-ngx/pull/1745)) -- Fix: creating new storage path on document edit fails to update menu [@shamoon](https://github.com/shamoon) ([#1777](https://github.com/paperless-ngx/paperless-ngx/pull/1777)) -- Chore: Python library update + test fixes [@stumpylog](https://github.com/stumpylog) ([#1773](https://github.com/paperless-ngx/paperless-ngx/pull/1773)) -- Feature: Improved processing for automatic matching [@stumpylog](https://github.com/stumpylog) ([#1609](https://github.com/paperless-ngx/paperless-ngx/pull/1609)) -- Feature: Transition to celery for background tasks [@stumpylog](https://github.com/stumpylog) ([#1648](https://github.com/paperless-ngx/paperless-ngx/pull/1648)) -- Feature: UI Welcome Tour [@shamoon](https://github.com/shamoon) ([#1644](https://github.com/paperless-ngx/paperless-ngx/pull/1644)) -- Feature: slim sidebar [@shamoon](https://github.com/shamoon) ([#1641](https://github.com/paperless-ngx/paperless-ngx/pull/1641)) -- Bugfix: Files containing barcodes uploaded via web are not consumed after splitting [@stumpylog](https://github.com/stumpylog) ([#1762](https://github.com/paperless-ngx/paperless-ngx/pull/1762)) -- change default matching algo to auto and move to constant [@NiFNi](https://github.com/NiFNi) ([#1754](https://github.com/paperless-ngx/paperless-ngx/pull/1754)) -- Bugfix: Fix email labeling for non-Gmail servers [@stumpylog](https://github.com/stumpylog) ([#1755](https://github.com/paperless-ngx/paperless-ngx/pull/1755)) -- Feature: frontend update checking settings [@shamoon](https://github.com/shamoon) ([#1692](https://github.com/paperless-ngx/paperless-ngx/pull/1692)) -- Fix: allow preview for .csv files [@shamoon](https://github.com/shamoon) ([#1744](https://github.com/paperless-ngx/paperless-ngx/pull/1744)) -- Bump myst-parser from 0.18.0 to 0.18.1 [@dependabot](https://github.com/dependabot) ([#1738](https://github.com/paperless-ngx/paperless-ngx/pull/1738)) -- Bugfix: csv recognition by consumer [@bin101](https://github.com/bin101) ([#1726](https://github.com/paperless-ngx/paperless-ngx/pull/1726)) -- Bugfix: Include document title when a duplicate is detected [@stumpylog](https://github.com/stumpylog) ([#1696](https://github.com/paperless-ngx/paperless-ngx/pull/1696)) -- Bump rxjs from 7.5.6 to 7.5.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#1720](https://github.com/paperless-ngx/paperless-ngx/pull/1720)) -- Bump uuid from 8.3.2 to 9.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1716](https://github.com/paperless-ngx/paperless-ngx/pull/1716)) -- Bump ng2-pdf-viewer from 9.1.0 to 9.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1717](https://github.com/paperless-ngx/paperless-ngx/pull/1717)) -- Bump ngx-color from 8.0.2 to 8.0.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1715](https://github.com/paperless-ngx/paperless-ngx/pull/1715)) -- Bump concurrently from 7.3.0 to 7.4.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1719](https://github.com/paperless-ngx/paperless-ngx/pull/1719)) -- Bump [@types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot](https://github.com/types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot) ([#1718](https://github.com/paperless-ngx/paperless-ngx/pull/1718)) -- Bump jest-environment-jsdom from 29.0.1 to 29.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1714](https://github.com/paperless-ngx/paperless-ngx/pull/1714)) -- Bump [@angular/cli @angular/core @dependabot](https://github.com/angular/cli @angular/core @dependabot) ([#1708](https://github.com/paperless-ngx/paperless-ngx/pull/1708)) -- Bump cypress from 10.7.0 to 10.9.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1707](https://github.com/paperless-ngx/paperless-ngx/pull/1707)) -- Bump bootstrap from 5.2.0 to 5.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1710](https://github.com/paperless-ngx/paperless-ngx/pull/1710)) -- Bump typescript from 4.7.4 to 4.8.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1706](https://github.com/paperless-ngx/paperless-ngx/pull/1706)) -- Bugfix: Set MySql charset [@stumpylog](https://github.com/stumpylog) ([#1687](https://github.com/paperless-ngx/paperless-ngx/pull/1687)) +- Add info that re-do OCR doesn't automatically refresh content [@shamoon](https://github.com/shamoon) ([#2025](https://github.com/paperless-ngx/paperless-ngx/pull/2025)) +- Bugfix: Fix created_date being a string [@stumpylog](https://github.com/stumpylog) ([#2023](https://github.com/paperless-ngx/paperless-ngx/pull/2023)) +- Bugfix: Fixes an issue with mixed text and images when redoing OCR [@stumpylog](https://github.com/stumpylog) ([#2017](https://github.com/paperless-ngx/paperless-ngx/pull/2017)) +- Bugfix: Don't allow exceptions during date parsing to fail consume [@stumpylog](https://github.com/stumpylog) ([#1998](https://github.com/paperless-ngx/paperless-ngx/pull/1998)) +- Feature: Capture stdout \& stderr of the pre/post consume scripts [@stumpylog](https://github.com/stumpylog) ([#1967](https://github.com/paperless-ngx/paperless-ngx/pull/1967)) +- Bugfix: Always re-try barcodes with pdf2image [@stumpylog](https://github.com/stumpylog) ([#1953](https://github.com/paperless-ngx/paperless-ngx/pull/1953)) +- Fix: using `CONSUMER_SUBDIRS_AS_TAGS` causes failure with Celery in `dev` [@shamoon](https://github.com/shamoon) ([#1942](https://github.com/paperless-ngx/paperless-ngx/pull/1942)) +- Fix mail consumption broken in `dev` after move to celery [@shamoon](https://github.com/shamoon) ([#1934](https://github.com/paperless-ngx/paperless-ngx/pull/1934)) +- Bugfix: Prevent file handling from running with stale data [@stumpylog](https://github.com/stumpylog) ([#1905](https://github.com/paperless-ngx/paperless-ngx/pull/1905)) +- Chore: Reduce nuisance CI test failures [@stumpylog](https://github.com/stumpylog) ([#1922](https://github.com/paperless-ngx/paperless-ngx/pull/1922)) +- Bump scikit-learn from 1.1.2 to 1.1.3 [@dependabot](https://github.com/dependabot) ([#1903](https://github.com/paperless-ngx/paperless-ngx/pull/1903)) +- Bump angular packages as bundle [@dependabot](https://github.com/dependabot) ([#1910](https://github.com/paperless-ngx/paperless-ngx/pull/1910)) +- Bump ngx-ui-tour-ng-bootstrap from 11.0.0 to 11.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1911](https://github.com/paperless-ngx/paperless-ngx/pull/1911)) +- Bump jest-environment-jsdom from 29.1.2 to 29.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1914](https://github.com/paperless-ngx/paperless-ngx/pull/1914)) +- Feature: Add more file name formatting options [@stumpylog](https://github.com/stumpylog) ([#1906](https://github.com/paperless-ngx/paperless-ngx/pull/1906)) +- Bump pillow from 9.2.0 to 9.3.0 [@dependabot](https://github.com/dependabot) ([#1904](https://github.com/paperless-ngx/paperless-ngx/pull/1904)) +- Bump pytest from 7.1.3 to 7.2.0 [@dependabot](https://github.com/dependabot) ([#1902](https://github.com/paperless-ngx/paperless-ngx/pull/1902)) +- Bump tox from 3.26.0 to 3.27.0 [@dependabot](https://github.com/dependabot) ([#1901](https://github.com/paperless-ngx/paperless-ngx/pull/1901)) +- directly use rapidfuzz [@maxbachmann](https://github.com/maxbachmann) ([#1899](https://github.com/paperless-ngx/paperless-ngx/pull/1899)) +- Feature: 1.9.2 UI tweaks [@shamoon](https://github.com/shamoon) ([#1886](https://github.com/paperless-ngx/paperless-ngx/pull/1886)) +- Bump zipp from 3.9.0 to 3.10.0 [@dependabot](https://github.com/dependabot) ([#1860](https://github.com/paperless-ngx/paperless-ngx/pull/1860)) +- Fix: independent control of saved views [@shamoon](https://github.com/shamoon) ([#1868](https://github.com/paperless-ngx/paperless-ngx/pull/1868)) +- Fix: frontend relative date searches [@shamoon](https://github.com/shamoon) ([#1865](https://github.com/paperless-ngx/paperless-ngx/pull/1865)) +- Django error W003 - MariaDB may not allow unique CharFields to have a max_length > 255. [@Sblop](https://github.com/Sblop) ([#1881](https://github.com/paperless-ngx/paperless-ngx/pull/1881)) +- Bump pytest-env from 0.6.2 to 0.8.1 [@dependabot](https://github.com/dependabot) ([#1859](https://github.com/paperless-ngx/paperless-ngx/pull/1859)) +- Fix: Allows configuring barcodes with pdf2image instead of pikepdf [@stumpylog](https://github.com/stumpylog) ([#1857](https://github.com/paperless-ngx/paperless-ngx/pull/1857)) +- Feature: Save pending tasks for frontend [@stumpylog](https://github.com/stumpylog) ([#1816](https://github.com/paperless-ngx/paperless-ngx/pull/1816)) +- Bugfix: Reverts the change around skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1829](https://github.com/paperless-ngx/paperless-ngx/pull/1829)) +- Bump sphinx from 5.2.3 to 5.3.0 [@dependabot](https://github.com/dependabot) ([#1817](https://github.com/paperless-ngx/paperless-ngx/pull/1817)) +- Fix: missing loadViewConfig breaks loading saved view [@shamoon](https://github.com/shamoon) ([#1792](https://github.com/paperless-ngx/paperless-ngx/pull/1792)) +- Bugfix: Fallback to pdf2image if pikepdf fails [@stumpylog](https://github.com/stumpylog) ([#1745](https://github.com/paperless-ngx/paperless-ngx/pull/1745)) +- Fix: creating new storage path on document edit fails to update menu [@shamoon](https://github.com/shamoon) ([#1777](https://github.com/paperless-ngx/paperless-ngx/pull/1777)) +- Chore: Python library update + test fixes [@stumpylog](https://github.com/stumpylog) ([#1773](https://github.com/paperless-ngx/paperless-ngx/pull/1773)) +- Feature: Improved processing for automatic matching [@stumpylog](https://github.com/stumpylog) ([#1609](https://github.com/paperless-ngx/paperless-ngx/pull/1609)) +- Feature: Transition to celery for background tasks [@stumpylog](https://github.com/stumpylog) ([#1648](https://github.com/paperless-ngx/paperless-ngx/pull/1648)) +- Feature: UI Welcome Tour [@shamoon](https://github.com/shamoon) ([#1644](https://github.com/paperless-ngx/paperless-ngx/pull/1644)) +- Feature: slim sidebar [@shamoon](https://github.com/shamoon) ([#1641](https://github.com/paperless-ngx/paperless-ngx/pull/1641)) +- Bugfix: Files containing barcodes uploaded via web are not consumed after splitting [@stumpylog](https://github.com/stumpylog) ([#1762](https://github.com/paperless-ngx/paperless-ngx/pull/1762)) +- change default matching algo to auto and move to constant [@NiFNi](https://github.com/NiFNi) ([#1754](https://github.com/paperless-ngx/paperless-ngx/pull/1754)) +- Bugfix: Fix email labeling for non-Gmail servers [@stumpylog](https://github.com/stumpylog) ([#1755](https://github.com/paperless-ngx/paperless-ngx/pull/1755)) +- Feature: frontend update checking settings [@shamoon](https://github.com/shamoon) ([#1692](https://github.com/paperless-ngx/paperless-ngx/pull/1692)) +- Fix: allow preview for .csv files [@shamoon](https://github.com/shamoon) ([#1744](https://github.com/paperless-ngx/paperless-ngx/pull/1744)) +- Bump myst-parser from 0.18.0 to 0.18.1 [@dependabot](https://github.com/dependabot) ([#1738](https://github.com/paperless-ngx/paperless-ngx/pull/1738)) +- Bugfix: csv recognition by consumer [@bin101](https://github.com/bin101) ([#1726](https://github.com/paperless-ngx/paperless-ngx/pull/1726)) +- Bugfix: Include document title when a duplicate is detected [@stumpylog](https://github.com/stumpylog) ([#1696](https://github.com/paperless-ngx/paperless-ngx/pull/1696)) +- Bump rxjs from 7.5.6 to 7.5.7 in /src-ui [@dependabot](https://github.com/dependabot) ([#1720](https://github.com/paperless-ngx/paperless-ngx/pull/1720)) +- Bump uuid from 8.3.2 to 9.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1716](https://github.com/paperless-ngx/paperless-ngx/pull/1716)) +- Bump ng2-pdf-viewer from 9.1.0 to 9.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1717](https://github.com/paperless-ngx/paperless-ngx/pull/1717)) +- Bump ngx-color from 8.0.2 to 8.0.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1715](https://github.com/paperless-ngx/paperless-ngx/pull/1715)) +- Bump concurrently from 7.3.0 to 7.4.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1719](https://github.com/paperless-ngx/paperless-ngx/pull/1719)) +- Bump [@types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot](https://github.com/types/node from 18.7.14 to 18.7.23 in /src-ui @dependabot) ([#1718](https://github.com/paperless-ngx/paperless-ngx/pull/1718)) +- Bump jest-environment-jsdom from 29.0.1 to 29.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1714](https://github.com/paperless-ngx/paperless-ngx/pull/1714)) +- Bump [@angular/cli @angular/core @dependabot](https://github.com/angular/cli @angular/core @dependabot) ([#1708](https://github.com/paperless-ngx/paperless-ngx/pull/1708)) +- Bump cypress from 10.7.0 to 10.9.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1707](https://github.com/paperless-ngx/paperless-ngx/pull/1707)) +- Bump bootstrap from 5.2.0 to 5.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1710](https://github.com/paperless-ngx/paperless-ngx/pull/1710)) +- Bump typescript from 4.7.4 to 4.8.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1706](https://github.com/paperless-ngx/paperless-ngx/pull/1706)) +- Bugfix: Set MySql charset [@stumpylog](https://github.com/stumpylog) ([#1687](https://github.com/paperless-ngx/paperless-ngx/pull/1687)) ## paperless-ngx 1.9.2 ### Bug Fixes -- Bugfix: Allow PAPERLESS_OCR_CLEAN=none [@shamoon](https://github.com/shamoon) ([#1670](https://github.com/paperless-ngx/paperless-ngx/pull/1670)) +- Bugfix: Allow PAPERLESS_OCR_CLEAN=none [@shamoon](https://github.com/shamoon) ([#1670](https://github.com/paperless-ngx/paperless-ngx/pull/1670)) ### All App Changes -- Chore: Bumps version numbers to 1.9.2 [@stumpylog](https://github.com/stumpylog) ([#1666](https://github.com/paperless-ngx/paperless-ngx/pull/1666)) +- Chore: Bumps version numbers to 1.9.2 [@stumpylog](https://github.com/stumpylog) ([#1666](https://github.com/paperless-ngx/paperless-ngx/pull/1666)) ## paperless-ngx 1.9.1 ### Notes -- Version 1.9.1 incorrectly displays the version string as 1.9.0 +- Version 1.9.1 incorrectly displays the version string as 1.9.0 ### Bug Fixes -- Bugfix: Fixes missing OCR mode skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1645](https://github.com/paperless-ngx/paperless-ngx/pull/1645)) -- Fix reset button padding on small screens [@shamoon](https://github.com/shamoon) ([#1646](https://github.com/paperless-ngx/paperless-ngx/pull/1646)) +- Bugfix: Fixes missing OCR mode skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1645](https://github.com/paperless-ngx/paperless-ngx/pull/1645)) +- Fix reset button padding on small screens [@shamoon](https://github.com/shamoon) ([#1646](https://github.com/paperless-ngx/paperless-ngx/pull/1646)) ### Documentation -- Improve docs re [@janis-ax](https://github.com/janis-ax) ([#1625](https://github.com/paperless-ngx/paperless-ngx/pull/1625)) -- [Documentation] Add v1.9.0 changelog [@github-actions](https://github.com/github-actions) ([#1639](https://github.com/paperless-ngx/paperless-ngx/pull/1639)) +- Improve docs re [@janis-ax](https://github.com/janis-ax) ([#1625](https://github.com/paperless-ngx/paperless-ngx/pull/1625)) +- [Documentation] Add v1.9.0 changelog [@github-actions](https://github.com/github-actions) ([#1639](https://github.com/paperless-ngx/paperless-ngx/pull/1639)) ### All App Changes -- Bugfix: Fixes missing OCR mode skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1645](https://github.com/paperless-ngx/paperless-ngx/pull/1645)) -- Fix reset button padding on small screens [@shamoon](https://github.com/shamoon) ([#1646](https://github.com/paperless-ngx/paperless-ngx/pull/1646)) +- Bugfix: Fixes missing OCR mode skip_noarchive [@stumpylog](https://github.com/stumpylog) ([#1645](https://github.com/paperless-ngx/paperless-ngx/pull/1645)) +- Fix reset button padding on small screens [@shamoon](https://github.com/shamoon) ([#1646](https://github.com/paperless-ngx/paperless-ngx/pull/1646)) ## paperless-ngx 1.9.0 ### Features -- Feature: Faster, less memory barcode handling [@stumpylog](https://github.com/stumpylog) ([#1594](https://github.com/paperless-ngx/paperless-ngx/pull/1594)) -- Feature: Display django-q process names [@stumpylog](https://github.com/stumpylog) ([#1567](https://github.com/paperless-ngx/paperless-ngx/pull/1567)) -- Feature: Add MariaDB support [@bckelly1](https://github.com/bckelly1) ([#543](https://github.com/paperless-ngx/paperless-ngx/pull/543)) -- Feature: Simplify IMAP login for UTF-8 [@stumpylog](https://github.com/stumpylog) ([#1492](https://github.com/paperless-ngx/paperless-ngx/pull/1492)) -- Feature: Even better re-do of OCR [@stumpylog](https://github.com/stumpylog) ([#1451](https://github.com/paperless-ngx/paperless-ngx/pull/1451)) -- Feature: document comments [@tim-vogel](https://github.com/tim-vogel) ([#1375](https://github.com/paperless-ngx/paperless-ngx/pull/1375)) -- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) -- Feature: Event driven consumer [@stumpylog](https://github.com/stumpylog) ([#1421](https://github.com/paperless-ngx/paperless-ngx/pull/1421)) -- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) -- Feature: Preserve original filename in metadata [@GwynHannay](https://github.com/GwynHannay) ([#1440](https://github.com/paperless-ngx/paperless-ngx/pull/1440)) -- Handle tags for gmail email accounts [@sisao](https://github.com/sisao) ([#1433](https://github.com/paperless-ngx/paperless-ngx/pull/1433)) -- Update redis image [@tribut](https://github.com/tribut) ([#1436](https://github.com/paperless-ngx/paperless-ngx/pull/1436)) -- PAPERLESS_REDIS may be set via docker secrets [@DennisGaida](https://github.com/DennisGaida) ([#1405](https://github.com/paperless-ngx/paperless-ngx/pull/1405)) +- Feature: Faster, less memory barcode handling [@stumpylog](https://github.com/stumpylog) ([#1594](https://github.com/paperless-ngx/paperless-ngx/pull/1594)) +- Feature: Display django-q process names [@stumpylog](https://github.com/stumpylog) ([#1567](https://github.com/paperless-ngx/paperless-ngx/pull/1567)) +- Feature: Add MariaDB support [@bckelly1](https://github.com/bckelly1) ([#543](https://github.com/paperless-ngx/paperless-ngx/pull/543)) +- Feature: Simplify IMAP login for UTF-8 [@stumpylog](https://github.com/stumpylog) ([#1492](https://github.com/paperless-ngx/paperless-ngx/pull/1492)) +- Feature: Even better re-do of OCR [@stumpylog](https://github.com/stumpylog) ([#1451](https://github.com/paperless-ngx/paperless-ngx/pull/1451)) +- Feature: document comments [@tim-vogel](https://github.com/tim-vogel) ([#1375](https://github.com/paperless-ngx/paperless-ngx/pull/1375)) +- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) +- Feature: Event driven consumer [@stumpylog](https://github.com/stumpylog) ([#1421](https://github.com/paperless-ngx/paperless-ngx/pull/1421)) +- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) +- Feature: Preserve original filename in metadata [@GwynHannay](https://github.com/GwynHannay) ([#1440](https://github.com/paperless-ngx/paperless-ngx/pull/1440)) +- Handle tags for gmail email accounts [@sisao](https://github.com/sisao) ([#1433](https://github.com/paperless-ngx/paperless-ngx/pull/1433)) +- Update redis image [@tribut](https://github.com/tribut) ([#1436](https://github.com/paperless-ngx/paperless-ngx/pull/1436)) +- PAPERLESS_REDIS may be set via docker secrets [@DennisGaida](https://github.com/DennisGaida) ([#1405](https://github.com/paperless-ngx/paperless-ngx/pull/1405)) ### Bug Fixes -- paperless_cmd.sh: use exec to run supervisord [@lemmi](https://github.com/lemmi) ([#1617](https://github.com/paperless-ngx/paperless-ngx/pull/1617)) -- Fix: Double barcode separation creates empty file [@stumpylog](https://github.com/stumpylog) ([#1596](https://github.com/paperless-ngx/paperless-ngx/pull/1596)) -- Fix: Resolve issue with slow classifier [@stumpylog](https://github.com/stumpylog) ([#1576](https://github.com/paperless-ngx/paperless-ngx/pull/1576)) -- Fix document comments not updating on document navigation [@shamoon](https://github.com/shamoon) ([#1566](https://github.com/paperless-ngx/paperless-ngx/pull/1566)) -- Fix: Include storage paths in document exporter [@shamoon](https://github.com/shamoon) ([#1557](https://github.com/paperless-ngx/paperless-ngx/pull/1557)) -- Chore: Cleanup and validate settings [@stumpylog](https://github.com/stumpylog) ([#1551](https://github.com/paperless-ngx/paperless-ngx/pull/1551)) -- Bugfix: Better gunicorn settings for workers [@stumpylog](https://github.com/stumpylog) ([#1500](https://github.com/paperless-ngx/paperless-ngx/pull/1500)) -- Fix actions button in tasks table [@shamoon](https://github.com/shamoon) ([#1488](https://github.com/paperless-ngx/paperless-ngx/pull/1488)) -- Fix: Add missing filter rule types to SavedViewFilterRule model \& fix migrations [@shamoon](https://github.com/shamoon) ([#1463](https://github.com/paperless-ngx/paperless-ngx/pull/1463)) -- Fix paperless.conf.example typo [@qcasey](https://github.com/qcasey) ([#1460](https://github.com/paperless-ngx/paperless-ngx/pull/1460)) -- Bugfix: Fixes the creation of an archive file, even if noarchive was specified [@stumpylog](https://github.com/stumpylog) ([#1442](https://github.com/paperless-ngx/paperless-ngx/pull/1442)) -- Fix: created_date should not be required [@shamoon](https://github.com/shamoon) ([#1412](https://github.com/paperless-ngx/paperless-ngx/pull/1412)) -- Fix: dev backend testing [@stumpylog](https://github.com/stumpylog) ([#1420](https://github.com/paperless-ngx/paperless-ngx/pull/1420)) -- Bugfix: Catch all exceptions during the task signals [@stumpylog](https://github.com/stumpylog) ([#1387](https://github.com/paperless-ngx/paperless-ngx/pull/1387)) -- Fix: saved view page parameter [@shamoon](https://github.com/shamoon) ([#1376](https://github.com/paperless-ngx/paperless-ngx/pull/1376)) -- Fix: Correct browser unsaved changes warning [@shamoon](https://github.com/shamoon) ([#1369](https://github.com/paperless-ngx/paperless-ngx/pull/1369)) -- Fix: correct date pasting with other formats [@shamoon](https://github.com/shamoon) ([#1370](https://github.com/paperless-ngx/paperless-ngx/pull/1370)) -- Bugfix: Allow webserver bind address to be configured [@stumpylog](https://github.com/stumpylog) ([#1358](https://github.com/paperless-ngx/paperless-ngx/pull/1358)) -- Bugfix: Chain exceptions during exception handling [@stumpylog](https://github.com/stumpylog) ([#1354](https://github.com/paperless-ngx/paperless-ngx/pull/1354)) -- Fix: missing tooltip translation \& filter editor wrapping [@shamoon](https://github.com/shamoon) ([#1305](https://github.com/paperless-ngx/paperless-ngx/pull/1305)) -- Bugfix: Interaction between barcode and directories as tags [@stumpylog](https://github.com/stumpylog) ([#1303](https://github.com/paperless-ngx/paperless-ngx/pull/1303)) +- paperless_cmd.sh: use exec to run supervisord [@lemmi](https://github.com/lemmi) ([#1617](https://github.com/paperless-ngx/paperless-ngx/pull/1617)) +- Fix: Double barcode separation creates empty file [@stumpylog](https://github.com/stumpylog) ([#1596](https://github.com/paperless-ngx/paperless-ngx/pull/1596)) +- Fix: Resolve issue with slow classifier [@stumpylog](https://github.com/stumpylog) ([#1576](https://github.com/paperless-ngx/paperless-ngx/pull/1576)) +- Fix document comments not updating on document navigation [@shamoon](https://github.com/shamoon) ([#1566](https://github.com/paperless-ngx/paperless-ngx/pull/1566)) +- Fix: Include storage paths in document exporter [@shamoon](https://github.com/shamoon) ([#1557](https://github.com/paperless-ngx/paperless-ngx/pull/1557)) +- Chore: Cleanup and validate settings [@stumpylog](https://github.com/stumpylog) ([#1551](https://github.com/paperless-ngx/paperless-ngx/pull/1551)) +- Bugfix: Better gunicorn settings for workers [@stumpylog](https://github.com/stumpylog) ([#1500](https://github.com/paperless-ngx/paperless-ngx/pull/1500)) +- Fix actions button in tasks table [@shamoon](https://github.com/shamoon) ([#1488](https://github.com/paperless-ngx/paperless-ngx/pull/1488)) +- Fix: Add missing filter rule types to SavedViewFilterRule model \& fix migrations [@shamoon](https://github.com/shamoon) ([#1463](https://github.com/paperless-ngx/paperless-ngx/pull/1463)) +- Fix paperless.conf.example typo [@qcasey](https://github.com/qcasey) ([#1460](https://github.com/paperless-ngx/paperless-ngx/pull/1460)) +- Bugfix: Fixes the creation of an archive file, even if noarchive was specified [@stumpylog](https://github.com/stumpylog) ([#1442](https://github.com/paperless-ngx/paperless-ngx/pull/1442)) +- Fix: created_date should not be required [@shamoon](https://github.com/shamoon) ([#1412](https://github.com/paperless-ngx/paperless-ngx/pull/1412)) +- Fix: dev backend testing [@stumpylog](https://github.com/stumpylog) ([#1420](https://github.com/paperless-ngx/paperless-ngx/pull/1420)) +- Bugfix: Catch all exceptions during the task signals [@stumpylog](https://github.com/stumpylog) ([#1387](https://github.com/paperless-ngx/paperless-ngx/pull/1387)) +- Fix: saved view page parameter [@shamoon](https://github.com/shamoon) ([#1376](https://github.com/paperless-ngx/paperless-ngx/pull/1376)) +- Fix: Correct browser unsaved changes warning [@shamoon](https://github.com/shamoon) ([#1369](https://github.com/paperless-ngx/paperless-ngx/pull/1369)) +- Fix: correct date pasting with other formats [@shamoon](https://github.com/shamoon) ([#1370](https://github.com/paperless-ngx/paperless-ngx/pull/1370)) +- Bugfix: Allow webserver bind address to be configured [@stumpylog](https://github.com/stumpylog) ([#1358](https://github.com/paperless-ngx/paperless-ngx/pull/1358)) +- Bugfix: Chain exceptions during exception handling [@stumpylog](https://github.com/stumpylog) ([#1354](https://github.com/paperless-ngx/paperless-ngx/pull/1354)) +- Fix: missing tooltip translation \& filter editor wrapping [@shamoon](https://github.com/shamoon) ([#1305](https://github.com/paperless-ngx/paperless-ngx/pull/1305)) +- Bugfix: Interaction between barcode and directories as tags [@stumpylog](https://github.com/stumpylog) ([#1303](https://github.com/paperless-ngx/paperless-ngx/pull/1303)) ### Documentation -- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) -- docs/configuration: Fix binary variable defaults [@erikarvstedt](https://github.com/erikarvstedt) ([#1528](https://github.com/paperless-ngx/paperless-ngx/pull/1528)) -- Info about installing on subpath [@viktor-c](https://github.com/viktor-c) ([#1350](https://github.com/paperless-ngx/paperless-ngx/pull/1350)) -- Docs: move scanner \& software recs to GH wiki [@shamoon](https://github.com/shamoon) ([#1482](https://github.com/paperless-ngx/paperless-ngx/pull/1482)) -- Docs: Update mobile scanner section [@tooomm](https://github.com/tooomm) ([#1467](https://github.com/paperless-ngx/paperless-ngx/pull/1467)) -- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) -- docs: scanners: add Brother ads4700w [@ocelotsloth](https://github.com/ocelotsloth) ([#1450](https://github.com/paperless-ngx/paperless-ngx/pull/1450)) -- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) -- Changes to Redis documentation [@Zerteax](https://github.com/Zerteax) ([#1441](https://github.com/paperless-ngx/paperless-ngx/pull/1441)) -- Update scanners.rst [@glassbox-sco](https://github.com/glassbox-sco) ([#1430](https://github.com/paperless-ngx/paperless-ngx/pull/1430)) -- Update scanners.rst [@derlucas](https://github.com/derlucas) ([#1415](https://github.com/paperless-ngx/paperless-ngx/pull/1415)) -- Bugfix: Allow webserver bind address to be configured [@stumpylog](https://github.com/stumpylog) ([#1358](https://github.com/paperless-ngx/paperless-ngx/pull/1358)) -- docs: fix small typo [@tooomm](https://github.com/tooomm) ([#1352](https://github.com/paperless-ngx/paperless-ngx/pull/1352)) -- [Documentation] Add v1.8.0 changelog [@github-actions](https://github.com/github-actions) ([#1298](https://github.com/paperless-ngx/paperless-ngx/pull/1298)) +- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) +- docs/configuration: Fix binary variable defaults [@erikarvstedt](https://github.com/erikarvstedt) ([#1528](https://github.com/paperless-ngx/paperless-ngx/pull/1528)) +- Info about installing on subpath [@viktor-c](https://github.com/viktor-c) ([#1350](https://github.com/paperless-ngx/paperless-ngx/pull/1350)) +- Docs: move scanner \& software recs to GH wiki [@shamoon](https://github.com/shamoon) ([#1482](https://github.com/paperless-ngx/paperless-ngx/pull/1482)) +- Docs: Update mobile scanner section [@tooomm](https://github.com/tooomm) ([#1467](https://github.com/paperless-ngx/paperless-ngx/pull/1467)) +- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) +- docs: scanners: add Brother ads4700w [@ocelotsloth](https://github.com/ocelotsloth) ([#1450](https://github.com/paperless-ngx/paperless-ngx/pull/1450)) +- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) +- Changes to Redis documentation [@Zerteax](https://github.com/Zerteax) ([#1441](https://github.com/paperless-ngx/paperless-ngx/pull/1441)) +- Update scanners.rst [@glassbox-sco](https://github.com/glassbox-sco) ([#1430](https://github.com/paperless-ngx/paperless-ngx/pull/1430)) +- Update scanners.rst [@derlucas](https://github.com/derlucas) ([#1415](https://github.com/paperless-ngx/paperless-ngx/pull/1415)) +- Bugfix: Allow webserver bind address to be configured [@stumpylog](https://github.com/stumpylog) ([#1358](https://github.com/paperless-ngx/paperless-ngx/pull/1358)) +- docs: fix small typo [@tooomm](https://github.com/tooomm) ([#1352](https://github.com/paperless-ngx/paperless-ngx/pull/1352)) +- [Documentation] Add v1.8.0 changelog [@github-actions](https://github.com/github-actions) ([#1298](https://github.com/paperless-ngx/paperless-ngx/pull/1298)) ### Maintenance -- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) -- paperless_cmd.sh: use exec to run supervisord [@lemmi](https://github.com/lemmi) ([#1617](https://github.com/paperless-ngx/paperless-ngx/pull/1617)) -- Chore: Extended container image cleanup [@stumpylog](https://github.com/stumpylog) ([#1556](https://github.com/paperless-ngx/paperless-ngx/pull/1556)) -- Chore: Smaller library images [@stumpylog](https://github.com/stumpylog) ([#1546](https://github.com/paperless-ngx/paperless-ngx/pull/1546)) -- Bump tj-actions/changed-files from 24 to 29.0.2 [@dependabot](https://github.com/dependabot) ([#1493](https://github.com/paperless-ngx/paperless-ngx/pull/1493)) -- Bugfix: Better gunicorn settings for workers [@stumpylog](https://github.com/stumpylog) ([#1500](https://github.com/paperless-ngx/paperless-ngx/pull/1500)) -- [CI] Fix release drafter issues [@qcasey](https://github.com/qcasey) ([#1301](https://github.com/paperless-ngx/paperless-ngx/pull/1301)) -- Fix: dev backend testing [@stumpylog](https://github.com/stumpylog) ([#1420](https://github.com/paperless-ngx/paperless-ngx/pull/1420)) -- Chore: Exclude dependabot PRs from Project, set status to Needs Review [@qcasey](https://github.com/qcasey) ([#1397](https://github.com/paperless-ngx/paperless-ngx/pull/1397)) -- Chore: Add to label PRs based on and title [@qcasey](https://github.com/qcasey) ([#1396](https://github.com/paperless-ngx/paperless-ngx/pull/1396)) -- Chore: use pre-commit in the Ci workflow [@stumpylog](https://github.com/stumpylog) ([#1362](https://github.com/paperless-ngx/paperless-ngx/pull/1362)) -- Chore: Fixes permissions for image tag cleanup [@stumpylog](https://github.com/stumpylog) ([#1315](https://github.com/paperless-ngx/paperless-ngx/pull/1315)) -- Bump leonsteinhaeuser/project-beta-automations from 1.2.1 to 1.3.0 [@dependabot](https://github.com/dependabot) ([#1328](https://github.com/paperless-ngx/paperless-ngx/pull/1328)) -- Bump tj-actions/changed-files from 23.1 to 24 [@dependabot](https://github.com/dependabot) ([#1329](https://github.com/paperless-ngx/paperless-ngx/pull/1329)) -- Feature: Remove requirements.txt and use pipenv everywhere [@stumpylog](https://github.com/stumpylog) ([#1316](https://github.com/paperless-ngx/paperless-ngx/pull/1316)) +- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) +- paperless_cmd.sh: use exec to run supervisord [@lemmi](https://github.com/lemmi) ([#1617](https://github.com/paperless-ngx/paperless-ngx/pull/1617)) +- Chore: Extended container image cleanup [@stumpylog](https://github.com/stumpylog) ([#1556](https://github.com/paperless-ngx/paperless-ngx/pull/1556)) +- Chore: Smaller library images [@stumpylog](https://github.com/stumpylog) ([#1546](https://github.com/paperless-ngx/paperless-ngx/pull/1546)) +- Bump tj-actions/changed-files from 24 to 29.0.2 [@dependabot](https://github.com/dependabot) ([#1493](https://github.com/paperless-ngx/paperless-ngx/pull/1493)) +- Bugfix: Better gunicorn settings for workers [@stumpylog](https://github.com/stumpylog) ([#1500](https://github.com/paperless-ngx/paperless-ngx/pull/1500)) +- [CI] Fix release drafter issues [@qcasey](https://github.com/qcasey) ([#1301](https://github.com/paperless-ngx/paperless-ngx/pull/1301)) +- Fix: dev backend testing [@stumpylog](https://github.com/stumpylog) ([#1420](https://github.com/paperless-ngx/paperless-ngx/pull/1420)) +- Chore: Exclude dependabot PRs from Project, set status to Needs Review [@qcasey](https://github.com/qcasey) ([#1397](https://github.com/paperless-ngx/paperless-ngx/pull/1397)) +- Chore: Add to label PRs based on and title [@qcasey](https://github.com/qcasey) ([#1396](https://github.com/paperless-ngx/paperless-ngx/pull/1396)) +- Chore: use pre-commit in the Ci workflow [@stumpylog](https://github.com/stumpylog) ([#1362](https://github.com/paperless-ngx/paperless-ngx/pull/1362)) +- Chore: Fixes permissions for image tag cleanup [@stumpylog](https://github.com/stumpylog) ([#1315](https://github.com/paperless-ngx/paperless-ngx/pull/1315)) +- Bump leonsteinhaeuser/project-beta-automations from 1.2.1 to 1.3.0 [@dependabot](https://github.com/dependabot) ([#1328](https://github.com/paperless-ngx/paperless-ngx/pull/1328)) +- Bump tj-actions/changed-files from 23.1 to 24 [@dependabot](https://github.com/dependabot) ([#1329](https://github.com/paperless-ngx/paperless-ngx/pull/1329)) +- Feature: Remove requirements.txt and use pipenv everywhere [@stumpylog](https://github.com/stumpylog) ([#1316](https://github.com/paperless-ngx/paperless-ngx/pull/1316)) ### Dependencies
34 changes -- Bump pikepdf from 5.5.0 to 5.6.1 [@dependabot](https://github.com/dependabot) ([#1537](https://github.com/paperless-ngx/paperless-ngx/pull/1537)) -- Bump black from 22.6.0 to 22.8.0 [@dependabot](https://github.com/dependabot) ([#1539](https://github.com/paperless-ngx/paperless-ngx/pull/1539)) -- Bump tqdm from 4.64.0 to 4.64.1 [@dependabot](https://github.com/dependabot) ([#1540](https://github.com/paperless-ngx/paperless-ngx/pull/1540)) -- Bump pytest from 7.1.2 to 7.1.3 [@dependabot](https://github.com/dependabot) ([#1538](https://github.com/paperless-ngx/paperless-ngx/pull/1538)) -- Bump tj-actions/changed-files from 24 to 29.0.2 [@dependabot](https://github.com/dependabot) ([#1493](https://github.com/paperless-ngx/paperless-ngx/pull/1493)) -- Bump angular packages, jest-preset-angular in src-ui [@dependabot](https://github.com/dependabot) ([#1502](https://github.com/paperless-ngx/paperless-ngx/pull/1502)) -- Bump jest-environment-jsdom from 28.1.3 to 29.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1507](https://github.com/paperless-ngx/paperless-ngx/pull/1507)) -- Bump [@types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot](https://github.com/types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot) ([#1506](https://github.com/paperless-ngx/paperless-ngx/pull/1506)) -- Bump [@angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot](https://github.com/angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot) ([#1505](https://github.com/paperless-ngx/paperless-ngx/pull/1505)) -- Bump zone.js from 0.11.7 to 0.11.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#1504](https://github.com/paperless-ngx/paperless-ngx/pull/1504)) -- Bump ngx-color from 8.0.1 to 8.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1494](https://github.com/paperless-ngx/paperless-ngx/pull/1494)) -- Bump cypress from 10.3.1 to 10.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1496](https://github.com/paperless-ngx/paperless-ngx/pull/1496)) -- Bump [@cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot](https://github.com/cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot) ([#1495](https://github.com/paperless-ngx/paperless-ngx/pull/1495)) -- Bump [@popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot) ([#1498](https://github.com/paperless-ngx/paperless-ngx/pull/1498)) -- Bump sphinx from 5.0.2 to 5.1.1 [@dependabot](https://github.com/dependabot) ([#1297](https://github.com/paperless-ngx/paperless-ngx/pull/1297)) -- Chore: Bump Python dependencies [@stumpylog](https://github.com/stumpylog) ([#1445](https://github.com/paperless-ngx/paperless-ngx/pull/1445)) -- Chore: Update Python deps [@stumpylog](https://github.com/stumpylog) ([#1391](https://github.com/paperless-ngx/paperless-ngx/pull/1391)) -- Bump watchfiles from 0.15.0 to 0.16.1 [@dependabot](https://github.com/dependabot) ([#1285](https://github.com/paperless-ngx/paperless-ngx/pull/1285)) -- Bump leonsteinhaeuser/project-beta-automations from 1.2.1 to 1.3.0 [@dependabot](https://github.com/dependabot) ([#1328](https://github.com/paperless-ngx/paperless-ngx/pull/1328)) -- Bump tj-actions/changed-files from 23.1 to 24 [@dependabot](https://github.com/dependabot) ([#1329](https://github.com/paperless-ngx/paperless-ngx/pull/1329)) -- Bump cypress from 10.3.0 to 10.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1342](https://github.com/paperless-ngx/paperless-ngx/pull/1342)) -- Bump ngx-color from 7.3.3 to 8.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1343](https://github.com/paperless-ngx/paperless-ngx/pull/1343)) -- Bump [@angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot](https://github.com/angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot) ([#1330](https://github.com/paperless-ngx/paperless-ngx/pull/1330)) -- Bump [@types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot](https://github.com/types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot) ([#1341](https://github.com/paperless-ngx/paperless-ngx/pull/1341)) -- Bump jest-preset-angular from 12.1.0 to 12.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1340](https://github.com/paperless-ngx/paperless-ngx/pull/1340)) -- Bump concurrently from 7.2.2 to 7.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1326](https://github.com/paperless-ngx/paperless-ngx/pull/1326)) -- Bump ng2-pdf-viewer from 9.0.0 to 9.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1337](https://github.com/paperless-ngx/paperless-ngx/pull/1337)) -- Bump jest-environment-jsdom from 28.1.2 to 28.1.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1336](https://github.com/paperless-ngx/paperless-ngx/pull/1336)) -- Bump ngx-file-drop from 13.0.0 to 14.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1331](https://github.com/paperless-ngx/paperless-ngx/pull/1331)) -- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#1333](https://github.com/paperless-ngx/paperless-ngx/pull/1333)) -- Bump bootstrap from 5.1.3 to 5.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1327](https://github.com/paperless-ngx/paperless-ngx/pull/1327)) -- Bump typescript from 4.6.4 to 4.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1324](https://github.com/paperless-ngx/paperless-ngx/pull/1324)) -- Bump ts-node from 10.8.1 to 10.9.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1325](https://github.com/paperless-ngx/paperless-ngx/pull/1325)) -- Bump rxjs from 7.5.5 to 7.5.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1323](https://github.com/paperless-ngx/paperless-ngx/pull/1323)) +- Bump pikepdf from 5.5.0 to 5.6.1 [@dependabot](https://github.com/dependabot) ([#1537](https://github.com/paperless-ngx/paperless-ngx/pull/1537)) +- Bump black from 22.6.0 to 22.8.0 [@dependabot](https://github.com/dependabot) ([#1539](https://github.com/paperless-ngx/paperless-ngx/pull/1539)) +- Bump tqdm from 4.64.0 to 4.64.1 [@dependabot](https://github.com/dependabot) ([#1540](https://github.com/paperless-ngx/paperless-ngx/pull/1540)) +- Bump pytest from 7.1.2 to 7.1.3 [@dependabot](https://github.com/dependabot) ([#1538](https://github.com/paperless-ngx/paperless-ngx/pull/1538)) +- Bump tj-actions/changed-files from 24 to 29.0.2 [@dependabot](https://github.com/dependabot) ([#1493](https://github.com/paperless-ngx/paperless-ngx/pull/1493)) +- Bump angular packages, jest-preset-angular in src-ui [@dependabot](https://github.com/dependabot) ([#1502](https://github.com/paperless-ngx/paperless-ngx/pull/1502)) +- Bump jest-environment-jsdom from 28.1.3 to 29.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1507](https://github.com/paperless-ngx/paperless-ngx/pull/1507)) +- Bump [@types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot](https://github.com/types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot) ([#1506](https://github.com/paperless-ngx/paperless-ngx/pull/1506)) +- Bump [@angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot](https://github.com/angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot) ([#1505](https://github.com/paperless-ngx/paperless-ngx/pull/1505)) +- Bump zone.js from 0.11.7 to 0.11.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#1504](https://github.com/paperless-ngx/paperless-ngx/pull/1504)) +- Bump ngx-color from 8.0.1 to 8.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1494](https://github.com/paperless-ngx/paperless-ngx/pull/1494)) +- Bump cypress from 10.3.1 to 10.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1496](https://github.com/paperless-ngx/paperless-ngx/pull/1496)) +- Bump [@cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot](https://github.com/cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot) ([#1495](https://github.com/paperless-ngx/paperless-ngx/pull/1495)) +- Bump [@popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot) ([#1498](https://github.com/paperless-ngx/paperless-ngx/pull/1498)) +- Bump sphinx from 5.0.2 to 5.1.1 [@dependabot](https://github.com/dependabot) ([#1297](https://github.com/paperless-ngx/paperless-ngx/pull/1297)) +- Chore: Bump Python dependencies [@stumpylog](https://github.com/stumpylog) ([#1445](https://github.com/paperless-ngx/paperless-ngx/pull/1445)) +- Chore: Update Python deps [@stumpylog](https://github.com/stumpylog) ([#1391](https://github.com/paperless-ngx/paperless-ngx/pull/1391)) +- Bump watchfiles from 0.15.0 to 0.16.1 [@dependabot](https://github.com/dependabot) ([#1285](https://github.com/paperless-ngx/paperless-ngx/pull/1285)) +- Bump leonsteinhaeuser/project-beta-automations from 1.2.1 to 1.3.0 [@dependabot](https://github.com/dependabot) ([#1328](https://github.com/paperless-ngx/paperless-ngx/pull/1328)) +- Bump tj-actions/changed-files from 23.1 to 24 [@dependabot](https://github.com/dependabot) ([#1329](https://github.com/paperless-ngx/paperless-ngx/pull/1329)) +- Bump cypress from 10.3.0 to 10.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1342](https://github.com/paperless-ngx/paperless-ngx/pull/1342)) +- Bump ngx-color from 7.3.3 to 8.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1343](https://github.com/paperless-ngx/paperless-ngx/pull/1343)) +- Bump [@angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot](https://github.com/angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot) ([#1330](https://github.com/paperless-ngx/paperless-ngx/pull/1330)) +- Bump [@types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot](https://github.com/types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot) ([#1341](https://github.com/paperless-ngx/paperless-ngx/pull/1341)) +- Bump jest-preset-angular from 12.1.0 to 12.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1340](https://github.com/paperless-ngx/paperless-ngx/pull/1340)) +- Bump concurrently from 7.2.2 to 7.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1326](https://github.com/paperless-ngx/paperless-ngx/pull/1326)) +- Bump ng2-pdf-viewer from 9.0.0 to 9.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1337](https://github.com/paperless-ngx/paperless-ngx/pull/1337)) +- Bump jest-environment-jsdom from 28.1.2 to 28.1.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1336](https://github.com/paperless-ngx/paperless-ngx/pull/1336)) +- Bump ngx-file-drop from 13.0.0 to 14.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1331](https://github.com/paperless-ngx/paperless-ngx/pull/1331)) +- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#1333](https://github.com/paperless-ngx/paperless-ngx/pull/1333)) +- Bump bootstrap from 5.1.3 to 5.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1327](https://github.com/paperless-ngx/paperless-ngx/pull/1327)) +- Bump typescript from 4.6.4 to 4.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1324](https://github.com/paperless-ngx/paperless-ngx/pull/1324)) +- Bump ts-node from 10.8.1 to 10.9.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1325](https://github.com/paperless-ngx/paperless-ngx/pull/1325)) +- Bump rxjs from 7.5.5 to 7.5.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1323](https://github.com/paperless-ngx/paperless-ngx/pull/1323))
### All App Changes -- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) -- Feature: Faster, less memory barcode handling [@stumpylog](https://github.com/stumpylog) ([#1594](https://github.com/paperless-ngx/paperless-ngx/pull/1594)) -- Fix: Consume directory permissions were not updated [@stumpylog](https://github.com/stumpylog) ([#1605](https://github.com/paperless-ngx/paperless-ngx/pull/1605)) -- Fix: Double barcode separation creates empty file [@stumpylog](https://github.com/stumpylog) ([#1596](https://github.com/paperless-ngx/paperless-ngx/pull/1596)) -- Fix: Parsing Tika documents fails with AttributeError [@stumpylog](https://github.com/stumpylog) ([#1591](https://github.com/paperless-ngx/paperless-ngx/pull/1591)) -- Fix: Resolve issue with slow classifier [@stumpylog](https://github.com/stumpylog) ([#1576](https://github.com/paperless-ngx/paperless-ngx/pull/1576)) -- Feature: Display django-q process names [@stumpylog](https://github.com/stumpylog) ([#1567](https://github.com/paperless-ngx/paperless-ngx/pull/1567)) -- Fix document comments not updating on document navigation [@shamoon](https://github.com/shamoon) ([#1566](https://github.com/paperless-ngx/paperless-ngx/pull/1566)) -- Feature: Add MariaDB support [@bckelly1](https://github.com/bckelly1) ([#543](https://github.com/paperless-ngx/paperless-ngx/pull/543)) -- Fix: Include storage paths in document exporter [@shamoon](https://github.com/shamoon) ([#1557](https://github.com/paperless-ngx/paperless-ngx/pull/1557)) -- Chore: Cleanup and validate settings [@stumpylog](https://github.com/stumpylog) ([#1551](https://github.com/paperless-ngx/paperless-ngx/pull/1551)) -- Bump pikepdf from 5.5.0 to 5.6.1 [@dependabot](https://github.com/dependabot) ([#1537](https://github.com/paperless-ngx/paperless-ngx/pull/1537)) -- Bump black from 22.6.0 to 22.8.0 [@dependabot](https://github.com/dependabot) ([#1539](https://github.com/paperless-ngx/paperless-ngx/pull/1539)) -- Bump tqdm from 4.64.0 to 4.64.1 [@dependabot](https://github.com/dependabot) ([#1540](https://github.com/paperless-ngx/paperless-ngx/pull/1540)) -- Bump pytest from 7.1.2 to 7.1.3 [@dependabot](https://github.com/dependabot) ([#1538](https://github.com/paperless-ngx/paperless-ngx/pull/1538)) -- Bump angular packages, jest-preset-angular in src-ui [@dependabot](https://github.com/dependabot) ([#1502](https://github.com/paperless-ngx/paperless-ngx/pull/1502)) -- Bump jest-environment-jsdom from 28.1.3 to 29.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1507](https://github.com/paperless-ngx/paperless-ngx/pull/1507)) -- Bump [@types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot](https://github.com/types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot) ([#1506](https://github.com/paperless-ngx/paperless-ngx/pull/1506)) -- Bump [@angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot](https://github.com/angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot) ([#1505](https://github.com/paperless-ngx/paperless-ngx/pull/1505)) -- Bump zone.js from 0.11.7 to 0.11.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#1504](https://github.com/paperless-ngx/paperless-ngx/pull/1504)) -- Bump ngx-color from 8.0.1 to 8.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1494](https://github.com/paperless-ngx/paperless-ngx/pull/1494)) -- Bump cypress from 10.3.1 to 10.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1496](https://github.com/paperless-ngx/paperless-ngx/pull/1496)) -- Bump [@cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot](https://github.com/cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot) ([#1495](https://github.com/paperless-ngx/paperless-ngx/pull/1495)) -- Bump [@popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot) ([#1498](https://github.com/paperless-ngx/paperless-ngx/pull/1498)) -- Feature: Simplify IMAP login for UTF-8 [@stumpylog](https://github.com/stumpylog) ([#1492](https://github.com/paperless-ngx/paperless-ngx/pull/1492)) -- Fix actions button in tasks table [@shamoon](https://github.com/shamoon) ([#1488](https://github.com/paperless-ngx/paperless-ngx/pull/1488)) -- Fix: Add missing filter rule types to SavedViewFilterRule model \& fix migrations [@shamoon](https://github.com/shamoon) ([#1463](https://github.com/paperless-ngx/paperless-ngx/pull/1463)) -- Feature: Even better re-do of OCR [@stumpylog](https://github.com/stumpylog) ([#1451](https://github.com/paperless-ngx/paperless-ngx/pull/1451)) -- Feature: document comments [@tim-vogel](https://github.com/tim-vogel) ([#1375](https://github.com/paperless-ngx/paperless-ngx/pull/1375)) -- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) -- Bump sphinx from 5.0.2 to 5.1.1 [@dependabot](https://github.com/dependabot) ([#1297](https://github.com/paperless-ngx/paperless-ngx/pull/1297)) -- Feature: Event driven consumer [@stumpylog](https://github.com/stumpylog) ([#1421](https://github.com/paperless-ngx/paperless-ngx/pull/1421)) -- Bugfix: Fixes the creation of an archive file, even if noarchive was specified [@stumpylog](https://github.com/stumpylog) ([#1442](https://github.com/paperless-ngx/paperless-ngx/pull/1442)) -- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) -- Feature: Preserve original filename in metadata [@GwynHannay](https://github.com/GwynHannay) ([#1440](https://github.com/paperless-ngx/paperless-ngx/pull/1440)) -- Handle tags for gmail email accounts [@sisao](https://github.com/sisao) ([#1433](https://github.com/paperless-ngx/paperless-ngx/pull/1433)) -- Fix: should not be required [@shamoon](https://github.com/shamoon) ([#1412](https://github.com/paperless-ngx/paperless-ngx/pull/1412)) -- Bugfix: Catch all exceptions during the task signals [@stumpylog](https://github.com/stumpylog) ([#1387](https://github.com/paperless-ngx/paperless-ngx/pull/1387)) -- Fix: saved view page parameter [@shamoon](https://github.com/shamoon) ([#1376](https://github.com/paperless-ngx/paperless-ngx/pull/1376)) -- Fix: Correct browser unsaved changes warning [@shamoon](https://github.com/shamoon) ([#1369](https://github.com/paperless-ngx/paperless-ngx/pull/1369)) -- Fix: correct date pasting with other formats [@shamoon](https://github.com/shamoon) ([#1370](https://github.com/paperless-ngx/paperless-ngx/pull/1370)) -- Chore: use pre-commit in the Ci workflow [@stumpylog](https://github.com/stumpylog) ([#1362](https://github.com/paperless-ngx/paperless-ngx/pull/1362)) -- Bugfix: Chain exceptions during exception handling [@stumpylog](https://github.com/stumpylog) ([#1354](https://github.com/paperless-ngx/paperless-ngx/pull/1354)) -- Bump watchfiles from 0.15.0 to 0.16.1 [@dependabot](https://github.com/dependabot) ([#1285](https://github.com/paperless-ngx/paperless-ngx/pull/1285)) -- Bump cypress from 10.3.0 to 10.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1342](https://github.com/paperless-ngx/paperless-ngx/pull/1342)) -- Bump ngx-color from 7.3.3 to 8.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1343](https://github.com/paperless-ngx/paperless-ngx/pull/1343)) -- Bump [@angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot](https://github.com/angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot) ([#1330](https://github.com/paperless-ngx/paperless-ngx/pull/1330)) -- Bump [@types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot](https://github.com/types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot) ([#1341](https://github.com/paperless-ngx/paperless-ngx/pull/1341)) -- Bump jest-preset-angular from 12.1.0 to 12.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1340](https://github.com/paperless-ngx/paperless-ngx/pull/1340)) -- Bump concurrently from 7.2.2 to 7.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1326](https://github.com/paperless-ngx/paperless-ngx/pull/1326)) -- Bump ng2-pdf-viewer from 9.0.0 to 9.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1337](https://github.com/paperless-ngx/paperless-ngx/pull/1337)) -- Bump jest-environment-jsdom from 28.1.2 to 28.1.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1336](https://github.com/paperless-ngx/paperless-ngx/pull/1336)) -- Bump ngx-file-drop from 13.0.0 to 14.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1331](https://github.com/paperless-ngx/paperless-ngx/pull/1331)) -- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#1333](https://github.com/paperless-ngx/paperless-ngx/pull/1333)) -- Bump bootstrap from 5.1.3 to 5.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1327](https://github.com/paperless-ngx/paperless-ngx/pull/1327)) -- Bump typescript from 4.6.4 to 4.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1324](https://github.com/paperless-ngx/paperless-ngx/pull/1324)) -- Bump ts-node from 10.8.1 to 10.9.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1325](https://github.com/paperless-ngx/paperless-ngx/pull/1325)) -- Bump rxjs from 7.5.5 to 7.5.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1323](https://github.com/paperless-ngx/paperless-ngx/pull/1323)) -- Fix: missing tooltip translation \& filter editor wrapping [@shamoon](https://github.com/shamoon) ([#1305](https://github.com/paperless-ngx/paperless-ngx/pull/1305)) -- Feature: Remove requirements.txt and use pipenv everywhere [@stumpylog](https://github.com/stumpylog) ([#1316](https://github.com/paperless-ngx/paperless-ngx/pull/1316)) -- Bugfix: Interaction between barcode and directories as tags [@stumpylog](https://github.com/stumpylog) ([#1303](https://github.com/paperless-ngx/paperless-ngx/pull/1303)) +- [Beta] Paperless-ngx v1.9.0 Release Candidate [@stumpylog](https://github.com/stumpylog) ([#1560](https://github.com/paperless-ngx/paperless-ngx/pull/1560)) +- Feature: Faster, less memory barcode handling [@stumpylog](https://github.com/stumpylog) ([#1594](https://github.com/paperless-ngx/paperless-ngx/pull/1594)) +- Fix: Consume directory permissions were not updated [@stumpylog](https://github.com/stumpylog) ([#1605](https://github.com/paperless-ngx/paperless-ngx/pull/1605)) +- Fix: Double barcode separation creates empty file [@stumpylog](https://github.com/stumpylog) ([#1596](https://github.com/paperless-ngx/paperless-ngx/pull/1596)) +- Fix: Parsing Tika documents fails with AttributeError [@stumpylog](https://github.com/stumpylog) ([#1591](https://github.com/paperless-ngx/paperless-ngx/pull/1591)) +- Fix: Resolve issue with slow classifier [@stumpylog](https://github.com/stumpylog) ([#1576](https://github.com/paperless-ngx/paperless-ngx/pull/1576)) +- Feature: Display django-q process names [@stumpylog](https://github.com/stumpylog) ([#1567](https://github.com/paperless-ngx/paperless-ngx/pull/1567)) +- Fix document comments not updating on document navigation [@shamoon](https://github.com/shamoon) ([#1566](https://github.com/paperless-ngx/paperless-ngx/pull/1566)) +- Feature: Add MariaDB support [@bckelly1](https://github.com/bckelly1) ([#543](https://github.com/paperless-ngx/paperless-ngx/pull/543)) +- Fix: Include storage paths in document exporter [@shamoon](https://github.com/shamoon) ([#1557](https://github.com/paperless-ngx/paperless-ngx/pull/1557)) +- Chore: Cleanup and validate settings [@stumpylog](https://github.com/stumpylog) ([#1551](https://github.com/paperless-ngx/paperless-ngx/pull/1551)) +- Bump pikepdf from 5.5.0 to 5.6.1 [@dependabot](https://github.com/dependabot) ([#1537](https://github.com/paperless-ngx/paperless-ngx/pull/1537)) +- Bump black from 22.6.0 to 22.8.0 [@dependabot](https://github.com/dependabot) ([#1539](https://github.com/paperless-ngx/paperless-ngx/pull/1539)) +- Bump tqdm from 4.64.0 to 4.64.1 [@dependabot](https://github.com/dependabot) ([#1540](https://github.com/paperless-ngx/paperless-ngx/pull/1540)) +- Bump pytest from 7.1.2 to 7.1.3 [@dependabot](https://github.com/dependabot) ([#1538](https://github.com/paperless-ngx/paperless-ngx/pull/1538)) +- Bump angular packages, jest-preset-angular in src-ui [@dependabot](https://github.com/dependabot) ([#1502](https://github.com/paperless-ngx/paperless-ngx/pull/1502)) +- Bump jest-environment-jsdom from 28.1.3 to 29.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1507](https://github.com/paperless-ngx/paperless-ngx/pull/1507)) +- Bump [@types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot](https://github.com/types/node from 18.6.3 to 18.7.14 in /src-ui @dependabot) ([#1506](https://github.com/paperless-ngx/paperless-ngx/pull/1506)) +- Bump [@angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot](https://github.com/angular-builders/jest from 14.0.0 to 14.0.1 in /src-ui @dependabot) ([#1505](https://github.com/paperless-ngx/paperless-ngx/pull/1505)) +- Bump zone.js from 0.11.7 to 0.11.8 in /src-ui [@dependabot](https://github.com/dependabot) ([#1504](https://github.com/paperless-ngx/paperless-ngx/pull/1504)) +- Bump ngx-color from 8.0.1 to 8.0.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1494](https://github.com/paperless-ngx/paperless-ngx/pull/1494)) +- Bump cypress from 10.3.1 to 10.7.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1496](https://github.com/paperless-ngx/paperless-ngx/pull/1496)) +- Bump [@cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot](https://github.com/cypress/schematic from 2.0.0 to 2.1.1 in /src-ui @dependabot) ([#1495](https://github.com/paperless-ngx/paperless-ngx/pull/1495)) +- Bump [@popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot](https://github.com/popperjs/core from 2.11.5 to 2.11.6 in /src-ui @dependabot) ([#1498](https://github.com/paperless-ngx/paperless-ngx/pull/1498)) +- Feature: Simplify IMAP login for UTF-8 [@stumpylog](https://github.com/stumpylog) ([#1492](https://github.com/paperless-ngx/paperless-ngx/pull/1492)) +- Fix actions button in tasks table [@shamoon](https://github.com/shamoon) ([#1488](https://github.com/paperless-ngx/paperless-ngx/pull/1488)) +- Fix: Add missing filter rule types to SavedViewFilterRule model \& fix migrations [@shamoon](https://github.com/shamoon) ([#1463](https://github.com/paperless-ngx/paperless-ngx/pull/1463)) +- Feature: Even better re-do of OCR [@stumpylog](https://github.com/stumpylog) ([#1451](https://github.com/paperless-ngx/paperless-ngx/pull/1451)) +- Feature: document comments [@tim-vogel](https://github.com/tim-vogel) ([#1375](https://github.com/paperless-ngx/paperless-ngx/pull/1375)) +- Adding date suggestions to the documents details view [@Eckii24](https://github.com/Eckii24) ([#1367](https://github.com/paperless-ngx/paperless-ngx/pull/1367)) +- Bump sphinx from 5.0.2 to 5.1.1 [@dependabot](https://github.com/dependabot) ([#1297](https://github.com/paperless-ngx/paperless-ngx/pull/1297)) +- Feature: Event driven consumer [@stumpylog](https://github.com/stumpylog) ([#1421](https://github.com/paperless-ngx/paperless-ngx/pull/1421)) +- Bugfix: Fixes the creation of an archive file, even if noarchive was specified [@stumpylog](https://github.com/stumpylog) ([#1442](https://github.com/paperless-ngx/paperless-ngx/pull/1442)) +- Feature: Adds storage paths to re-tagger command [@stumpylog](https://github.com/stumpylog) ([#1446](https://github.com/paperless-ngx/paperless-ngx/pull/1446)) +- Feature: Preserve original filename in metadata [@GwynHannay](https://github.com/GwynHannay) ([#1440](https://github.com/paperless-ngx/paperless-ngx/pull/1440)) +- Handle tags for gmail email accounts [@sisao](https://github.com/sisao) ([#1433](https://github.com/paperless-ngx/paperless-ngx/pull/1433)) +- Fix: should not be required [@shamoon](https://github.com/shamoon) ([#1412](https://github.com/paperless-ngx/paperless-ngx/pull/1412)) +- Bugfix: Catch all exceptions during the task signals [@stumpylog](https://github.com/stumpylog) ([#1387](https://github.com/paperless-ngx/paperless-ngx/pull/1387)) +- Fix: saved view page parameter [@shamoon](https://github.com/shamoon) ([#1376](https://github.com/paperless-ngx/paperless-ngx/pull/1376)) +- Fix: Correct browser unsaved changes warning [@shamoon](https://github.com/shamoon) ([#1369](https://github.com/paperless-ngx/paperless-ngx/pull/1369)) +- Fix: correct date pasting with other formats [@shamoon](https://github.com/shamoon) ([#1370](https://github.com/paperless-ngx/paperless-ngx/pull/1370)) +- Chore: use pre-commit in the Ci workflow [@stumpylog](https://github.com/stumpylog) ([#1362](https://github.com/paperless-ngx/paperless-ngx/pull/1362)) +- Bugfix: Chain exceptions during exception handling [@stumpylog](https://github.com/stumpylog) ([#1354](https://github.com/paperless-ngx/paperless-ngx/pull/1354)) +- Bump watchfiles from 0.15.0 to 0.16.1 [@dependabot](https://github.com/dependabot) ([#1285](https://github.com/paperless-ngx/paperless-ngx/pull/1285)) +- Bump cypress from 10.3.0 to 10.3.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1342](https://github.com/paperless-ngx/paperless-ngx/pull/1342)) +- Bump ngx-color from 7.3.3 to 8.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1343](https://github.com/paperless-ngx/paperless-ngx/pull/1343)) +- Bump [@angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot](https://github.com/angular/cli from 14.0.4 to 14.1.0 in /src-ui @dependabot) ([#1330](https://github.com/paperless-ngx/paperless-ngx/pull/1330)) +- Bump [@types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot](https://github.com/types/node from 18.0.0 to 18.6.3 in /src-ui @dependabot) ([#1341](https://github.com/paperless-ngx/paperless-ngx/pull/1341)) +- Bump jest-preset-angular from 12.1.0 to 12.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1340](https://github.com/paperless-ngx/paperless-ngx/pull/1340)) +- Bump concurrently from 7.2.2 to 7.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1326](https://github.com/paperless-ngx/paperless-ngx/pull/1326)) +- Bump ng2-pdf-viewer from 9.0.0 to 9.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1337](https://github.com/paperless-ngx/paperless-ngx/pull/1337)) +- Bump jest-environment-jsdom from 28.1.2 to 28.1.3 in /src-ui [@dependabot](https://github.com/dependabot) ([#1336](https://github.com/paperless-ngx/paperless-ngx/pull/1336)) +- Bump ngx-file-drop from 13.0.0 to 14.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1331](https://github.com/paperless-ngx/paperless-ngx/pull/1331)) +- Bump jest and [@types/jest in /src-ui @dependabot](https://github.com/types/jest in /src-ui @dependabot) ([#1333](https://github.com/paperless-ngx/paperless-ngx/pull/1333)) +- Bump bootstrap from 5.1.3 to 5.2.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1327](https://github.com/paperless-ngx/paperless-ngx/pull/1327)) +- Bump typescript from 4.6.4 to 4.7.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1324](https://github.com/paperless-ngx/paperless-ngx/pull/1324)) +- Bump ts-node from 10.8.1 to 10.9.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1325](https://github.com/paperless-ngx/paperless-ngx/pull/1325)) +- Bump rxjs from 7.5.5 to 7.5.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1323](https://github.com/paperless-ngx/paperless-ngx/pull/1323)) +- Fix: missing tooltip translation \& filter editor wrapping [@shamoon](https://github.com/shamoon) ([#1305](https://github.com/paperless-ngx/paperless-ngx/pull/1305)) +- Feature: Remove requirements.txt and use pipenv everywhere [@stumpylog](https://github.com/stumpylog) ([#1316](https://github.com/paperless-ngx/paperless-ngx/pull/1316)) +- Bugfix: Interaction between barcode and directories as tags [@stumpylog](https://github.com/stumpylog) ([#1303](https://github.com/paperless-ngx/paperless-ngx/pull/1303)) ## paperless-ngx 1.8.0 ### Features -- Feature use env vars in pre post scripts [@ziprandom](https://github.com/ziprandom) ([#1154](https://github.com/paperless-ngx/paperless-ngx/pull/1154)) -- frontend task queue [@shamoon](https://github.com/shamoon) ([#1020](https://github.com/paperless-ngx/paperless-ngx/pull/1020)) -- Fearless scikit-learn updates [@stumpylog](https://github.com/stumpylog) ([#1082](https://github.com/paperless-ngx/paperless-ngx/pull/1082)) -- Adds support for Docker secrets [@stumpylog](https://github.com/stumpylog) ([#1034](https://github.com/paperless-ngx/paperless-ngx/pull/1034)) -- make frontend timezone un-aware [@shamoon](https://github.com/shamoon) ([#957](https://github.com/paperless-ngx/paperless-ngx/pull/957)) -- Change document thumbnails to WebP [@stumpylog](https://github.com/stumpylog) ([#1127](https://github.com/paperless-ngx/paperless-ngx/pull/1127)) -- Fork django-q to update dependencies [@stumpylog](https://github.com/stumpylog) ([#1014](https://github.com/paperless-ngx/paperless-ngx/pull/1014)) -- Fix: Rework query params logic [@shamoon](https://github.com/shamoon) ([#1000](https://github.com/paperless-ngx/paperless-ngx/pull/1000)) -- Enhancement: show note on language change and offer reload [@shamoon](https://github.com/shamoon) ([#1030](https://github.com/paperless-ngx/paperless-ngx/pull/1030)) -- Include error information when Redis connection fails [@stumpylog](https://github.com/stumpylog) ([#1016](https://github.com/paperless-ngx/paperless-ngx/pull/1016)) -- frontend settings saved to database [@shamoon](https://github.com/shamoon) ([#919](https://github.com/paperless-ngx/paperless-ngx/pull/919)) -- Add "Created" as additional (optional) parameter for post_documents [@eingemaischt](https://github.com/eingemaischt) ([#965](https://github.com/paperless-ngx/paperless-ngx/pull/965)) -- Convert Changelog to markdown, auto-commit future changelogs [@qcasey](https://github.com/qcasey) ([#935](https://github.com/paperless-ngx/paperless-ngx/pull/935)) -- allow all ASN filtering functions [@shamoon](https://github.com/shamoon) ([#920](https://github.com/paperless-ngx/paperless-ngx/pull/920)) -- gunicorn: Allow IPv6 sockets [@vlcty](https://github.com/vlcty) ([#924](https://github.com/paperless-ngx/paperless-ngx/pull/924)) -- initial app loading indicators [@shamoon](https://github.com/shamoon) ([#899](https://github.com/paperless-ngx/paperless-ngx/pull/899)) +- Feature use env vars in pre post scripts [@ziprandom](https://github.com/ziprandom) ([#1154](https://github.com/paperless-ngx/paperless-ngx/pull/1154)) +- frontend task queue [@shamoon](https://github.com/shamoon) ([#1020](https://github.com/paperless-ngx/paperless-ngx/pull/1020)) +- Fearless scikit-learn updates [@stumpylog](https://github.com/stumpylog) ([#1082](https://github.com/paperless-ngx/paperless-ngx/pull/1082)) +- Adds support for Docker secrets [@stumpylog](https://github.com/stumpylog) ([#1034](https://github.com/paperless-ngx/paperless-ngx/pull/1034)) +- make frontend timezone un-aware [@shamoon](https://github.com/shamoon) ([#957](https://github.com/paperless-ngx/paperless-ngx/pull/957)) +- Change document thumbnails to WebP [@stumpylog](https://github.com/stumpylog) ([#1127](https://github.com/paperless-ngx/paperless-ngx/pull/1127)) +- Fork django-q to update dependencies [@stumpylog](https://github.com/stumpylog) ([#1014](https://github.com/paperless-ngx/paperless-ngx/pull/1014)) +- Fix: Rework query params logic [@shamoon](https://github.com/shamoon) ([#1000](https://github.com/paperless-ngx/paperless-ngx/pull/1000)) +- Enhancement: show note on language change and offer reload [@shamoon](https://github.com/shamoon) ([#1030](https://github.com/paperless-ngx/paperless-ngx/pull/1030)) +- Include error information when Redis connection fails [@stumpylog](https://github.com/stumpylog) ([#1016](https://github.com/paperless-ngx/paperless-ngx/pull/1016)) +- frontend settings saved to database [@shamoon](https://github.com/shamoon) ([#919](https://github.com/paperless-ngx/paperless-ngx/pull/919)) +- Add "Created" as additional (optional) parameter for post_documents [@eingemaischt](https://github.com/eingemaischt) ([#965](https://github.com/paperless-ngx/paperless-ngx/pull/965)) +- Convert Changelog to markdown, auto-commit future changelogs [@qcasey](https://github.com/qcasey) ([#935](https://github.com/paperless-ngx/paperless-ngx/pull/935)) +- allow all ASN filtering functions [@shamoon](https://github.com/shamoon) ([#920](https://github.com/paperless-ngx/paperless-ngx/pull/920)) +- gunicorn: Allow IPv6 sockets [@vlcty](https://github.com/vlcty) ([#924](https://github.com/paperless-ngx/paperless-ngx/pull/924)) +- initial app loading indicators [@shamoon](https://github.com/shamoon) ([#899](https://github.com/paperless-ngx/paperless-ngx/pull/899)) ### Bug Fixes -- Fix: dropdown selected items not visible again [@shamoon](https://github.com/shamoon) ([#1261](https://github.com/paperless-ngx/paperless-ngx/pull/1261)) -- [CI] Fix automatic changelog generation on release [@qcasey](https://github.com/qcasey) ([#1249](https://github.com/paperless-ngx/paperless-ngx/pull/1249)) -- Fix: Prevent duplicate api calls on text filtering [@shamoon](https://github.com/shamoon) ([#1133](https://github.com/paperless-ngx/paperless-ngx/pull/1133)) -- make frontend timezone un-aware [@shamoon](https://github.com/shamoon) ([#957](https://github.com/paperless-ngx/paperless-ngx/pull/957)) -- Feature / fix quick toggleable filters [@shamoon](https://github.com/shamoon) ([#1122](https://github.com/paperless-ngx/paperless-ngx/pull/1122)) -- Chore: Manually downgrade reportlab (and update everything else) [@stumpylog](https://github.com/stumpylog) ([#1116](https://github.com/paperless-ngx/paperless-ngx/pull/1116)) -- Bugfix: Don't assume default Docker folders [@stumpylog](https://github.com/stumpylog) ([#1088](https://github.com/paperless-ngx/paperless-ngx/pull/1088)) -- Bugfix: Better sanity check messages [@stumpylog](https://github.com/stumpylog) ([#1049](https://github.com/paperless-ngx/paperless-ngx/pull/1049)) -- Fix vertical margins between pages of pdf viewer [@shamoon](https://github.com/shamoon) ([#1081](https://github.com/paperless-ngx/paperless-ngx/pull/1081)) -- Bugfix: Pass debug setting on to django-q [@stumpylog](https://github.com/stumpylog) ([#1058](https://github.com/paperless-ngx/paperless-ngx/pull/1058)) -- Bugfix: Don't assume the document has a title set [@stumpylog](https://github.com/stumpylog) ([#1057](https://github.com/paperless-ngx/paperless-ngx/pull/1057)) -- Bugfix: Corrects the setting of max pixel size for OCR [@stumpylog](https://github.com/stumpylog) ([#1008](https://github.com/paperless-ngx/paperless-ngx/pull/1008)) -- better date pasting [@shamoon](https://github.com/shamoon) ([#1007](https://github.com/paperless-ngx/paperless-ngx/pull/1007)) -- Enhancement: Alphabetize tags by default [@shamoon](https://github.com/shamoon) ([#1017](https://github.com/paperless-ngx/paperless-ngx/pull/1017)) -- Fix: Rework query params logic [@shamoon](https://github.com/shamoon) ([#1000](https://github.com/paperless-ngx/paperless-ngx/pull/1000)) -- Fix: add translation for some un-translated tooltips [@shamoon](https://github.com/shamoon) ([#995](https://github.com/paperless-ngx/paperless-ngx/pull/995)) -- Change npm --no-optional to --omit=optional [@shamoon](https://github.com/shamoon) ([#986](https://github.com/paperless-ngx/paperless-ngx/pull/986)) -- Add `myst-parser` to fix readthedocs [@qcasey](https://github.com/qcasey) ([#982](https://github.com/paperless-ngx/paperless-ngx/pull/982)) -- Fix: Title is changed after switching doc quickly [@shamoon](https://github.com/shamoon) ([#979](https://github.com/paperless-ngx/paperless-ngx/pull/979)) -- Fix: warn when closing a document with unsaved changes due to max open docs [@shamoon](https://github.com/shamoon) ([#956](https://github.com/paperless-ngx/paperless-ngx/pull/956)) -- Bugfix: Adds configurable intoify debounce time [@stumpylog](https://github.com/stumpylog) ([#953](https://github.com/paperless-ngx/paperless-ngx/pull/953)) -- Bugfix: Fixes document filename date off by 1 issue [@stumpylog](https://github.com/stumpylog) ([#942](https://github.com/paperless-ngx/paperless-ngx/pull/942)) -- fixes #949: change to MIME detection for files [@gador](https://github.com/gador) ([#962](https://github.com/paperless-ngx/paperless-ngx/pull/962)) -- docs: fix some typos [@Berjou](https://github.com/Berjou) ([#948](https://github.com/paperless-ngx/paperless-ngx/pull/948)) -- [Docs] Fix 2 small typos [@tooomm](https://github.com/tooomm) ([#946](https://github.com/paperless-ngx/paperless-ngx/pull/946)) -- [Readme] Fix typo [@tooomm](https://github.com/tooomm) ([#941](https://github.com/paperless-ngx/paperless-ngx/pull/941)) -- Fix: management pages plurals incorrect in other languages [@shamoon](https://github.com/shamoon) ([#939](https://github.com/paperless-ngx/paperless-ngx/pull/939)) -- Fix: v1.7.1 frontend visual fixes [@shamoon](https://github.com/shamoon) ([#933](https://github.com/paperless-ngx/paperless-ngx/pull/933)) -- Fix: unassigned query params ignored [@shamoon](https://github.com/shamoon) ([#930](https://github.com/paperless-ngx/paperless-ngx/pull/930)) -- Fix: allow commas in non-multi rules query params [@shamoon](https://github.com/shamoon) ([#923](https://github.com/paperless-ngx/paperless-ngx/pull/923)) -- Fix: Include version in export for better error messages [@stumpylog](https://github.com/stumpylog) ([#883](https://github.com/paperless-ngx/paperless-ngx/pull/883)) -- Bugfix: Superuser Management Won't Reset Password [@stumpylog](https://github.com/stumpylog) ([#903](https://github.com/paperless-ngx/paperless-ngx/pull/903)) -- Fix Ignore Date Parsing [@stumpylog](https://github.com/stumpylog) ([#721](https://github.com/paperless-ngx/paperless-ngx/pull/721)) +- Fix: dropdown selected items not visible again [@shamoon](https://github.com/shamoon) ([#1261](https://github.com/paperless-ngx/paperless-ngx/pull/1261)) +- [CI] Fix automatic changelog generation on release [@qcasey](https://github.com/qcasey) ([#1249](https://github.com/paperless-ngx/paperless-ngx/pull/1249)) +- Fix: Prevent duplicate api calls on text filtering [@shamoon](https://github.com/shamoon) ([#1133](https://github.com/paperless-ngx/paperless-ngx/pull/1133)) +- make frontend timezone un-aware [@shamoon](https://github.com/shamoon) ([#957](https://github.com/paperless-ngx/paperless-ngx/pull/957)) +- Feature / fix quick toggleable filters [@shamoon](https://github.com/shamoon) ([#1122](https://github.com/paperless-ngx/paperless-ngx/pull/1122)) +- Chore: Manually downgrade reportlab (and update everything else) [@stumpylog](https://github.com/stumpylog) ([#1116](https://github.com/paperless-ngx/paperless-ngx/pull/1116)) +- Bugfix: Don't assume default Docker folders [@stumpylog](https://github.com/stumpylog) ([#1088](https://github.com/paperless-ngx/paperless-ngx/pull/1088)) +- Bugfix: Better sanity check messages [@stumpylog](https://github.com/stumpylog) ([#1049](https://github.com/paperless-ngx/paperless-ngx/pull/1049)) +- Fix vertical margins between pages of pdf viewer [@shamoon](https://github.com/shamoon) ([#1081](https://github.com/paperless-ngx/paperless-ngx/pull/1081)) +- Bugfix: Pass debug setting on to django-q [@stumpylog](https://github.com/stumpylog) ([#1058](https://github.com/paperless-ngx/paperless-ngx/pull/1058)) +- Bugfix: Don't assume the document has a title set [@stumpylog](https://github.com/stumpylog) ([#1057](https://github.com/paperless-ngx/paperless-ngx/pull/1057)) +- Bugfix: Corrects the setting of max pixel size for OCR [@stumpylog](https://github.com/stumpylog) ([#1008](https://github.com/paperless-ngx/paperless-ngx/pull/1008)) +- better date pasting [@shamoon](https://github.com/shamoon) ([#1007](https://github.com/paperless-ngx/paperless-ngx/pull/1007)) +- Enhancement: Alphabetize tags by default [@shamoon](https://github.com/shamoon) ([#1017](https://github.com/paperless-ngx/paperless-ngx/pull/1017)) +- Fix: Rework query params logic [@shamoon](https://github.com/shamoon) ([#1000](https://github.com/paperless-ngx/paperless-ngx/pull/1000)) +- Fix: add translation for some un-translated tooltips [@shamoon](https://github.com/shamoon) ([#995](https://github.com/paperless-ngx/paperless-ngx/pull/995)) +- Change npm --no-optional to --omit=optional [@shamoon](https://github.com/shamoon) ([#986](https://github.com/paperless-ngx/paperless-ngx/pull/986)) +- Add `myst-parser` to fix readthedocs [@qcasey](https://github.com/qcasey) ([#982](https://github.com/paperless-ngx/paperless-ngx/pull/982)) +- Fix: Title is changed after switching doc quickly [@shamoon](https://github.com/shamoon) ([#979](https://github.com/paperless-ngx/paperless-ngx/pull/979)) +- Fix: warn when closing a document with unsaved changes due to max open docs [@shamoon](https://github.com/shamoon) ([#956](https://github.com/paperless-ngx/paperless-ngx/pull/956)) +- Bugfix: Adds configurable intoify debounce time [@stumpylog](https://github.com/stumpylog) ([#953](https://github.com/paperless-ngx/paperless-ngx/pull/953)) +- Bugfix: Fixes document filename date off by 1 issue [@stumpylog](https://github.com/stumpylog) ([#942](https://github.com/paperless-ngx/paperless-ngx/pull/942)) +- fixes #949: change to MIME detection for files [@gador](https://github.com/gador) ([#962](https://github.com/paperless-ngx/paperless-ngx/pull/962)) +- docs: fix some typos [@Berjou](https://github.com/Berjou) ([#948](https://github.com/paperless-ngx/paperless-ngx/pull/948)) +- [Docs] Fix 2 small typos [@tooomm](https://github.com/tooomm) ([#946](https://github.com/paperless-ngx/paperless-ngx/pull/946)) +- [Readme] Fix typo [@tooomm](https://github.com/tooomm) ([#941](https://github.com/paperless-ngx/paperless-ngx/pull/941)) +- Fix: management pages plurals incorrect in other languages [@shamoon](https://github.com/shamoon) ([#939](https://github.com/paperless-ngx/paperless-ngx/pull/939)) +- Fix: v1.7.1 frontend visual fixes [@shamoon](https://github.com/shamoon) ([#933](https://github.com/paperless-ngx/paperless-ngx/pull/933)) +- Fix: unassigned query params ignored [@shamoon](https://github.com/shamoon) ([#930](https://github.com/paperless-ngx/paperless-ngx/pull/930)) +- Fix: allow commas in non-multi rules query params [@shamoon](https://github.com/shamoon) ([#923](https://github.com/paperless-ngx/paperless-ngx/pull/923)) +- Fix: Include version in export for better error messages [@stumpylog](https://github.com/stumpylog) ([#883](https://github.com/paperless-ngx/paperless-ngx/pull/883)) +- Bugfix: Superuser Management Won't Reset Password [@stumpylog](https://github.com/stumpylog) ([#903](https://github.com/paperless-ngx/paperless-ngx/pull/903)) +- Fix Ignore Date Parsing [@stumpylog](https://github.com/stumpylog) ([#721](https://github.com/paperless-ngx/paperless-ngx/pull/721)) ### Documentation -- Feature use env vars in pre post scripts [@ziprandom](https://github.com/ziprandom) ([#1154](https://github.com/paperless-ngx/paperless-ngx/pull/1154)) -- Add `myst-parser` to fix readthedocs [@qcasey](https://github.com/qcasey) ([#982](https://github.com/paperless-ngx/paperless-ngx/pull/982)) -- Add "Created" as additional (optional) parameter for post_documents [@eingemaischt](https://github.com/eingemaischt) ([#965](https://github.com/paperless-ngx/paperless-ngx/pull/965)) -- Bugfix: Adds configurable intoify debounce time [@stumpylog](https://github.com/stumpylog) ([#953](https://github.com/paperless-ngx/paperless-ngx/pull/953)) -- docs: fix some typos [@Berjou](https://github.com/Berjou) ([#948](https://github.com/paperless-ngx/paperless-ngx/pull/948)) -- [Docs] Fix 2 small typos [@tooomm](https://github.com/tooomm) ([#946](https://github.com/paperless-ngx/paperless-ngx/pull/946)) -- Convert Changelog to markdown, auto-commit future changelogs [@qcasey](https://github.com/qcasey) ([#935](https://github.com/paperless-ngx/paperless-ngx/pull/935)) -- [Readme] Fix typo [@tooomm](https://github.com/tooomm) ([#941](https://github.com/paperless-ngx/paperless-ngx/pull/941)) +- Feature use env vars in pre post scripts [@ziprandom](https://github.com/ziprandom) ([#1154](https://github.com/paperless-ngx/paperless-ngx/pull/1154)) +- Add `myst-parser` to fix readthedocs [@qcasey](https://github.com/qcasey) ([#982](https://github.com/paperless-ngx/paperless-ngx/pull/982)) +- Add "Created" as additional (optional) parameter for post_documents [@eingemaischt](https://github.com/eingemaischt) ([#965](https://github.com/paperless-ngx/paperless-ngx/pull/965)) +- Bugfix: Adds configurable intoify debounce time [@stumpylog](https://github.com/stumpylog) ([#953](https://github.com/paperless-ngx/paperless-ngx/pull/953)) +- docs: fix some typos [@Berjou](https://github.com/Berjou) ([#948](https://github.com/paperless-ngx/paperless-ngx/pull/948)) +- [Docs] Fix 2 small typos [@tooomm](https://github.com/tooomm) ([#946](https://github.com/paperless-ngx/paperless-ngx/pull/946)) +- Convert Changelog to markdown, auto-commit future changelogs [@qcasey](https://github.com/qcasey) ([#935](https://github.com/paperless-ngx/paperless-ngx/pull/935)) +- [Readme] Fix typo [@tooomm](https://github.com/tooomm) ([#941](https://github.com/paperless-ngx/paperless-ngx/pull/941)) ### Maintenance -- Adds support for Docker secrets [@stumpylog](https://github.com/stumpylog) ([#1034](https://github.com/paperless-ngx/paperless-ngx/pull/1034)) -- Bugfix: Don't assume default Docker folders [@stumpylog](https://github.com/stumpylog) ([#1088](https://github.com/paperless-ngx/paperless-ngx/pull/1088)) -- Include error information when Redis connection fails [@stumpylog](https://github.com/stumpylog) ([#1016](https://github.com/paperless-ngx/paperless-ngx/pull/1016)) -- Fix: add translation for some un-translated tooltips [@shamoon](https://github.com/shamoon) ([#995](https://github.com/paperless-ngx/paperless-ngx/pull/995)) -- gunicorn: Allow IPv6 sockets [@vlcty](https://github.com/vlcty) ([#924](https://github.com/paperless-ngx/paperless-ngx/pull/924)) +- Adds support for Docker secrets [@stumpylog](https://github.com/stumpylog) ([#1034](https://github.com/paperless-ngx/paperless-ngx/pull/1034)) +- Bugfix: Don't assume default Docker folders [@stumpylog](https://github.com/stumpylog) ([#1088](https://github.com/paperless-ngx/paperless-ngx/pull/1088)) +- Include error information when Redis connection fails [@stumpylog](https://github.com/stumpylog) ([#1016](https://github.com/paperless-ngx/paperless-ngx/pull/1016)) +- Fix: add translation for some un-translated tooltips [@shamoon](https://github.com/shamoon) ([#995](https://github.com/paperless-ngx/paperless-ngx/pull/995)) +- gunicorn: Allow IPv6 sockets [@vlcty](https://github.com/vlcty) ([#924](https://github.com/paperless-ngx/paperless-ngx/pull/924)) ### Dependencies
34 changes -- Fearless scikit-learn updates [@stumpylog](https://github.com/stumpylog) ([#1082](https://github.com/paperless-ngx/paperless-ngx/pull/1082)) -- Bump pillow from 9.1.1 to 9.2.0 [@dependabot](https://github.com/dependabot) ([#1193](https://github.com/paperless-ngx/paperless-ngx/pull/1193)) -- Bump watchdog from 2.1.8 to 2.1.9 [@dependabot](https://github.com/dependabot) ([#1132](https://github.com/paperless-ngx/paperless-ngx/pull/1132)) -- Bump scikit-learn from 1.0.2 to 1.1.1 [@dependabot](https://github.com/dependabot) ([#992](https://github.com/paperless-ngx/paperless-ngx/pull/992)) -- Bump setuptools from 62.3.3 to 62.6.0 [@dependabot](https://github.com/dependabot) ([#1150](https://github.com/paperless-ngx/paperless-ngx/pull/1150)) -- Bump django-filter from 21.1 to 22.1 [@dependabot](https://github.com/dependabot) ([#1191](https://github.com/paperless-ngx/paperless-ngx/pull/1191)) -- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1176](https://github.com/paperless-ngx/paperless-ngx/pull/1176)) -- Bump sphinx from 4.5.0 to 5.0.2 [@dependabot](https://github.com/dependabot) ([#1151](https://github.com/paperless-ngx/paperless-ngx/pull/1151)) -- Bump docker/metadata-action from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1178](https://github.com/paperless-ngx/paperless-ngx/pull/1178)) -- Bump tj-actions/changed-files from 22.1 to 23.1 [@dependabot](https://github.com/dependabot) ([#1179](https://github.com/paperless-ngx/paperless-ngx/pull/1179)) -- Bump @angular/cli from 13.3.7 to 14.0.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1177](https://github.com/paperless-ngx/paperless-ngx/pull/1177)) -- Bump cypress from 10.0.1 to 10.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1187](https://github.com/paperless-ngx/paperless-ngx/pull/1187)) -- Bump zone.js from 0.11.5 to 0.11.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1185](https://github.com/paperless-ngx/paperless-ngx/pull/1185)) -- Bump ts-node from 10.8.0 to 10.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1184](https://github.com/paperless-ngx/paperless-ngx/pull/1184)) -- Bump jest-environment-jsdom from 28.1.0 to 28.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1175](https://github.com/paperless-ngx/paperless-ngx/pull/1175)) -- Bump @types/node from 17.0.38 to 18.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1183](https://github.com/paperless-ngx/paperless-ngx/pull/1183)) -- Bump concurrently from 7.2.1 to 7.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1181](https://github.com/paperless-ngx/paperless-ngx/pull/1181)) -- Bump jest-preset-angular from 12.0.1 to 12.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1182](https://github.com/paperless-ngx/paperless-ngx/pull/1182)) -- Bump jest and @types/jest in /src-ui [@dependabot](https://github.com/dependabot) ([#1180](https://github.com/paperless-ngx/paperless-ngx/pull/1180)) -- Bump whitenoise from 6.1.0 to 6.2.0 [@dependabot](https://github.com/dependabot) ([#1103](https://github.com/paperless-ngx/paperless-ngx/pull/1103)) -- Bump cypress from 9.6.1 to 10.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1083](https://github.com/paperless-ngx/paperless-ngx/pull/1083)) -- Bump docker/setup-qemu-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1065](https://github.com/paperless-ngx/paperless-ngx/pull/1065)) -- Bump docker/setup-buildx-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1064](https://github.com/paperless-ngx/paperless-ngx/pull/1064)) -- Bump docker/build-push-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1063](https://github.com/paperless-ngx/paperless-ngx/pull/1063)) -- Bump @cypress/schematic from 1.7.0 to 2.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1075](https://github.com/paperless-ngx/paperless-ngx/pull/1075)) -- Bump tj-actions/changed-files from 19 to 22.1 [@dependabot](https://github.com/dependabot) ([#1062](https://github.com/paperless-ngx/paperless-ngx/pull/1062)) -- Bump concurrently from 7.1.0 to 7.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1073](https://github.com/paperless-ngx/paperless-ngx/pull/1073)) -- Bump @types/jest from 27.4.1 to 27.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1074](https://github.com/paperless-ngx/paperless-ngx/pull/1074)) -- Bump ts-node from 10.7.0 to 10.8.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1070](https://github.com/paperless-ngx/paperless-ngx/pull/1070)) -- Bump jest from 28.0.3 to 28.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1071](https://github.com/paperless-ngx/paperless-ngx/pull/1071)) -- Chore: npm package updates 22-06-01 [@shamoon](https://github.com/shamoon) ([#1069](https://github.com/paperless-ngx/paperless-ngx/pull/1069)) -- Bump docker/login-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1061](https://github.com/paperless-ngx/paperless-ngx/pull/1061)) -- Chore: Manually update dependencies [@stumpylog](https://github.com/stumpylog) ([#1013](https://github.com/paperless-ngx/paperless-ngx/pull/1013)) -- Chore: Manually update all Python dependencies [@stumpylog](https://github.com/stumpylog) ([#973](https://github.com/paperless-ngx/paperless-ngx/pull/973)) +- Fearless scikit-learn updates [@stumpylog](https://github.com/stumpylog) ([#1082](https://github.com/paperless-ngx/paperless-ngx/pull/1082)) +- Bump pillow from 9.1.1 to 9.2.0 [@dependabot](https://github.com/dependabot) ([#1193](https://github.com/paperless-ngx/paperless-ngx/pull/1193)) +- Bump watchdog from 2.1.8 to 2.1.9 [@dependabot](https://github.com/dependabot) ([#1132](https://github.com/paperless-ngx/paperless-ngx/pull/1132)) +- Bump scikit-learn from 1.0.2 to 1.1.1 [@dependabot](https://github.com/dependabot) ([#992](https://github.com/paperless-ngx/paperless-ngx/pull/992)) +- Bump setuptools from 62.3.3 to 62.6.0 [@dependabot](https://github.com/dependabot) ([#1150](https://github.com/paperless-ngx/paperless-ngx/pull/1150)) +- Bump django-filter from 21.1 to 22.1 [@dependabot](https://github.com/dependabot) ([#1191](https://github.com/paperless-ngx/paperless-ngx/pull/1191)) +- Bump actions/setup-python from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1176](https://github.com/paperless-ngx/paperless-ngx/pull/1176)) +- Bump sphinx from 4.5.0 to 5.0.2 [@dependabot](https://github.com/dependabot) ([#1151](https://github.com/paperless-ngx/paperless-ngx/pull/1151)) +- Bump docker/metadata-action from 3 to 4 [@dependabot](https://github.com/dependabot) ([#1178](https://github.com/paperless-ngx/paperless-ngx/pull/1178)) +- Bump tj-actions/changed-files from 22.1 to 23.1 [@dependabot](https://github.com/dependabot) ([#1179](https://github.com/paperless-ngx/paperless-ngx/pull/1179)) +- Bump @angular/cli from 13.3.7 to 14.0.4 in /src-ui [@dependabot](https://github.com/dependabot) ([#1177](https://github.com/paperless-ngx/paperless-ngx/pull/1177)) +- Bump cypress from 10.0.1 to 10.3.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1187](https://github.com/paperless-ngx/paperless-ngx/pull/1187)) +- Bump zone.js from 0.11.5 to 0.11.6 in /src-ui [@dependabot](https://github.com/dependabot) ([#1185](https://github.com/paperless-ngx/paperless-ngx/pull/1185)) +- Bump ts-node from 10.8.0 to 10.8.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1184](https://github.com/paperless-ngx/paperless-ngx/pull/1184)) +- Bump jest-environment-jsdom from 28.1.0 to 28.1.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1175](https://github.com/paperless-ngx/paperless-ngx/pull/1175)) +- Bump @types/node from 17.0.38 to 18.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1183](https://github.com/paperless-ngx/paperless-ngx/pull/1183)) +- Bump concurrently from 7.2.1 to 7.2.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1181](https://github.com/paperless-ngx/paperless-ngx/pull/1181)) +- Bump jest-preset-angular from 12.0.1 to 12.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1182](https://github.com/paperless-ngx/paperless-ngx/pull/1182)) +- Bump jest and @types/jest in /src-ui [@dependabot](https://github.com/dependabot) ([#1180](https://github.com/paperless-ngx/paperless-ngx/pull/1180)) +- Bump whitenoise from 6.1.0 to 6.2.0 [@dependabot](https://github.com/dependabot) ([#1103](https://github.com/paperless-ngx/paperless-ngx/pull/1103)) +- Bump cypress from 9.6.1 to 10.0.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1083](https://github.com/paperless-ngx/paperless-ngx/pull/1083)) +- Bump docker/setup-qemu-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1065](https://github.com/paperless-ngx/paperless-ngx/pull/1065)) +- Bump docker/setup-buildx-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1064](https://github.com/paperless-ngx/paperless-ngx/pull/1064)) +- Bump docker/build-push-action from 2 to 3 [@dependabot](https://github.com/dependabot) ([#1063](https://github.com/paperless-ngx/paperless-ngx/pull/1063)) +- Bump @cypress/schematic from 1.7.0 to 2.0.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1075](https://github.com/paperless-ngx/paperless-ngx/pull/1075)) +- Bump tj-actions/changed-files from 19 to 22.1 [@dependabot](https://github.com/dependabot) ([#1062](https://github.com/paperless-ngx/paperless-ngx/pull/1062)) +- Bump concurrently from 7.1.0 to 7.2.1 in /src-ui [@dependabot](https://github.com/dependabot) ([#1073](https://github.com/paperless-ngx/paperless-ngx/pull/1073)) +- Bump @types/jest from 27.4.1 to 27.5.2 in /src-ui [@dependabot](https://github.com/dependabot) ([#1074](https://github.com/paperless-ngx/paperless-ngx/pull/1074)) +- Bump ts-node from 10.7.0 to 10.8.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1070](https://github.com/paperless-ngx/paperless-ngx/pull/1070)) +- Bump jest from 28.0.3 to 28.1.0 in /src-ui [@dependabot](https://github.com/dependabot) ([#1071](https://github.com/paperless-ngx/paperless-ngx/pull/1071)) +- Chore: npm package updates 22-06-01 [@shamoon](https://github.com/shamoon) ([#1069](https://github.com/paperless-ngx/paperless-ngx/pull/1069)) +- Bump docker/login-action from 1 to 2 [@dependabot](https://github.com/dependabot) ([#1061](https://github.com/paperless-ngx/paperless-ngx/pull/1061)) +- Chore: Manually update dependencies [@stumpylog](https://github.com/stumpylog) ([#1013](https://github.com/paperless-ngx/paperless-ngx/pull/1013)) +- Chore: Manually update all Python dependencies [@stumpylog](https://github.com/stumpylog) ([#973](https://github.com/paperless-ngx/paperless-ngx/pull/973))
## paperless-ngx 1.7.1 ### Features -- (chore) Runs pyupgrade to Python 3.8+ [@stumpylog](https://github.com/stumpylog) ([#890](https://github.com/paperless-ngx/paperless-ngx/pull/890)) -- Dockerfile Organization \& Enhancements [@stumpylog](https://github.com/stumpylog) ([#888](https://github.com/paperless-ngx/paperless-ngx/pull/888)) -- mobile friendlier manage pages [@shamoon](https://github.com/shamoon) ([#873](https://github.com/paperless-ngx/paperless-ngx/pull/873)) -- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) -- Enable Docker Hub push [@stumpylog](https://github.com/stumpylog) ([#828](https://github.com/paperless-ngx/paperless-ngx/pull/828)) -- Feature barcode tiff support [@gador](https://github.com/gador) ([#766](https://github.com/paperless-ngx/paperless-ngx/pull/766)) -- Updates GHA workflow to rebuild intermediate images on changes [@stumpylog](https://github.com/stumpylog) ([#820](https://github.com/paperless-ngx/paperless-ngx/pull/820)) -- Adds simple Python to wait for Redis broker to be ready [@stumpylog](https://github.com/stumpylog) ([#788](https://github.com/paperless-ngx/paperless-ngx/pull/788)) -- Update GHA workflow to build all Docker images [@stumpylog](https://github.com/stumpylog) ([#761](https://github.com/paperless-ngx/paperless-ngx/pull/761)) +- (chore) Runs pyupgrade to Python 3.8+ [@stumpylog](https://github.com/stumpylog) ([#890](https://github.com/paperless-ngx/paperless-ngx/pull/890)) +- Dockerfile Organization \& Enhancements [@stumpylog](https://github.com/stumpylog) ([#888](https://github.com/paperless-ngx/paperless-ngx/pull/888)) +- mobile friendlier manage pages [@shamoon](https://github.com/shamoon) ([#873](https://github.com/paperless-ngx/paperless-ngx/pull/873)) +- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) +- Enable Docker Hub push [@stumpylog](https://github.com/stumpylog) ([#828](https://github.com/paperless-ngx/paperless-ngx/pull/828)) +- Feature barcode tiff support [@gador](https://github.com/gador) ([#766](https://github.com/paperless-ngx/paperless-ngx/pull/766)) +- Updates GHA workflow to rebuild intermediate images on changes [@stumpylog](https://github.com/stumpylog) ([#820](https://github.com/paperless-ngx/paperless-ngx/pull/820)) +- Adds simple Python to wait for Redis broker to be ready [@stumpylog](https://github.com/stumpylog) ([#788](https://github.com/paperless-ngx/paperless-ngx/pull/788)) +- Update GHA workflow to build all Docker images [@stumpylog](https://github.com/stumpylog) ([#761](https://github.com/paperless-ngx/paperless-ngx/pull/761)) ### Bug Fixes -- Feature / fix saved view \& sort field query params [@shamoon](https://github.com/shamoon) ([#881](https://github.com/paperless-ngx/paperless-ngx/pull/881)) -- Mobile friendlier manage pages [@shamoon](https://github.com/shamoon) ([#873](https://github.com/paperless-ngx/paperless-ngx/pull/873)) -- Add timeout to healthcheck [@shamoon](https://github.com/shamoon) ([#880](https://github.com/paperless-ngx/paperless-ngx/pull/880)) -- Always accept yyyy-mm-dd date inputs [@shamoon](https://github.com/shamoon) ([#864](https://github.com/paperless-ngx/paperless-ngx/pull/864)) -- Fix local Docker image building [@stumpylog](https://github.com/stumpylog) ([#849](https://github.com/paperless-ngx/paperless-ngx/pull/849)) -- Fix: show errors on invalid date input [@shamoon](https://github.com/shamoon) ([#862](https://github.com/paperless-ngx/paperless-ngx/pull/862)) -- Fix: Older dates do not display on frontend [@shamoon](https://github.com/shamoon) ([#852](https://github.com/paperless-ngx/paperless-ngx/pull/852)) -- Fixes IMAP UTF8 Authentication [@stumpylog](https://github.com/stumpylog) ([#725](https://github.com/paperless-ngx/paperless-ngx/pull/725)) -- Fix password field remains visible [@shamoon](https://github.com/shamoon) ([#840](https://github.com/paperless-ngx/paperless-ngx/pull/840)) -- Fixes Pillow build for armv7 [@stumpylog](https://github.com/stumpylog) ([#815](https://github.com/paperless-ngx/paperless-ngx/pull/815)) -- Update frontend localization source file [@shamoon](https://github.com/shamoon) ([#814](https://github.com/paperless-ngx/paperless-ngx/pull/814)) -- Fix install script extra OCR languages format [@stumpylog](https://github.com/stumpylog) ([#777](https://github.com/paperless-ngx/paperless-ngx/pull/777)) +- Feature / fix saved view \& sort field query params [@shamoon](https://github.com/shamoon) ([#881](https://github.com/paperless-ngx/paperless-ngx/pull/881)) +- Mobile friendlier manage pages [@shamoon](https://github.com/shamoon) ([#873](https://github.com/paperless-ngx/paperless-ngx/pull/873)) +- Add timeout to healthcheck [@shamoon](https://github.com/shamoon) ([#880](https://github.com/paperless-ngx/paperless-ngx/pull/880)) +- Always accept yyyy-mm-dd date inputs [@shamoon](https://github.com/shamoon) ([#864](https://github.com/paperless-ngx/paperless-ngx/pull/864)) +- Fix local Docker image building [@stumpylog](https://github.com/stumpylog) ([#849](https://github.com/paperless-ngx/paperless-ngx/pull/849)) +- Fix: show errors on invalid date input [@shamoon](https://github.com/shamoon) ([#862](https://github.com/paperless-ngx/paperless-ngx/pull/862)) +- Fix: Older dates do not display on frontend [@shamoon](https://github.com/shamoon) ([#852](https://github.com/paperless-ngx/paperless-ngx/pull/852)) +- Fixes IMAP UTF8 Authentication [@stumpylog](https://github.com/stumpylog) ([#725](https://github.com/paperless-ngx/paperless-ngx/pull/725)) +- Fix password field remains visible [@shamoon](https://github.com/shamoon) ([#840](https://github.com/paperless-ngx/paperless-ngx/pull/840)) +- Fixes Pillow build for armv7 [@stumpylog](https://github.com/stumpylog) ([#815](https://github.com/paperless-ngx/paperless-ngx/pull/815)) +- Update frontend localization source file [@shamoon](https://github.com/shamoon) ([#814](https://github.com/paperless-ngx/paperless-ngx/pull/814)) +- Fix install script extra OCR languages format [@stumpylog](https://github.com/stumpylog) ([#777](https://github.com/paperless-ngx/paperless-ngx/pull/777)) ### Documentation -- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) -- Deployment: Consolidate tika compose files [@qcasey](https://github.com/qcasey) ([#866](https://github.com/paperless-ngx/paperless-ngx/pull/866)) -- Fix local Docker image building [@stumpylog](https://github.com/stumpylog) ([#849](https://github.com/paperless-ngx/paperless-ngx/pull/849)) +- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) +- Deployment: Consolidate tika compose files [@qcasey](https://github.com/qcasey) ([#866](https://github.com/paperless-ngx/paperless-ngx/pull/866)) +- Fix local Docker image building [@stumpylog](https://github.com/stumpylog) ([#849](https://github.com/paperless-ngx/paperless-ngx/pull/849)) ### Maintenance -- Dockerfile Organization \& Enhancements [@stumpylog](https://github.com/stumpylog) ([#888](https://github.com/paperless-ngx/paperless-ngx/pull/888)) -- Add timeout to healthcheck [@shamoon](https://github.com/shamoon) ([#880](https://github.com/paperless-ngx/paperless-ngx/pull/880)) -- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) -- Deployment: Consolidate tika compose files [@qcasey](https://github.com/qcasey) ([#866](https://github.com/paperless-ngx/paperless-ngx/pull/866)) -- Fixes Pillow build for armv7 [@stumpylog](https://github.com/stumpylog) ([#815](https://github.com/paperless-ngx/paperless-ngx/pull/815)) -- Update frontend localization source file [@shamoon](https://github.com/shamoon) ([#814](https://github.com/paperless-ngx/paperless-ngx/pull/814)) -- Fix install script extra OCR languages format [@stumpylog](https://github.com/stumpylog) ([#777](https://github.com/paperless-ngx/paperless-ngx/pull/777)) -- Adds simple Python to wait for Redis broker to be ready [@stumpylog](https://github.com/stumpylog) ([#788](https://github.com/paperless-ngx/paperless-ngx/pull/788)) +- Dockerfile Organization \& Enhancements [@stumpylog](https://github.com/stumpylog) ([#888](https://github.com/paperless-ngx/paperless-ngx/pull/888)) +- Add timeout to healthcheck [@shamoon](https://github.com/shamoon) ([#880](https://github.com/paperless-ngx/paperless-ngx/pull/880)) +- Use semver for release process [@stumpylog](https://github.com/stumpylog) ([#851](https://github.com/paperless-ngx/paperless-ngx/pull/851)) +- Deployment: Consolidate tika compose files [@qcasey](https://github.com/qcasey) ([#866](https://github.com/paperless-ngx/paperless-ngx/pull/866)) +- Fixes Pillow build for armv7 [@stumpylog](https://github.com/stumpylog) ([#815](https://github.com/paperless-ngx/paperless-ngx/pull/815)) +- Update frontend localization source file [@shamoon](https://github.com/shamoon) ([#814](https://github.com/paperless-ngx/paperless-ngx/pull/814)) +- Fix install script extra OCR languages format [@stumpylog](https://github.com/stumpylog) ([#777](https://github.com/paperless-ngx/paperless-ngx/pull/777)) +- Adds simple Python to wait for Redis broker to be ready [@stumpylog](https://github.com/stumpylog) ([#788](https://github.com/paperless-ngx/paperless-ngx/pull/788)) ### Dependencies
15 changes -- Bump tj-actions/changed-files from 18.7 to 19 @dependabot ([#830](https://github.com/paperless-ngx/paperless-ngx/pull/830)) -- Bump asgiref from 3.5.0 to 3.5.1 @dependabot ([#867](https://github.com/paperless-ngx/paperless-ngx/pull/867)) -- Bump jest from 27.5.1 to 28.0.3 in /src-ui @dependabot ([#860](https://github.com/paperless-ngx/paperless-ngx/pull/860)) -- Bump @ng-bootstrap/ng-bootstrap from 12.1.0 to 12.1.1 in /src-ui @dependabot ([#861](https://github.com/paperless-ngx/paperless-ngx/pull/861)) -- Bump @types/node from 17.0.27 to 17.0.29 in /src-ui @dependabot ([#833](https://github.com/paperless-ngx/paperless-ngx/pull/833)) -- Bump @ng-bootstrap/ng-bootstrap from 12.0.2 to 12.1.0 in /src-ui @dependabot ([#834](https://github.com/paperless-ngx/paperless-ngx/pull/834)) -- Bump pytest from 7.1.1 to 7.1.2 @dependabot ([#806](https://github.com/paperless-ngx/paperless-ngx/pull/806)) -- Bump github/codeql-action from 1 to 2 @dependabot ([#792](https://github.com/paperless-ngx/paperless-ngx/pull/792)) -- Bump imap-tools from 0.53.0 to 0.54.0 @dependabot ([#758](https://github.com/paperless-ngx/paperless-ngx/pull/758)) -- Bump ocrmypdf from 13.4.2 to 13.4.3 @dependabot ([#757](https://github.com/paperless-ngx/paperless-ngx/pull/757)) -- Bump importlib-resources from 5.6.0 to 5.7.1 @dependabot ([#756](https://github.com/paperless-ngx/paperless-ngx/pull/756)) -- Bump tox from 3.24.5 to 3.25.0 @dependabot ([#692](https://github.com/paperless-ngx/paperless-ngx/pull/692)) -- Bump cypress from 9.5.3 to 9.6.0 in /src-ui @dependabot ([#800](https://github.com/paperless-ngx/paperless-ngx/pull/800)) -- Bump angular \& tools to 13.3.4 or 13.3.3 [@shamoon](https://github.com/shamoon) ([#799](https://github.com/paperless-ngx/paperless-ngx/pull/799)) -- Bump concurrently from 7.0.0 to 7.1.0 in /src-ui @dependabot ([#797](https://github.com/paperless-ngx/paperless-ngx/pull/797)) +- Bump tj-actions/changed-files from 18.7 to 19 @dependabot ([#830](https://github.com/paperless-ngx/paperless-ngx/pull/830)) +- Bump asgiref from 3.5.0 to 3.5.1 @dependabot ([#867](https://github.com/paperless-ngx/paperless-ngx/pull/867)) +- Bump jest from 27.5.1 to 28.0.3 in /src-ui @dependabot ([#860](https://github.com/paperless-ngx/paperless-ngx/pull/860)) +- Bump @ng-bootstrap/ng-bootstrap from 12.1.0 to 12.1.1 in /src-ui @dependabot ([#861](https://github.com/paperless-ngx/paperless-ngx/pull/861)) +- Bump @types/node from 17.0.27 to 17.0.29 in /src-ui @dependabot ([#833](https://github.com/paperless-ngx/paperless-ngx/pull/833)) +- Bump @ng-bootstrap/ng-bootstrap from 12.0.2 to 12.1.0 in /src-ui @dependabot ([#834](https://github.com/paperless-ngx/paperless-ngx/pull/834)) +- Bump pytest from 7.1.1 to 7.1.2 @dependabot ([#806](https://github.com/paperless-ngx/paperless-ngx/pull/806)) +- Bump github/codeql-action from 1 to 2 @dependabot ([#792](https://github.com/paperless-ngx/paperless-ngx/pull/792)) +- Bump imap-tools from 0.53.0 to 0.54.0 @dependabot ([#758](https://github.com/paperless-ngx/paperless-ngx/pull/758)) +- Bump ocrmypdf from 13.4.2 to 13.4.3 @dependabot ([#757](https://github.com/paperless-ngx/paperless-ngx/pull/757)) +- Bump importlib-resources from 5.6.0 to 5.7.1 @dependabot ([#756](https://github.com/paperless-ngx/paperless-ngx/pull/756)) +- Bump tox from 3.24.5 to 3.25.0 @dependabot ([#692](https://github.com/paperless-ngx/paperless-ngx/pull/692)) +- Bump cypress from 9.5.3 to 9.6.0 in /src-ui @dependabot ([#800](https://github.com/paperless-ngx/paperless-ngx/pull/800)) +- Bump angular \& tools to 13.3.4 or 13.3.3 [@shamoon](https://github.com/shamoon) ([#799](https://github.com/paperless-ngx/paperless-ngx/pull/799)) +- Bump concurrently from 7.0.0 to 7.1.0 in /src-ui @dependabot ([#797](https://github.com/paperless-ngx/paperless-ngx/pull/797))
## paperless-ngx 1.7.0 ### Breaking Changes -- `PAPERLESS_URL` is now required when using a reverse proxy. See - [#674](https://github.com/paperless-ngx/paperless-ngx/pull/674). +- `PAPERLESS_URL` is now required when using a reverse proxy. See + [#674](https://github.com/paperless-ngx/paperless-ngx/pull/674). ### Features -- Allow setting more than one tag in mail rules - [@jonasc](https://github.com/jonasc) ([#270](https://github.com/paperless-ngx/paperless-ngx/pull/270)) -- Global drag'n'drop [@shamoon](https://github.com/shamoon) - ([#283](https://github.com/paperless-ngx/paperless-ngx/pull/283)) -- Fix: download buttons should disable while waiting - [@shamoon](https://github.com/shamoon) ([#630](https://github.com/paperless-ngx/paperless-ngx/pull/630)) -- Update checker [@shamoon](https://github.com/shamoon) ([#591](https://github.com/paperless-ngx/paperless-ngx/pull/591)) -- Show prompt on password-protected pdfs - [@shamoon](https://github.com/shamoon) ([#564](https://github.com/paperless-ngx/paperless-ngx/pull/564)) -- Filtering query params aka browser navigation for filtering - [@shamoon](https://github.com/shamoon) ([#540](https://github.com/paperless-ngx/paperless-ngx/pull/540)) -- Clickable tags in dashboard widgets - [@shamoon](https://github.com/shamoon) ([#515](https://github.com/paperless-ngx/paperless-ngx/pull/515)) -- Add bottom pagination [@shamoon](https://github.com/shamoon) - ([#372](https://github.com/paperless-ngx/paperless-ngx/pull/372)) -- Feature barcode splitter [@gador](https://github.com/gador) - ([#532](https://github.com/paperless-ngx/paperless-ngx/pull/532)) -- App loading screen [@shamoon](https://github.com/shamoon) ([#298](https://github.com/paperless-ngx/paperless-ngx/pull/298)) -- Use progress bar for delayed buttons - [@shamoon](https://github.com/shamoon) ([#415](https://github.com/paperless-ngx/paperless-ngx/pull/415)) -- Add minimum length for documents text filter - [@shamoon](https://github.com/shamoon) ([#401](https://github.com/paperless-ngx/paperless-ngx/pull/401)) -- Added nav buttons in the document detail view - [@GruberViktor](https://github.com/gruberviktor) ([#273](https://github.com/paperless-ngx/paperless-ngx/pull/273)) -- Improve date keyboard input [@shamoon](https://github.com/shamoon) - ([#253](https://github.com/paperless-ngx/paperless-ngx/pull/253)) -- Color theming [@shamoon](https://github.com/shamoon) ([#243](https://github.com/paperless-ngx/paperless-ngx/pull/243)) -- Parse dates when entered without separators - [@GruberViktor](https://github.com/gruberviktor) ([#250](https://github.com/paperless-ngx/paperless-ngx/pull/250)) +- Allow setting more than one tag in mail rules + [@jonasc](https://github.com/jonasc) ([#270](https://github.com/paperless-ngx/paperless-ngx/pull/270)) +- Global drag'n'drop [@shamoon](https://github.com/shamoon) + ([#283](https://github.com/paperless-ngx/paperless-ngx/pull/283)) +- Fix: download buttons should disable while waiting + [@shamoon](https://github.com/shamoon) ([#630](https://github.com/paperless-ngx/paperless-ngx/pull/630)) +- Update checker [@shamoon](https://github.com/shamoon) ([#591](https://github.com/paperless-ngx/paperless-ngx/pull/591)) +- Show prompt on password-protected pdfs + [@shamoon](https://github.com/shamoon) ([#564](https://github.com/paperless-ngx/paperless-ngx/pull/564)) +- Filtering query params aka browser navigation for filtering + [@shamoon](https://github.com/shamoon) ([#540](https://github.com/paperless-ngx/paperless-ngx/pull/540)) +- Clickable tags in dashboard widgets + [@shamoon](https://github.com/shamoon) ([#515](https://github.com/paperless-ngx/paperless-ngx/pull/515)) +- Add bottom pagination [@shamoon](https://github.com/shamoon) + ([#372](https://github.com/paperless-ngx/paperless-ngx/pull/372)) +- Feature barcode splitter [@gador](https://github.com/gador) + ([#532](https://github.com/paperless-ngx/paperless-ngx/pull/532)) +- App loading screen [@shamoon](https://github.com/shamoon) ([#298](https://github.com/paperless-ngx/paperless-ngx/pull/298)) +- Use progress bar for delayed buttons + [@shamoon](https://github.com/shamoon) ([#415](https://github.com/paperless-ngx/paperless-ngx/pull/415)) +- Add minimum length for documents text filter + [@shamoon](https://github.com/shamoon) ([#401](https://github.com/paperless-ngx/paperless-ngx/pull/401)) +- Added nav buttons in the document detail view + [@GruberViktor](https://github.com/gruberviktor) ([#273](https://github.com/paperless-ngx/paperless-ngx/pull/273)) +- Improve date keyboard input [@shamoon](https://github.com/shamoon) + ([#253](https://github.com/paperless-ngx/paperless-ngx/pull/253)) +- Color theming [@shamoon](https://github.com/shamoon) ([#243](https://github.com/paperless-ngx/paperless-ngx/pull/243)) +- Parse dates when entered without separators + [@GruberViktor](https://github.com/gruberviktor) ([#250](https://github.com/paperless-ngx/paperless-ngx/pull/250)) ### Bug Fixes -- Add "localhost" to ALLOWED_HOSTS - [@gador](https://github.com/gador) ([#700](https://github.com/paperless-ngx/paperless-ngx/pull/700)) -- Fix: scanners table [@qcasey](https://github.com/qcasey) ([#690](https://github.com/paperless-ngx/paperless-ngx/pull/690)) -- Adds wait for file before consuming - [@stumpylog](https://github.com/stumpylog) ([#483](https://github.com/paperless-ngx/paperless-ngx/pull/483)) -- Fix: frontend document editing erases time data - [@shamoon](https://github.com/shamoon) ([#654](https://github.com/paperless-ngx/paperless-ngx/pull/654)) -- Increase length of SavedViewFilterRule - [@stumpylog](https://github.com/stumpylog) ([#612](https://github.com/paperless-ngx/paperless-ngx/pull/612)) -- Fixes attachment filename matching during mail fetching - [@stumpylog](https://github.com/stumpylog) ([#680](https://github.com/paperless-ngx/paperless-ngx/pull/680)) -- Add `PAPERLESS_URL` env variable & CSRF var - [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/discussions/674)) -- Fix: download buttons should disable while waiting - [@shamoon](https://github.com/shamoon) ([#630](https://github.com/paperless-ngx/paperless-ngx/pull/630)) -- Fixes downloaded filename, add more consumer ignore settings - [@stumpylog](https://github.com/stumpylog) ([#599](https://github.com/paperless-ngx/paperless-ngx/pull/599)) -- FIX BUG: case-sensitive matching was not possible - [@danielBreitlauch](https://github.com/danielbreitlauch) ([#594](https://github.com/paperless-ngx/paperless-ngx/pull/594)) -- Uses shutil.move instead of rename - [@gador](https://github.com/gador) ([#617](https://github.com/paperless-ngx/paperless-ngx/pull/617)) -- Fix npm deps 01.02.22 2 [@shamoon](https://github.com/shamoon) - ([#610](https://github.com/paperless-ngx/paperless-ngx/discussions/610)) -- Fix npm dependencies 01.02.22 - [@shamoon](https://github.com/shamoon) ([#600](https://github.com/paperless-ngx/paperless-ngx/pull/600)) -- Fix issue 416: implement `PAPERLESS_OCR_MAX_IMAGE_PIXELS` - [@hacker-h](https://github.com/hacker-h) ([#441](https://github.com/paperless-ngx/paperless-ngx/pull/441)) -- Fix: exclude cypress from build in Dockerfile - [@FrankStrieter](https://github.com/FrankStrieter) ([#526](https://github.com/paperless-ngx/paperless-ngx/pull/526)) -- Corrections to pass pre-commit hooks - [@schnuffle](https://github.com/schnuffle) ([#454](https://github.com/paperless-ngx/paperless-ngx/pull/454)) -- Fix 311 unable to click checkboxes in document list - [@shamoon](https://github.com/shamoon) ([#313](https://github.com/paperless-ngx/paperless-ngx/pull/313)) -- Fix imap tools bug [@stumpylog](https://github.com/stumpylog) - ([#393](https://github.com/paperless-ngx/paperless-ngx/pull/393)) -- Fix filterable dropdown buttons aren't translated - [@shamoon](https://github.com/shamoon) ([#366](https://github.com/paperless-ngx/paperless-ngx/pull/366)) -- Fix 224: "Auto-detected date is day before receipt date" - [@a17t](https://github.com/a17t) ([#246](https://github.com/paperless-ngx/paperless-ngx/pull/246)) -- Fix minor sphinx errors [@shamoon](https://github.com/shamoon) - ([#322](https://github.com/paperless-ngx/paperless-ngx/pull/322)) -- Fix page links hidden [@shamoon](https://github.com/shamoon) - ([#314](https://github.com/paperless-ngx/paperless-ngx/pull/314)) -- Fix: Include excluded items in dropdown count - [@shamoon](https://github.com/shamoon) ([#263](https://github.com/paperless-ngx/paperless-ngx/pull/263)) +- Add "localhost" to ALLOWED_HOSTS + [@gador](https://github.com/gador) ([#700](https://github.com/paperless-ngx/paperless-ngx/pull/700)) +- Fix: scanners table [@qcasey](https://github.com/qcasey) ([#690](https://github.com/paperless-ngx/paperless-ngx/pull/690)) +- Adds wait for file before consuming + [@stumpylog](https://github.com/stumpylog) ([#483](https://github.com/paperless-ngx/paperless-ngx/pull/483)) +- Fix: frontend document editing erases time data + [@shamoon](https://github.com/shamoon) ([#654](https://github.com/paperless-ngx/paperless-ngx/pull/654)) +- Increase length of SavedViewFilterRule + [@stumpylog](https://github.com/stumpylog) ([#612](https://github.com/paperless-ngx/paperless-ngx/pull/612)) +- Fixes attachment filename matching during mail fetching + [@stumpylog](https://github.com/stumpylog) ([#680](https://github.com/paperless-ngx/paperless-ngx/pull/680)) +- Add `PAPERLESS_URL` env variable & CSRF var + [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/discussions/674)) +- Fix: download buttons should disable while waiting + [@shamoon](https://github.com/shamoon) ([#630](https://github.com/paperless-ngx/paperless-ngx/pull/630)) +- Fixes downloaded filename, add more consumer ignore settings + [@stumpylog](https://github.com/stumpylog) ([#599](https://github.com/paperless-ngx/paperless-ngx/pull/599)) +- FIX BUG: case-sensitive matching was not possible + [@danielBreitlauch](https://github.com/danielbreitlauch) ([#594](https://github.com/paperless-ngx/paperless-ngx/pull/594)) +- Uses shutil.move instead of rename + [@gador](https://github.com/gador) ([#617](https://github.com/paperless-ngx/paperless-ngx/pull/617)) +- Fix npm deps 01.02.22 2 [@shamoon](https://github.com/shamoon) + ([#610](https://github.com/paperless-ngx/paperless-ngx/discussions/610)) +- Fix npm dependencies 01.02.22 + [@shamoon](https://github.com/shamoon) ([#600](https://github.com/paperless-ngx/paperless-ngx/pull/600)) +- Fix issue 416: implement `PAPERLESS_OCR_MAX_IMAGE_PIXELS` + [@hacker-h](https://github.com/hacker-h) ([#441](https://github.com/paperless-ngx/paperless-ngx/pull/441)) +- Fix: exclude cypress from build in Dockerfile + [@FrankStrieter](https://github.com/FrankStrieter) ([#526](https://github.com/paperless-ngx/paperless-ngx/pull/526)) +- Corrections to pass pre-commit hooks + [@schnuffle](https://github.com/schnuffle) ([#454](https://github.com/paperless-ngx/paperless-ngx/pull/454)) +- Fix 311 unable to click checkboxes in document list + [@shamoon](https://github.com/shamoon) ([#313](https://github.com/paperless-ngx/paperless-ngx/pull/313)) +- Fix imap tools bug [@stumpylog](https://github.com/stumpylog) + ([#393](https://github.com/paperless-ngx/paperless-ngx/pull/393)) +- Fix filterable dropdown buttons aren't translated + [@shamoon](https://github.com/shamoon) ([#366](https://github.com/paperless-ngx/paperless-ngx/pull/366)) +- Fix 224: "Auto-detected date is day before receipt date" + [@a17t](https://github.com/a17t) ([#246](https://github.com/paperless-ngx/paperless-ngx/pull/246)) +- Fix minor sphinx errors [@shamoon](https://github.com/shamoon) + ([#322](https://github.com/paperless-ngx/paperless-ngx/pull/322)) +- Fix page links hidden [@shamoon](https://github.com/shamoon) + ([#314](https://github.com/paperless-ngx/paperless-ngx/pull/314)) +- Fix: Include excluded items in dropdown count + [@shamoon](https://github.com/shamoon) ([#263](https://github.com/paperless-ngx/paperless-ngx/pull/263)) ### Translation -- [@miku323](https://github.com/miku323) contributed to Slovenian - translation -- [@FaintGhost](https://github.com/FaintGhost) contributed to Chinese - Simplified translation -- [@DarkoBG79](https://github.com/DarkoBG79) contributed to Serbian - translation -- [Kemal Secer](https://crowdin.com/profile/kemal.secer) contributed - to Turkish translation -- [@Prominence](https://github.com/Prominence) contributed to - Belarusian translation +- [@miku323](https://github.com/miku323) contributed to Slovenian + translation +- [@FaintGhost](https://github.com/FaintGhost) contributed to Chinese + Simplified translation +- [@DarkoBG79](https://github.com/DarkoBG79) contributed to Serbian + translation +- [Kemal Secer](https://crowdin.com/profile/kemal.secer) contributed + to Turkish translation +- [@Prominence](https://github.com/Prominence) contributed to + Belarusian translation ### Documentation -- Fix: scanners table [@qcasey](https://github.com/qcasey) ([#690](https://github.com/paperless-ngx/paperless-ngx/pull/690)) -- Add `PAPERLESS_URL` env variable & CSRF var - [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/pull/674)) -- Fixes downloaded filename, add more consumer ignore settings - [@stumpylog](https://github.com/stumpylog) ([#599](https://github.com/paperless-ngx/paperless-ngx/pull/599)) -- Fix issue 416: implement `PAPERLESS_OCR_MAX_IMAGE_PIXELS` - [@hacker-h](https://github.com/hacker-h) ([#441](https://github.com/paperless-ngx/paperless-ngx/pull/441)) -- Fix minor sphinx errors [@shamoon](https://github.com/shamoon) - ([#322](https://github.com/paperless-ngx/paperless-ngx/pull/322)) +- Fix: scanners table [@qcasey](https://github.com/qcasey) ([#690](https://github.com/paperless-ngx/paperless-ngx/pull/690)) +- Add `PAPERLESS_URL` env variable & CSRF var + [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/pull/674)) +- Fixes downloaded filename, add more consumer ignore settings + [@stumpylog](https://github.com/stumpylog) ([#599](https://github.com/paperless-ngx/paperless-ngx/pull/599)) +- Fix issue 416: implement `PAPERLESS_OCR_MAX_IMAGE_PIXELS` + [@hacker-h](https://github.com/hacker-h) ([#441](https://github.com/paperless-ngx/paperless-ngx/pull/441)) +- Fix minor sphinx errors [@shamoon](https://github.com/shamoon) + ([#322](https://github.com/paperless-ngx/paperless-ngx/pull/322)) ### Maintenance -- Add `PAPERLESS_URL` env variable & CSRF var - [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/pull/674)) -- Chore: Implement release-drafter action for Changelogs - [@qcasey](https://github.com/qcasey) ([#669](https://github.com/paperless-ngx/paperless-ngx/pull/669)) -- Chore: Add CODEOWNERS [@qcasey](https://github.com/qcasey) ([#667](https://github.com/paperless-ngx/paperless-ngx/pull/667)) -- Support docker-compose v2 in install - [@stumpylog](https://github.com/stumpylog) ([#611](https://github.com/paperless-ngx/paperless-ngx/pull/611)) -- Add Belarusian localization [@shamoon](https://github.com/shamoon) - ([#588](https://github.com/paperless-ngx/paperless-ngx/pull/588)) -- Add Turkish localization [@shamoon](https://github.com/shamoon) - ([#536](https://github.com/paperless-ngx/paperless-ngx/pull/536)) -- Add Serbian localization [@shamoon](https://github.com/shamoon) - ([#504](https://github.com/paperless-ngx/paperless-ngx/pull/504)) -- Create PULL_REQUEST_TEMPLATE.md - [@shamoon](https://github.com/shamoon) ([#304](https://github.com/paperless-ngx/paperless-ngx/pull/304)) -- Add Chinese localization [@shamoon](https://github.com/shamoon) - ([#247](https://github.com/paperless-ngx/paperless-ngx/pull/247)) -- Add Slovenian language for frontend - [@shamoon](https://github.com/shamoon) ([#315](https://github.com/paperless-ngx/paperless-ngx/pull/315)) +- Add `PAPERLESS_URL` env variable & CSRF var + [@shamoon](https://github.com/shamoon) ([#674](https://github.com/paperless-ngx/paperless-ngx/pull/674)) +- Chore: Implement release-drafter action for Changelogs + [@qcasey](https://github.com/qcasey) ([#669](https://github.com/paperless-ngx/paperless-ngx/pull/669)) +- Chore: Add CODEOWNERS [@qcasey](https://github.com/qcasey) ([#667](https://github.com/paperless-ngx/paperless-ngx/pull/667)) +- Support docker-compose v2 in install + [@stumpylog](https://github.com/stumpylog) ([#611](https://github.com/paperless-ngx/paperless-ngx/pull/611)) +- Add Belarusian localization [@shamoon](https://github.com/shamoon) + ([#588](https://github.com/paperless-ngx/paperless-ngx/pull/588)) +- Add Turkish localization [@shamoon](https://github.com/shamoon) + ([#536](https://github.com/paperless-ngx/paperless-ngx/pull/536)) +- Add Serbian localization [@shamoon](https://github.com/shamoon) + ([#504](https://github.com/paperless-ngx/paperless-ngx/pull/504)) +- Create PULL_REQUEST_TEMPLATE.md + [@shamoon](https://github.com/shamoon) ([#304](https://github.com/paperless-ngx/paperless-ngx/pull/304)) +- Add Chinese localization [@shamoon](https://github.com/shamoon) + ([#247](https://github.com/paperless-ngx/paperless-ngx/pull/247)) +- Add Slovenian language for frontend + [@shamoon](https://github.com/shamoon) ([#315](https://github.com/paperless-ngx/paperless-ngx/pull/315)) ## paperless-ngx 1.6.0 @@ -5529,57 +5923,57 @@ Version 1.6.0 merges several pending PRs from jonaswinkler's repo and includes new feature updates and bug fixes. Major backend and UI changes include: -- Updated docs, scripts, CI, and containers to paperless-ngx. -- Updated Python and Angular dependencies. -- Dropped support for Python 3.7. -- Dropped support for Ansible playbooks (thanks - [@slankes](https://github.com/slankes) [#109](https://github.com/paperless-ngx/paperless-ngx/pull/109)). If someone would - like to continue supporting them, please see our [ansible - repo](https://github.com/paperless-ngx/paperless-ngx-ansible). -- Python code is now required to use Black formatting (thanks - [@kpj](https://github.com/kpj) [#168](https://github.com/paperless-ngx/paperless-ngx/pull/168)). -- [@tribut](https://github.com/tribut) added support for a custom SSO - logout redirect ([jonaswinkler\#1258](https://github.com/jonaswinkler/paperless-ng/pull/1258)). See - `PAPERLESS_LOGOUT_REDIRECT_URL`. -- [@shamoon](https://github.com/shamoon) added a loading indicator - when document list is reloading ([jonaswinkler\#1297](https://github.com/jonaswinkler/paperless-ng/pull/1297)). -- [@shamoon](https://github.com/shamoon) improved the PDF viewer on - mobile ([#2](https://github.com/paperless-ngx/paperless-ngx/pull/2)). -- [@shamoon](https://github.com/shamoon) added 'any' / 'all' and - 'not' filtering with tags ([#10](https://github.com/paperless-ngx/paperless-ngx/pull/10)). -- [@shamoon](https://github.com/shamoon) added warnings for unsaved - changes, with smart edit buttons ([#13](https://github.com/paperless-ngx/paperless-ngx/pull/13)). -- [@benjaminfrank](https://github.com/benjaminfrank) enabled a - non-root access to port 80 via systemd ([#18](https://github.com/paperless-ngx/paperless-ngx/pull/18)). -- [@tribut](https://github.com/tribut) added simple "delete to - trash" functionality ([#24](https://github.com/paperless-ngx/paperless-ngx/pull/24)). See `PAPERLESS_TRASH_DIR`. -- [@amenk](https://github.com/amenk) fixed the search box overlay - menu on mobile ([#32](https://github.com/paperless-ngx/paperless-ngx/pull/32)). -- [@dblitt](https://github.com/dblitt) updated the login form to not - auto-capitalize usernames ([#36](https://github.com/paperless-ngx/paperless-ngx/pull/36)). -- [@evilsidekick293](https://github.com/evilsidekick293) made the - worker timeout configurable ([#37](https://github.com/paperless-ngx/paperless-ngx/pull/37)). See `PAPERLESS_WORKER_TIMEOUT`. -- [@Nicarim](https://github.com/Nicarim) fixed downloads of UTF-8 - formatted documents in Firefox ([#56](https://github.com/paperless-ngx/paperless-ngx/pull/56)). -- [@mweimerskirch](https://github.com/mweimerskirch) sorted the - language dropdown by locale ([#78](https://github.com/paperless-ngx/paperless-ngx/issues/78)). -- [@mweimerskirch](https://github.com/mweimerskirch) enabled the - Czech ([#83](https://github.com/paperless-ngx/paperless-ngx/pull/83)) and Danish ([#84](https://github.com/paperless-ngx/paperless-ngx/pull/84)) translations. -- [@cschmatzler](https://github.com/cschmatzler) enabled specifying - the webserver port ([#124](https://github.com/paperless-ngx/paperless-ngx/pull/124)). See `PAPERLESS_PORT`. -- [@muellermartin](https://github.com/muellermartin) fixed an error - when uploading transparent PNGs ([#133](https://github.com/paperless-ngx/paperless-ngx/pull/133)). -- [@shamoon](https://github.com/shamoon) created a slick new logo - ([#165](https://github.com/paperless-ngx/paperless-ngx/pull/165)). -- [@tim-vogel](https://github.com/tim-vogel) fixed exports missing - groups ([#193](https://github.com/paperless-ngx/paperless-ngx/pull/193)). +- Updated docs, scripts, CI, and containers to paperless-ngx. +- Updated Python and Angular dependencies. +- Dropped support for Python 3.7. +- Dropped support for Ansible playbooks (thanks + [@slankes](https://github.com/slankes) [#109](https://github.com/paperless-ngx/paperless-ngx/pull/109)). If someone would + like to continue supporting them, please see our [ansible + repo](https://github.com/paperless-ngx/paperless-ngx-ansible). +- Python code is now required to use Black formatting (thanks + [@kpj](https://github.com/kpj) [#168](https://github.com/paperless-ngx/paperless-ngx/pull/168)). +- [@tribut](https://github.com/tribut) added support for a custom SSO + logout redirect ([jonaswinkler\#1258](https://github.com/jonaswinkler/paperless-ng/pull/1258)). See + `PAPERLESS_LOGOUT_REDIRECT_URL`. +- [@shamoon](https://github.com/shamoon) added a loading indicator + when document list is reloading ([jonaswinkler\#1297](https://github.com/jonaswinkler/paperless-ng/pull/1297)). +- [@shamoon](https://github.com/shamoon) improved the PDF viewer on + mobile ([#2](https://github.com/paperless-ngx/paperless-ngx/pull/2)). +- [@shamoon](https://github.com/shamoon) added 'any' / 'all' and + 'not' filtering with tags ([#10](https://github.com/paperless-ngx/paperless-ngx/pull/10)). +- [@shamoon](https://github.com/shamoon) added warnings for unsaved + changes, with smart edit buttons ([#13](https://github.com/paperless-ngx/paperless-ngx/pull/13)). +- [@benjaminfrank](https://github.com/benjaminfrank) enabled a + non-root access to port 80 via systemd ([#18](https://github.com/paperless-ngx/paperless-ngx/pull/18)). +- [@tribut](https://github.com/tribut) added simple "delete to + trash" functionality ([#24](https://github.com/paperless-ngx/paperless-ngx/pull/24)). See `PAPERLESS_TRASH_DIR`. +- [@amenk](https://github.com/amenk) fixed the search box overlay + menu on mobile ([#32](https://github.com/paperless-ngx/paperless-ngx/pull/32)). +- [@dblitt](https://github.com/dblitt) updated the login form to not + auto-capitalize usernames ([#36](https://github.com/paperless-ngx/paperless-ngx/pull/36)). +- [@evilsidekick293](https://github.com/evilsidekick293) made the + worker timeout configurable ([#37](https://github.com/paperless-ngx/paperless-ngx/pull/37)). See `PAPERLESS_WORKER_TIMEOUT`. +- [@Nicarim](https://github.com/Nicarim) fixed downloads of UTF-8 + formatted documents in Firefox ([#56](https://github.com/paperless-ngx/paperless-ngx/pull/56)). +- [@mweimerskirch](https://github.com/mweimerskirch) sorted the + language dropdown by locale ([#78](https://github.com/paperless-ngx/paperless-ngx/issues/78)). +- [@mweimerskirch](https://github.com/mweimerskirch) enabled the + Czech ([#83](https://github.com/paperless-ngx/paperless-ngx/pull/83)) and Danish ([#84](https://github.com/paperless-ngx/paperless-ngx/pull/84)) translations. +- [@cschmatzler](https://github.com/cschmatzler) enabled specifying + the webserver port ([#124](https://github.com/paperless-ngx/paperless-ngx/pull/124)). See `PAPERLESS_PORT`. +- [@muellermartin](https://github.com/muellermartin) fixed an error + when uploading transparent PNGs ([#133](https://github.com/paperless-ngx/paperless-ngx/pull/133)). +- [@shamoon](https://github.com/shamoon) created a slick new logo + ([#165](https://github.com/paperless-ngx/paperless-ngx/pull/165)). +- [@tim-vogel](https://github.com/tim-vogel) fixed exports missing + groups ([#193](https://github.com/paperless-ngx/paperless-ngx/pull/193)). Known issues: -- 1.6.0 included a malformed package-lock.json, as a result users who - want to build the docker image themselves need to change line 6 of - the `Dockerfile` to - `RUN npm update npm -g && npm install --legacy-peer-deps`. +- 1.6.0 included a malformed package-lock.json, as a result users who + want to build the docker image themselves need to change line 6 of + the `Dockerfile` to + `RUN npm update npm -g && npm install --legacy-peer-deps`. Thank you to the following people for their documentation updates, fixes, and comprehensive testing: @@ -5619,20 +6013,20 @@ fixes, and comprehensive testing: Another big thanks to the people who have contributed translations: -- Michel Weimerskirch (michel_weimerskirch) suggested 31 translations - into French and Luxembourgish. -- jo.vandeginste suggested 21 translations into Dutch. -- Lars Sørensen (Lrss) suggested 486 translations into Danish. -- Alex (Sky-Dragon) voted for 46 translations in German. -- Yannic Schröder (yschroeder) suggested 14 translations into German. -- David Morais Ferreira (DavidMoraisFerreira) voted for 10 - translations in Portuguese and Luxembourgish. -- David Morais Ferreira (DavidMoraisFerreira) suggested 88 - translations into French, German, Portuguese, Portuguese, Brazilian - and Luxembourgish. -- 汪泠沣 (wlfcss) suggested 13 translations into Chinese Traditional. -- Lars Sørensen (Lrss) suggested 167 translations into Danish. -- Philmo67 suggested 11 translations into French. +- Michel Weimerskirch (michel_weimerskirch) suggested 31 translations + into French and Luxembourgish. +- jo.vandeginste suggested 21 translations into Dutch. +- Lars Sørensen (Lrss) suggested 486 translations into Danish. +- Alex (Sky-Dragon) voted for 46 translations in German. +- Yannic Schröder (yschroeder) suggested 14 translations into German. +- David Morais Ferreira (DavidMoraisFerreira) voted for 10 + translations in Portuguese and Luxembourgish. +- David Morais Ferreira (DavidMoraisFerreira) suggested 88 + translations into French, German, Portuguese, Portuguese, Brazilian + and Luxembourgish. +- 汪泠沣 (wlfcss) suggested 13 translations into Chinese Traditional. +- Lars Sørensen (Lrss) suggested 167 translations into Danish. +- Philmo67 suggested 11 translations into French. ## Paperless-ng @@ -5640,102 +6034,102 @@ Another big thanks to the people who have contributed translations: Support for Python 3.6 was dropped. -- Updated python dependencies. -- Base image of the docker image changed from Debian Buster to Debian - Bullseye due to its recent release. -- The docker image now uses python 3.9. -- Added the Luxembourgish locale. Thanks for translating! -- [Daniel Albers](https://github.com/AlD) added support for making the - files and folders ignored by the paperless consume folder scanner - configurable. See `PAPERLESS_CONSUMER_IGNORE_PATTERNS`. +- Updated python dependencies. +- Base image of the docker image changed from Debian Buster to Debian + Bullseye due to its recent release. +- The docker image now uses python 3.9. +- Added the Luxembourgish locale. Thanks for translating! +- [Daniel Albers](https://github.com/AlD) added support for making the + files and folders ignored by the paperless consume folder scanner + configurable. See `PAPERLESS_CONSUMER_IGNORE_PATTERNS`. ### paperless-ng 1.4.5 This is a maintenance release. -- Updated Python and Angular dependencies. -- Changed the algorithm that changes permissions during startup. This - is still fast, and will hopefully cause less issues. -- Fixed an issue that would sometimes cause paperless to write an - incomplete classification model file to disk. -- Fixed an issue with the OCRmyPDF parser that would always try to - extract text with PDFminer even from non-PDF files. +- Updated Python and Angular dependencies. +- Changed the algorithm that changes permissions during startup. This + is still fast, and will hopefully cause less issues. +- Fixed an issue that would sometimes cause paperless to write an + incomplete classification model file to disk. +- Fixed an issue with the OCRmyPDF parser that would always try to + extract text with PDFminer even from non-PDF files. ### paperless-ng 1.4.4 -- Drastically decreased the startup time of the docker container. The - startup script adjusts file permissions of all data only if changes - are required. -- Paperless mail: Added ability to specify the character set for each - server. -- Document consumption: Ignore Mac OS specific files such as - `.DS_STORE` and `._XXXXX.pdf`. -- Fixed an issue with the automatic matching algorithm that prevents - paperless from consuming new files. -- Updated translations. +- Drastically decreased the startup time of the docker container. The + startup script adjusts file permissions of all data only if changes + are required. +- Paperless mail: Added ability to specify the character set for each + server. +- Document consumption: Ignore Mac OS specific files such as + `.DS_STORE` and `._XXXXX.pdf`. +- Fixed an issue with the automatic matching algorithm that prevents + paperless from consuming new files. +- Updated translations. ### paperless-ng 1.4.3 -- Additions and changes - - Added Swedish locale. - - [Stéphane Brunner](https://github.com/sbrunner) added an option - to disable the progress bars of all management commands. - - [Jo Vandeginste](https://github.com/jovandeginste) added support - for RTF documents to the Apache TIKA parser. - - [Michael Shamoon](https://github.com/shamoon) added dark mode - for the login and logout pages. - - [Alexander Menk](https://github.com/amenk) added additional - stylesheets for printing. You can now print any page of - paperless and the print result will hide the page header, - sidebar, and action buttons. - - Added support for sorting when using full text search. -- Fixes - - [puuu](https://github.com/puuu) fixed - `PAPERLESS_FORCE_SCRIPT_NAME`. You can now host paperless on sub - paths such as `https://localhost:8000/paperless/`. - - Fixed an issue with the document consumer crashing on certain - documents due to issues with pdfminer.six. This library is used - for PDF text extraction. +- Additions and changes + - Added Swedish locale. + - [Stéphane Brunner](https://github.com/sbrunner) added an option + to disable the progress bars of all management commands. + - [Jo Vandeginste](https://github.com/jovandeginste) added support + for RTF documents to the Apache TIKA parser. + - [Michael Shamoon](https://github.com/shamoon) added dark mode + for the login and logout pages. + - [Alexander Menk](https://github.com/amenk) added additional + stylesheets for printing. You can now print any page of + paperless and the print result will hide the page header, + sidebar, and action buttons. + - Added support for sorting when using full text search. +- Fixes + - [puuu](https://github.com/puuu) fixed + `PAPERLESS_FORCE_SCRIPT_NAME`. You can now host paperless on sub + paths such as `https://localhost:8000/paperless/`. + - Fixed an issue with the document consumer crashing on certain + documents due to issues with pdfminer.six. This library is used + for PDF text extraction. ### paperless-ng 1.4.2 -- Fixed an issue with `sudo` that caused paperless to not start on - many Raspberry Pi devices. Thank you - [WhiteHatTux](https://github.com/WhiteHatTux)! +- Fixed an issue with `sudo` that caused paperless to not start on + many Raspberry Pi devices. Thank you + [WhiteHatTux](https://github.com/WhiteHatTux)! ### paperless-ng 1.4.1 -- Added Polish locale. -- Changed some parts of the Dockerfile to hopefully restore - functionality on certain ARM devices. -- Updated python dependencies. -- [Michael Shamoon](https://github.com/shamoon) added a sticky filter - / bulk edit bar. -- [sbrl](https://github.com/sbrl) changed the docker-entrypoint.sh - script to increase compatibility with NFS shares. -- [Chris Nagy](https://github.com/what-name) added support for - creating a super user by passing `PAPERLESS_ADMIN_USER` and - `PAPERLESS_ADMIN_PASSWORD` as environment variables to the docker - container. +- Added Polish locale. +- Changed some parts of the Dockerfile to hopefully restore + functionality on certain ARM devices. +- Updated python dependencies. +- [Michael Shamoon](https://github.com/shamoon) added a sticky filter + / bulk edit bar. +- [sbrl](https://github.com/sbrl) changed the docker-entrypoint.sh + script to increase compatibility with NFS shares. +- [Chris Nagy](https://github.com/what-name) added support for + creating a super user by passing `PAPERLESS_ADMIN_USER` and + `PAPERLESS_ADMIN_PASSWORD` as environment variables to the docker + container. ### paperless-ng 1.4.0 -- Docker images now use tesseract 4.1.1, which should fix a series of - issues with OCR. -- The full text search now displays results using the default document - list. This enables selection, filtering and bulk edit on search - results. -- Changes - - Firefox only: Highlight search query in PDF previews. - - New URL pattern for accessing documents by ASN directly - (/asn/123) - - Added logging when executing pre\* and post-consume scripts. - - Better error logging during document consumption. - - Updated python dependencies. - - Automatically inserts typed text when opening "Create new" - dialogs on the document details page. -- Fixes - - Fixed an issue with null characters in the document content. +- Docker images now use tesseract 4.1.1, which should fix a series of + issues with OCR. +- The full text search now displays results using the default document + list. This enables selection, filtering and bulk edit on search + results. +- Changes + - Firefox only: Highlight search query in PDF previews. + - New URL pattern for accessing documents by ASN directly + (/asn/123) + - Added logging when executing pre\* and post-consume scripts. + - Better error logging during document consumption. + - Updated python dependencies. + - Automatically inserts typed text when opening "Create new" + dialogs on the document details page. +- Fixes + - Fixed an issue with null characters in the document content. !!! note @@ -5746,237 +6140,235 @@ This is a maintenance release. ### paperless-ng 1.3.2 -- Added translation into Portuguese. -- Changes - - The exporter now exports user accounts, mail accounts, mail - rules and saved views as well. -- Fixes - - Minor layout issues with document cards and the log viewer. - - Fixed an issue with any/all/exact matching when characters used - in regular expressions were used for the match. +- Added translation into Portuguese. +- Changes + - The exporter now exports user accounts, mail accounts, mail + rules and saved views as well. +- Fixes + - Minor layout issues with document cards and the log viewer. + - Fixed an issue with any/all/exact matching when characters used + in regular expressions were used for the match. ### paperless-ng 1.3.1 -- Added translation into Spanish and Russian. -- Other changes - - ISO-8601 date format will now always show years with 4 digits. - - Added the ability to search for a document with a specific ASN. - - The document cards now display ASN, types and dates in a more - organized way. - - Added document previews when hovering over the preview button. -- Fixes - - The startup check for write permissions now works properly on - NFS shares. - - Fixed an issue with the search results score indicator. - - Paperless was unable to generate thumbnails for encrypted PDF - files and failed. Paperless will now generate a default - thumbnail for these files. - - Fixed `AUTO_LOGIN_USERNAME`: Unable to perform POST/PUT/DELETE - requests and unable to receive WebSocket messages. +- Added translation into Spanish and Russian. +- Other changes + - ISO-8601 date format will now always show years with 4 digits. + - Added the ability to search for a document with a specific ASN. + - The document cards now display ASN, types and dates in a more + organized way. + - Added document previews when hovering over the preview button. +- Fixes + - The startup check for write permissions now works properly on + NFS shares. + - Fixed an issue with the search results score indicator. + - Paperless was unable to generate thumbnails for encrypted PDF + files and failed. Paperless will now generate a default + thumbnail for these files. + - Fixed `AUTO_LOGIN_USERNAME`: Unable to perform POST/PUT/DELETE + requests and unable to receive WebSocket messages. ### paperless-ng 1.3.0 This release contains new database migrations. -- Changes - - The REST API is versioned from this point onwards. This will - allow me to make changes without breaking existing clients. See - the documentation about [API versioning](api.md#api-versioning) for details. - - Added a color picker for tag colors. - - Added the ability to use the filter for searching the document - content as well. - - Added translations into Italian and Romanian. Thank you! - - Close individual documents from the sidebar. Thanks to [Michael - Shamoon](https://github.com/shamoon). - - [BolkoSchreiber](https://github.com/BolkoSchreiber) added an - option to disable/enable thumbnail inversion in dark mode. - - [Simon Taddiken](https://github.com/skuzzle) added the ability - to customize the header used for remote user authentication with - SSO applications. -- Bug fixes - - Fixed an issue with the auto matching algorithm when more than - 256 tags were used. +- Changes + - The REST API is versioned from this point onwards. This will + allow me to make changes without breaking existing clients. See + the documentation about [API versioning](api.md#api-versioning) for details. + - Added a color picker for tag colors. + - Added the ability to use the filter for searching the document + content as well. + - Added translations into Italian and Romanian. Thank you! + - Close individual documents from the sidebar. Thanks to [Michael + Shamoon](https://github.com/shamoon). + - [BolkoSchreiber](https://github.com/BolkoSchreiber) added an + option to disable/enable thumbnail inversion in dark mode. + - [Simon Taddiken](https://github.com/skuzzle) added the ability + to customize the header used for remote user authentication with + SSO applications. +- Bug fixes + - Fixed an issue with the auto matching algorithm when more than + 256 tags were used. ### paperless-ng 1.2.1 -- [Rodrigo Avelino](https://github.com/rodavelino) translated - Paperless into Portuguese (Brazil)! -- The date input fields now respect the currently selected date - format. -- Added a fancy icon when adding paperless to the home screen on iOS - devices. Thanks to [Joel Nordell](https://github.com/joelnordell). -- When using regular expression matching, the regular expression is - now validated before saving the tag/correspondent/type. -- Regression fix: Dates on the front end did not respect date locale - settings in some cases. +- [Rodrigo Avelino](https://github.com/rodavelino) translated + Paperless into Portuguese (Brazil)! +- The date input fields now respect the currently selected date + format. +- Added a fancy icon when adding paperless to the home screen on iOS + devices. Thanks to [Joel Nordell](https://github.com/joelnordell). +- When using regular expression matching, the regular expression is + now validated before saving the tag/correspondent/type. +- Regression fix: Dates on the front end did not respect date locale + settings in some cases. ### paperless-ng 1.2.0 -- Changes to the OCRmyPDF integration - - Added support for deskewing and automatic rotation of - incorrectly rotated pages. This is enabled by default, see - [OCR settings](configuration.md#ocr). - - Better support for encrypted files. - - Better support for various other PDF files: Paperless will now - attempt to force OCR with safe options when OCR fails with the - configured options. - - Added an explicit option to skip cleaning with `unpaper`. -- Download multiple selected documents as a zip archive. -- The document list now remembers the current page. -- Improved responsiveness when switching between saved views and the - document list. -- Increased the default wait time when observing files in the - consumption folder with polling from 1 to 5 seconds. This will - decrease the likelihood of paperless consuming partially written - files. -- Fixed a crash of the document archiver management command when - trying to process documents with unknown mime types. -- Paperless no longer depends on `libpoppler-cpp-dev`. +- Changes to the OCRmyPDF integration + - Added support for deskewing and automatic rotation of + incorrectly rotated pages. This is enabled by default, see + [OCR settings](configuration.md#ocr). + - Better support for encrypted files. + - Better support for various other PDF files: Paperless will now + attempt to force OCR with safe options when OCR fails with the + configured options. + - Added an explicit option to skip cleaning with `unpaper`. +- Download multiple selected documents as a zip archive. +- The document list now remembers the current page. +- Improved responsiveness when switching between saved views and the + document list. +- Increased the default wait time when observing files in the + consumption folder with polling from 1 to 5 seconds. This will + decrease the likelihood of paperless consuming partially written + files. +- Fixed a crash of the document archiver management command when + trying to process documents with unknown mime types. +- Paperless no longer depends on `libpoppler-cpp-dev`. ### paperless-ng 1.1.4 -- Added English (GB) locale. -- Added ISO-8601 date display option. +- Added English (GB) locale. +- Added ISO-8601 date display option. ### paperless-ng 1.1.3 -- Added a docker-specific configuration option to adjust the number of - worker processes of the web server. See - [Docker options](configuration.md#docker). -- Some more memory usage optimizations. -- Don't show inbox statistics if no inbox tag is defined. +- Added a docker-specific configuration option to adjust the number of + worker processes of the web server. See + [Docker options](configuration.md#docker). +- Some more memory usage optimizations. +- Don't show inbox statistics if no inbox tag is defined. ### paperless-ng 1.1.2 -- Always show top left corner of thumbnails, even for extra wide - documents. -- Added a management command for executing the sanity checker - directly. See [management utilities](administration.md#sanity-checker). -- The weekly sanity check now reports messages in the log files. -- Fixed an issue with the metadata tab not reporting anything in case - of missing files. -- Reverted a change from 1.1.0 that caused huge memory usage due to - redis caching. -- Some memory usage optimizations. +- Always show top left corner of thumbnails, even for extra wide + documents. +- Added a management command for executing the sanity checker + directly. See [management utilities](administration.md#sanity-checker). +- The weekly sanity check now reports messages in the log files. +- Fixed an issue with the metadata tab not reporting anything in case + of missing files. +- Reverted a change from 1.1.0 that caused huge memory usage due to + redis caching. +- Some memory usage optimizations. ### paperless-ng 1.1.1 This release contains new database migrations. -- Fixed a bug in the sanity checker that would cause it to display "x - not in list" errors instead of actual issues. -- Fixed a bug with filename generation for archive filenames that - would cause the archive files of two documents to overlap. - - This happened when `PAPERLESS_FILENAME_FORMAT` is used and the - filenames of two or more documents are the same, except for the - file extension. - - Paperless will now store the archive filename in the database as - well instead of deriving it from the original filename, and use - the same logic for detecting and avoiding filename clashes - that's also used for original filenames. - - The migrations will repair any missing archive files. If you're - using tika, ensure that tika is running while performing the - migration. Docker-compose will take care of that. -- Fixed a bug with thumbnail regeneration when TIKA integration was - used. -- Added ASN as a placeholder field to the filename format. -- The docker image now comes with built-in shortcuts for most - management commands. These are now the recommended way to execute - management commands, since these also ensure that they're always - executed as the paperless user and you're less likely to run into - permission issues. See - [management commands](administration.md#management-commands). +- Fixed a bug in the sanity checker that would cause it to display "x + not in list" errors instead of actual issues. +- Fixed a bug with filename generation for archive filenames that + would cause the archive files of two documents to overlap. + - This happened when `PAPERLESS_FILENAME_FORMAT` is used and the + filenames of two or more documents are the same, except for the + file extension. + - Paperless will now store the archive filename in the database as + well instead of deriving it from the original filename, and use + the same logic for detecting and avoiding filename clashes + that's also used for original filenames. + - The migrations will repair any missing archive files. If you're + using tika, ensure that tika is running while performing the + migration. Docker-compose will take care of that. +- Fixed a bug with thumbnail regeneration when TIKA integration was + used. +- Added ASN as a placeholder field to the filename format. +- The docker image now comes with built-in shortcuts for most + management commands. These are now the recommended way to execute + management commands, since these also ensure that they're always + executed as the paperless user and you're less likely to run into + permission issues. See + [management commands](administration.md#management-commands). ### paperless-ng 1.1.0 -- Document processing status - - - Paperless now shows the status of processing documents on the - dashboard in real time. - - Status notifications when - - New documents are detected in the consumption folder, in - mails, uploaded on the front end, or added with one of the - mobile apps. - - Documents are successfully added to paperless. - - Document consumption failed (with error messages) - - Configuration options to enable/disable individual - notifications. - -- Live updates to document lists and saved views when new documents - are added. - - !!! tip - - For status notifications and live updates to work, paperless now - requires an [ASGI](https://asgi.readthedocs.io/en/latest/)-enabled - web server. The docker images uses `gunicorn` and an ASGI-enabled - worker called [uvicorn](https://www.uvicorn.org/), and there is no - need to configure anything. - - For bare metal installations, changes are required for the - notifications to work. Adapt the service - `paperless-webserver.service` to use the supplied `gunicorn.conf.py` - configuration file and adapt the reference to the ASGI application - as follows: - - ``` - ExecStart=/opt/paperless/.local/bin/gunicorn -c /opt/paperless/gunicorn.conf.py paperless.asgi:application - ``` - - Paperless will continue to work with WSGI, but you will not get any - status notifications. - -- Paperless now offers suggestions for tags, correspondents and types - on the document detail page. - -- Added an interactive easy install script that automatically - downloads, configures and starts paperless with docker. - -- Official support for Python 3.9. - -- Other changes and fixes - - - Adjusted the default parallelization settings to run more than - one task in parallel on systems with 4 or less cores. This - addresses issues with paperless not consuming any new files when - other tasks are running. - - Fixed a rare race condition that would cause paperless to - process incompletely written files when using the upload on the - dashboard. - - The document classifier no longer issues warnings and errors - when auto matching is not used at all. - - Better icon for document previews. - - Better info section in the side bar. - - Paperless no longer logs to the database. Instead, logs are - written to rotating log files. This solves many "database is - locked" issues on Raspberry Pi, especially when SQLite is used. - - By default, log files are written to `PAPERLESS_DATA_DIR/log/`. - Logging settings can be adjusted with `PAPERLESS_LOGGING_DIR`, - `PAPERLESS_LOGROTATE_MAX_SIZE` and - `PAPERLESS_LOGROTATE_MAX_BACKUPS`. +- Document processing status + - Paperless now shows the status of processing documents on the + dashboard in real time. + - Status notifications when + - New documents are detected in the consumption folder, in + mails, uploaded on the front end, or added with one of the + mobile apps. + - Documents are successfully added to paperless. + - Document consumption failed (with error messages) + - Configuration options to enable/disable individual + notifications. + +- Live updates to document lists and saved views when new documents + are added. + + !!! tip + + For status notifications and live updates to work, paperless now + requires an [ASGI](https://asgi.readthedocs.io/en/latest/)-enabled + web server. The docker images uses `gunicorn` and an ASGI-enabled + worker called [uvicorn](https://www.uvicorn.org/), and there is no + need to configure anything. + + For bare metal installations, changes are required for the + notifications to work. Adapt the service + `paperless-webserver.service` to use the supplied `gunicorn.conf.py` + configuration file and adapt the reference to the ASGI application + as follows: + + ``` + ExecStart=/opt/paperless/.local/bin/gunicorn -c /opt/paperless/gunicorn.conf.py paperless.asgi:application + ``` + + Paperless will continue to work with WSGI, but you will not get any + status notifications. + +- Paperless now offers suggestions for tags, correspondents and types + on the document detail page. + +- Added an interactive easy install script that automatically + downloads, configures and starts paperless with docker. + +- Official support for Python 3.9. + +- Other changes and fixes + - Adjusted the default parallelization settings to run more than + one task in parallel on systems with 4 or less cores. This + addresses issues with paperless not consuming any new files when + other tasks are running. + - Fixed a rare race condition that would cause paperless to + process incompletely written files when using the upload on the + dashboard. + - The document classifier no longer issues warnings and errors + when auto matching is not used at all. + - Better icon for document previews. + - Better info section in the side bar. + - Paperless no longer logs to the database. Instead, logs are + written to rotating log files. This solves many "database is + locked" issues on Raspberry Pi, especially when SQLite is used. + - By default, log files are written to `PAPERLESS_DATA_DIR/log/`. + Logging settings can be adjusted with `PAPERLESS_LOGGING_DIR`, + `PAPERLESS_LOGROTATE_MAX_SIZE` and + `PAPERLESS_LOGROTATE_MAX_BACKUPS`. ### paperless-ng 1.0.0 Nothing special about this release, but since there are relatively few bug reports coming in, I think that this is reasonably stable. -- Document export - - The document exporter has been rewritten to support updating an - already existing export in place. This enables incremental - backups with `rsync`. - - The document exporter supports naming exported files according - to `PAPERLESS_FILENAME_FORMAT`. - - The document exporter locks the media directory and the database - during execution to ensure that the resulting export is - consistent. - - See the [updated documentation](administration.md#exporter) for more details. -- Other changes and additions - - Added a language selector to the settings. - - Added date format options to the settings. - - Range selection with shift clicking is now possible in the - document list. - - Filtering correspondent, type and tag management pages by name. - - Focus "Name" field in dialogs by default. +- Document export + - The document exporter has been rewritten to support updating an + already existing export in place. This enables incremental + backups with `rsync`. + - The document exporter supports naming exported files according + to `PAPERLESS_FILENAME_FORMAT`. + - The document exporter locks the media directory and the database + during execution to ensure that the resulting export is + consistent. + - See the [updated documentation](administration.md#exporter) for more details. +- Other changes and additions + - Added a language selector to the settings. + - Added date format options to the settings. + - Range selection with shift clicking is now possible in the + document list. + - Filtering correspondent, type and tag management pages by name. + - Focus "Name" field in dialogs by default. ### paperless-ng 0.9.14 @@ -5984,157 +6376,157 @@ Starting with this version, releases are getting built automatically. This release also comes with changes on how to install and update paperless. -- Paperless now uses GitHub Actions to make releases and build docker - images. - - Docker images are available for amd64, armhf, and aarch64. - - When you pull an image from Docker Hub, Docker will - automatically select the correct image for you. -- Changes to docker installations and updates - - The `-dockerfiles.tar.xz` release archive is gone. Instead, - simply grab the docker files from `/docker/compose` in the - repository if you wish to install paperless by pulling from the - hub. - - The docker compose files in `/docker/compose` were changed to - always use the `latest` version automatically. In order to do - further updates, simply do a `docker-compose pull`. The - documentation has been updated. - - The docker compose files were changed to restart paperless on - system boot only if it was running before shutdown. - - Documentation of the docker-compose files about what they do. -- Changes to bare metal installations and updates - - The release archive is built exactly like before. However, the - release now comes with already compiled translation messages and - collected static files. Therefore, the update steps - `compilemessages` and `collectstatic` are now obsolete. -- Other changes - - A new configuration option `PAPERLESS_IGNORE_DATES` was added by - [jayme-github](http://github.com/jayme-github). This can be used - to instruct paperless to ignore certain dates (such as your date - of birth) when guessing the date from the document content. This - was actually introduced in 0.9.12, I just forgot to mention it - in the changelog. - - The filter drop downs now display selected entries on top of all - other entries. - - The PostgreSQL client now supports setting an explicit `sslmode` - to force encryption of the connection to PostgreSQL. - - The docker images now come with `jbig2enc`, which is a lossless - image encoder for PDF documents and decreases the size of - certain PDF/A documents. - - When using any of the manual matching algorithms, paperless now - logs messages about when and why these matching algorithms - matched. - - The default settings for parallelization in paperless were - adjusted to always leave one CPU core free. - - Added an option to the frontend to choose which method to use - for displaying PDF documents. -- Fixes - - An issue with the tika parser not picking up files from the - consumption directory was fixed. - - A couple changes to the dark mode and fixes to several other - layout issues. - - An issue with the drop downs for correspondents, tags and types - not properly supporting filtering with special characters was - fixed. - - Fixed an issue with filenames of downloaded files: Dates where - off by one day due to timezone issues. - - Searching will continue to work even when the index returns - non-existing documents. This resulted in "Document does not - exist" errors before. Instead, a warning is logged, indicating - the issue. - - An issue with the consumer crashing when invalid regular - expression were used was fixed. +- Paperless now uses GitHub Actions to make releases and build docker + images. + - Docker images are available for amd64, armhf, and aarch64. + - When you pull an image from Docker Hub, Docker will + automatically select the correct image for you. +- Changes to docker installations and updates + - The `-dockerfiles.tar.xz` release archive is gone. Instead, + simply grab the docker files from `/docker/compose` in the + repository if you wish to install paperless by pulling from the + hub. + - The docker compose files in `/docker/compose` were changed to + always use the `latest` version automatically. In order to do + further updates, simply do a `docker-compose pull`. The + documentation has been updated. + - The docker compose files were changed to restart paperless on + system boot only if it was running before shutdown. + - Documentation of the docker-compose files about what they do. +- Changes to bare metal installations and updates + - The release archive is built exactly like before. However, the + release now comes with already compiled translation messages and + collected static files. Therefore, the update steps + `compilemessages` and `collectstatic` are now obsolete. +- Other changes + - A new configuration option `PAPERLESS_IGNORE_DATES` was added by + [jayme-github](http://github.com/jayme-github). This can be used + to instruct paperless to ignore certain dates (such as your date + of birth) when guessing the date from the document content. This + was actually introduced in 0.9.12, I just forgot to mention it + in the changelog. + - The filter drop downs now display selected entries on top of all + other entries. + - The PostgreSQL client now supports setting an explicit `sslmode` + to force encryption of the connection to PostgreSQL. + - The docker images now come with `jbig2enc`, which is a lossless + image encoder for PDF documents and decreases the size of + certain PDF/A documents. + - When using any of the manual matching algorithms, paperless now + logs messages about when and why these matching algorithms + matched. + - The default settings for parallelization in paperless were + adjusted to always leave one CPU core free. + - Added an option to the frontend to choose which method to use + for displaying PDF documents. +- Fixes + - An issue with the tika parser not picking up files from the + consumption directory was fixed. + - A couple changes to the dark mode and fixes to several other + layout issues. + - An issue with the drop downs for correspondents, tags and types + not properly supporting filtering with special characters was + fixed. + - Fixed an issue with filenames of downloaded files: Dates where + off by one day due to timezone issues. + - Searching will continue to work even when the index returns + non-existing documents. This resulted in "Document does not + exist" errors before. Instead, a warning is logged, indicating + the issue. + - An issue with the consumer crashing when invalid regular + expression were used was fixed. ### paperless-ng 0.9.13 -- Fixed an issue with Paperless not starting due to the new Tika - integration when `USERMAP_UID` and `USERMAP_GID` was used in the - `docker-compose.env` file. +- Fixed an issue with Paperless not starting due to the new Tika + integration when `USERMAP_UID` and `USERMAP_GID` was used in the + `docker-compose.env` file. ### paperless-ng 0.9.12 -- Paperless localization - - Thanks to the combined efforts of many users, Paperless is now - available in English, Dutch, French and German. -- Thanks to [Jo Vandeginste](https://github.com/jovandeginste), - Paperless has optional support for Office documents such as .docx, - .doc, .odt and more. - - See the [Tika settings](configuration.md#tika) on how to enable this - feature. This feature requires two additional services (one for - parsing Office documents and metadata extraction and another for - converting Office documents to PDF), and is therefore not enabled - on default installations. - - As with all other documents, paperless converts Office documents - to PDF and stores both the original as well as the archived PDF. -- Dark mode - - Thanks to [Michael Shamoon](https://github.com/shamoon), - paperless now has a dark mode. Configuration is available in the - settings. -- Other changes and additions - - The PDF viewer now uses a local copy of some dependencies - instead of fetching them from the internet. Thanks to - [slorenz](https://github.com/sisao). - - Revamped search bar styling thanks to [Michael - Shamoon](https://github.com/shamoon). - - Sorting in the document list by clicking on table headers. - - A button was added to the document detail page that assigns a - new ASN to a document. - - Form field validation: When providing invalid input in a form - (such as a duplicate ASN or no name), paperless now has visual - indicators and clearer error messages about what's wrong. - - Paperless disables buttons with network actions (such as save - and delete) when a network action is active. This indicates that - something is happening and prevents double clicking. - - When using "Save & next", the title field is focussed - automatically to better support keyboard editing. - - E-Mail: Added filter rule parameters to allow inline attachments - (watch out for mails with inlined images!) and attachment - filename filters with wildcards. - - Support for remote user authentication thanks to [Michael - Shamoon](https://github.com/shamoon). This is useful for hiding - Paperless behind single sign on applications such as - [authelia](https://www.authelia.com/). - - "Clear filters" has been renamed to "Reset filters" and now - correctly restores the default filters on saved views. Thanks to - [Michael Shamoon](https://github.com/shamoon) -- Fixes - - Paperless was unable to save views when "Not assigned" was - chosen in one of the filter dropdowns. - - Clearer error messages when pre and post consumption scripts do - not exist. - - The post consumption script is executed later in the consumption - process. Before the change, an ID was passed to the script - referring to a document that did not yet exist in the database. +- Paperless localization + - Thanks to the combined efforts of many users, Paperless is now + available in English, Dutch, French and German. +- Thanks to [Jo Vandeginste](https://github.com/jovandeginste), + Paperless has optional support for Office documents such as .docx, + .doc, .odt and more. + - See the [Tika settings](configuration.md#tika) on how to enable this + feature. This feature requires two additional services (one for + parsing Office documents and metadata extraction and another for + converting Office documents to PDF), and is therefore not enabled + on default installations. + - As with all other documents, paperless converts Office documents + to PDF and stores both the original as well as the archived PDF. +- Dark mode + - Thanks to [Michael Shamoon](https://github.com/shamoon), + paperless now has a dark mode. Configuration is available in the + settings. +- Other changes and additions + - The PDF viewer now uses a local copy of some dependencies + instead of fetching them from the internet. Thanks to + [slorenz](https://github.com/sisao). + - Revamped search bar styling thanks to [Michael + Shamoon](https://github.com/shamoon). + - Sorting in the document list by clicking on table headers. + - A button was added to the document detail page that assigns a + new ASN to a document. + - Form field validation: When providing invalid input in a form + (such as a duplicate ASN or no name), paperless now has visual + indicators and clearer error messages about what's wrong. + - Paperless disables buttons with network actions (such as save + and delete) when a network action is active. This indicates that + something is happening and prevents double clicking. + - When using "Save & next", the title field is focussed + automatically to better support keyboard editing. + - E-Mail: Added filter rule parameters to allow inline attachments + (watch out for mails with inlined images!) and attachment + filename filters with wildcards. + - Support for remote user authentication thanks to [Michael + Shamoon](https://github.com/shamoon). This is useful for hiding + Paperless behind single sign on applications such as + [authelia](https://www.authelia.com/). + - "Clear filters" has been renamed to "Reset filters" and now + correctly restores the default filters on saved views. Thanks to + [Michael Shamoon](https://github.com/shamoon) +- Fixes + - Paperless was unable to save views when "Not assigned" was + chosen in one of the filter dropdowns. + - Clearer error messages when pre and post consumption scripts do + not exist. + - The post consumption script is executed later in the consumption + process. Before the change, an ID was passed to the script + referring to a document that did not yet exist in the database. ### paperless-ng 0.9.11 -- Fixed an issue with the docker image not starting at all due to a - configuration change of the web server. +- Fixed an issue with the docker image not starting at all due to a + configuration change of the web server. ### paperless-ng 0.9.10 -- Bulk editing - - Thanks to [Michael Shamoon](https://github.com/shamoon), we've - got a new interface for the bulk editor. - - There are some configuration options in the settings to alter - the behavior. -- Other changes and additions - - Thanks to [zjean](https://github.com/zjean), paperless now - publishes a webmanifest, which is useful for adding the - application to home screens on mobile devices. - - The Paperless-ng logo now navigates to the dashboard. - - Filter for documents that don't have any correspondents, types - or tags assigned. - - Tags, types and correspondents are now sorted case insensitive. - - Lots of preparation work for localization support. -- Fixes - - Added missing dependencies for Raspberry Pi builds. - - Fixed an issue with plain text file consumption: Thumbnail - generation failed due to missing fonts. - - An issue with the search index reporting missing documents after - bulk deletes was fixed. - - Issue with the tag selector not clearing input correctly. - - The consumer used to stop working when encountering an - incomplete classifier model file. +- Bulk editing + - Thanks to [Michael Shamoon](https://github.com/shamoon), we've + got a new interface for the bulk editor. + - There are some configuration options in the settings to alter + the behavior. +- Other changes and additions + - Thanks to [zjean](https://github.com/zjean), paperless now + publishes a webmanifest, which is useful for adding the + application to home screens on mobile devices. + - The Paperless-ng logo now navigates to the dashboard. + - Filter for documents that don't have any correspondents, types + or tags assigned. + - Tags, types and correspondents are now sorted case insensitive. + - Lots of preparation work for localization support. +- Fixes + - Added missing dependencies for Raspberry Pi builds. + - Fixed an issue with plain text file consumption: Thumbnail + generation failed due to missing fonts. + - An issue with the search index reporting missing documents after + bulk deletes was fixed. + - Issue with the tag selector not clearing input correctly. + - The consumer used to stop working when encountering an + incomplete classifier model file. !!! note @@ -6151,131 +6543,131 @@ paperless. Christmas release! -- Bulk editing - - Paperless now supports bulk editing. - - The following operations are available: Add and remove - correspondents, tags, document types from selected documents, as - well as mass-deleting documents. - - We've got a more fancy UI in the works that makes these - features more accessible, but that's not quite ready yet. -- Searching - - Paperless now supports searching for similar documents ("More - like this") both from the document detail page as well as from - individual search results. - - A search score indicates how well a document matches the search - query, or how similar a document is to a given reference - document. -- Other additions and changes - - Clarification in the UI that the fields "Match" and "Is - insensitive" are not relevant for the Auto matching algorithm. - - New select interface for tags, types and correspondents allows - filtering. This also improves tag selection. Thanks again to - [Michael Shamoon](https://github.com/shamoon)! - - Page navigation controls for the document viewer, thanks to - [Michael Shamoon](https://github.com/shamoon). - - Layout changes to the small cards document list. - - The dashboard now displays the username (or full name if - specified in the admin) on the dashboard. -- Fixes - - An error that caused the document importer to crash was fixed. - - An issue with changes not being possible when - `PAPERLESS_COOKIE_PREFIX` is used was fixed. - - The date selection filters now allow manual entry of dates. -- Feature Removal - - Most of the guesswork features have been removed. Paperless no - longer tries to extract correspondents and tags from file names. +- Bulk editing + - Paperless now supports bulk editing. + - The following operations are available: Add and remove + correspondents, tags, document types from selected documents, as + well as mass-deleting documents. + - We've got a more fancy UI in the works that makes these + features more accessible, but that's not quite ready yet. +- Searching + - Paperless now supports searching for similar documents ("More + like this") both from the document detail page as well as from + individual search results. + - A search score indicates how well a document matches the search + query, or how similar a document is to a given reference + document. +- Other additions and changes + - Clarification in the UI that the fields "Match" and "Is + insensitive" are not relevant for the Auto matching algorithm. + - New select interface for tags, types and correspondents allows + filtering. This also improves tag selection. Thanks again to + [Michael Shamoon](https://github.com/shamoon)! + - Page navigation controls for the document viewer, thanks to + [Michael Shamoon](https://github.com/shamoon). + - Layout changes to the small cards document list. + - The dashboard now displays the username (or full name if + specified in the admin) on the dashboard. +- Fixes + - An error that caused the document importer to crash was fixed. + - An issue with changes not being possible when + `PAPERLESS_COOKIE_PREFIX` is used was fixed. + - The date selection filters now allow manual entry of dates. +- Feature Removal + - Most of the guesswork features have been removed. Paperless no + longer tries to extract correspondents and tags from file names. ### paperless-ng 0.9.8 This release addresses two severe issues with the previous release. -- The delete buttons for document types, correspondents and tags were - not working. -- The document section in the admin was causing internal server errors - (500). +- The delete buttons for document types, correspondents and tags were + not working. +- The document section in the admin was causing internal server errors + (500). ### paperless-ng 0.9.7 -- Front end - - Thanks to the hard work of [Michael - Shamoon](https://github.com/shamoon), paperless now comes with a - much more streamlined UI for filtering documents. - - [Michael Shamoon](https://github.com/shamoon) replaced the - document preview with another component. This should fix - compatibility with Safari browsers. - - Added buttons to the management pages to quickly show all - documents with one specific tag, correspondent, or title. - - Paperless now stores your saved views on the server and - associates them with your user account. This means that you can - access your views on multiple devices and have separate views - for different users. You will have to recreate your views. - - The GitHub and documentation links now open in new tabs/windows. - Thanks to [rYR79435](https://github.com/rYR79435). - - Paperless now generates default saved view names when saving - views with certain filter rules. - - Added a small version indicator to the front end. -- Other additions and changes - - The new filename format field `{tag_list}` inserts a list of - tags into the filename, separated by comma. - - The `document_retagger` no longer removes inbox tags or tags - without matching rules. - - The new configuration option `PAPERLESS_COOKIE_PREFIX` allows - you to run multiple instances of paperless on different ports. - This option enables you to be logged in into multiple instances - by specifying different cookie names for each instance. -- Fixes - - Sometimes paperless would assign dates in the future to newly - consumed documents. - - The filename format fields `{created_month}` and `{created_day}` - now use a leading zero for single digit values. - - The filename format field `{tags}` can no longer be used without - arguments. - - Paperless was not able to consume many images (especially images - from mobile scanners) due to missing DPI information. Paperless - now assumes A4 paper size for PDF generation if no DPI - information is present. - - Documents with empty titles could not be opened from the table - view due to the link being empty. - - Fixed an issue with filenames containing special characters such - as `:` not being accepted for upload. - - Fixed issues with thumbnail generation for plain text files. +- Front end + - Thanks to the hard work of [Michael + Shamoon](https://github.com/shamoon), paperless now comes with a + much more streamlined UI for filtering documents. + - [Michael Shamoon](https://github.com/shamoon) replaced the + document preview with another component. This should fix + compatibility with Safari browsers. + - Added buttons to the management pages to quickly show all + documents with one specific tag, correspondent, or title. + - Paperless now stores your saved views on the server and + associates them with your user account. This means that you can + access your views on multiple devices and have separate views + for different users. You will have to recreate your views. + - The GitHub and documentation links now open in new tabs/windows. + Thanks to [rYR79435](https://github.com/rYR79435). + - Paperless now generates default saved view names when saving + views with certain filter rules. + - Added a small version indicator to the front end. +- Other additions and changes + - The new filename format field `{tag_list}` inserts a list of + tags into the filename, separated by comma. + - The `document_retagger` no longer removes inbox tags or tags + without matching rules. + - The new configuration option `PAPERLESS_COOKIE_PREFIX` allows + you to run multiple instances of paperless on different ports. + This option enables you to be logged in into multiple instances + by specifying different cookie names for each instance. +- Fixes + - Sometimes paperless would assign dates in the future to newly + consumed documents. + - The filename format fields `{created_month}` and `{created_day}` + now use a leading zero for single digit values. + - The filename format field `{tags}` can no longer be used without + arguments. + - Paperless was not able to consume many images (especially images + from mobile scanners) due to missing DPI information. Paperless + now assumes A4 paper size for PDF generation if no DPI + information is present. + - Documents with empty titles could not be opened from the table + view due to the link being empty. + - Fixed an issue with filenames containing special characters such + as `:` not being accepted for upload. + - Fixed issues with thumbnail generation for plain text files. ### paperless-ng 0.9.6 This release focusses primarily on many small issues with the UI. -- Front end - - Paperless now has proper window titles. - - Fixed an issue with the small cards when more than 7 tags were - used. - - Navigation of the "Show all" links adjusted. They navigate to - the saved view now, if available in the sidebar. - - Some indication on the document lists that a filter is active - was added. - - There's a new filter to filter for documents that do _not_ have - a certain tag. - - The file upload box now shows upload progress. - - The document edit page was reorganized. - - The document edit page shows various information about a - document. - - An issue with the height of the preview was fixed. - - Table issues with too long document titles fixed. -- API - - The API now serves file names with documents. - - The API now serves various metadata about documents. - - API documentation updated. -- Other - - Fixed an issue with the docker image when a non-standard - PostgreSQL port was used. - - The docker image was trying check for installed languages before - actually installing them. - - `FILENAME_FORMAT` placeholder for document types. - - The filename formatter is now less restrictive with file names - and tries to conserve the original correspondents, types and - titles as much as possible. - - The filename formatter does not include the document ID in - filenames anymore. It will rather append `_01`, `_02`, etc when - it detects duplicate filenames. +- Front end + - Paperless now has proper window titles. + - Fixed an issue with the small cards when more than 7 tags were + used. + - Navigation of the "Show all" links adjusted. They navigate to + the saved view now, if available in the sidebar. + - Some indication on the document lists that a filter is active + was added. + - There's a new filter to filter for documents that do _not_ have + a certain tag. + - The file upload box now shows upload progress. + - The document edit page was reorganized. + - The document edit page shows various information about a + document. + - An issue with the height of the preview was fixed. + - Table issues with too long document titles fixed. +- API + - The API now serves file names with documents. + - The API now serves various metadata about documents. + - API documentation updated. +- Other + - Fixed an issue with the docker image when a non-standard + PostgreSQL port was used. + - The docker image was trying check for installed languages before + actually installing them. + - `FILENAME_FORMAT` placeholder for document types. + - The filename formatter is now less restrictive with file names + and tries to conserve the original correspondents, types and + titles as much as possible. + - The filename formatter does not include the document ID in + filenames anymore. It will rather append `_01`, `_02`, etc when + it detects duplicate filenames. !!! note @@ -6289,450 +6681,450 @@ This release concludes the big changes I wanted to get rolled into paperless. The next releases before 1.0 will focus on fixing issues, primarily. -- OCR - - Paperless now uses - [OCRmyPDF](https://github.com/jbarlow83/OCRmyPDF) to perform OCR - on documents. It still uses tesseract under the hood, but the - PDF parser of Paperless has changed considerably and will behave - different for some documents. - - OCRmyPDF creates archived PDF/A documents with embedded text - that can be selected in the front end. - - Paperless stores archived versions of documents alongside with - the originals. The originals can be accessed on the document - edit page. If available, a dropdown menu will appear next to the - download button. - - Many of the configuration options regarding OCR have changed. - See [OCR settings](configuration.md#ocr) for details. - - Paperless no longer guesses the language of your documents. It - always uses the language that you specified with - `PAPERLESS_OCR_LANGUAGE`. Be sure to set this to the language - the majority of your documents are in. Multiple languages can be - specified, but that requires more CPU time. - - The management command [`document_archiver`](administration.md#archiver) - can be used to create archived versions for already existing documents. -- Tags from consumption folder. - - Thanks to [jayme-github](https://github.com/jayme-github), - paperless now consumes files from sub folders in the consumption - folder and is able to assign tags based on the sub folders a - document was found in. This can be configured with - `PAPERLESS_CONSUMER_RECURSIVE` and - `PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS`. -- API - - The API now offers token authentication. - - The endpoint for uploading documents now supports specifying - custom titles, correspondents, tags and types. This can be used - by clients to override the default behavior of paperless. See - [POSTing documents](api.md#file-uploads). - - The document endpoint of API now serves documents in this form: - - correspondents, document types and tags are referenced by - their ID in the fields `correspondent`, `document_type` and - `tags`. The `*_id` versions are gone. These fields are - read/write. - - paperless does not serve nested tags, correspondents or - types anymore. -- Front end - - Paperless does some basic caching of correspondents, tags and - types and will only request them from the server when necessary - or when entirely reloading the page. - - Document list fetching is about 10%-30% faster now, especially - when lots of tags/correspondents are present. - - Some minor improvements to the front end, such as document count - in the document list, better highlighting of the current page, - and improvements to the filter behavior. -- Fixes: - - A bug with the generation of filenames for files with - unsupported types caused the exporter and document saving to - crash. - - Mail handling no longer exits entirely when encountering errors. - It will skip the account/rule/message on which the error - occurred. - - Assigning correspondents from mail sender names failed for very - long names. Paperless no longer assigns correspondents in these - cases. +- OCR + - Paperless now uses + [OCRmyPDF](https://github.com/jbarlow83/OCRmyPDF) to perform OCR + on documents. It still uses tesseract under the hood, but the + PDF parser of Paperless has changed considerably and will behave + different for some documents. + - OCRmyPDF creates archived PDF/A documents with embedded text + that can be selected in the front end. + - Paperless stores archived versions of documents alongside with + the originals. The originals can be accessed on the document + edit page. If available, a dropdown menu will appear next to the + download button. + - Many of the configuration options regarding OCR have changed. + See [OCR settings](configuration.md#ocr) for details. + - Paperless no longer guesses the language of your documents. It + always uses the language that you specified with + `PAPERLESS_OCR_LANGUAGE`. Be sure to set this to the language + the majority of your documents are in. Multiple languages can be + specified, but that requires more CPU time. + - The management command [`document_archiver`](administration.md#archiver) + can be used to create archived versions for already existing documents. +- Tags from consumption folder. + - Thanks to [jayme-github](https://github.com/jayme-github), + paperless now consumes files from sub folders in the consumption + folder and is able to assign tags based on the sub folders a + document was found in. This can be configured with + `PAPERLESS_CONSUMER_RECURSIVE` and + `PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS`. +- API + - The API now offers token authentication. + - The endpoint for uploading documents now supports specifying + custom titles, correspondents, tags and types. This can be used + by clients to override the default behavior of paperless. See + [POSTing documents](api.md#file-uploads). + - The document endpoint of API now serves documents in this form: + - correspondents, document types and tags are referenced by + their ID in the fields `correspondent`, `document_type` and + `tags`. The `*_id` versions are gone. These fields are + read/write. + - paperless does not serve nested tags, correspondents or + types anymore. +- Front end + - Paperless does some basic caching of correspondents, tags and + types and will only request them from the server when necessary + or when entirely reloading the page. + - Document list fetching is about 10%-30% faster now, especially + when lots of tags/correspondents are present. + - Some minor improvements to the front end, such as document count + in the document list, better highlighting of the current page, + and improvements to the filter behavior. +- Fixes: + - A bug with the generation of filenames for files with + unsupported types caused the exporter and document saving to + crash. + - Mail handling no longer exits entirely when encountering errors. + It will skip the account/rule/message on which the error + occurred. + - Assigning correspondents from mail sender names failed for very + long names. Paperless no longer assigns correspondents in these + cases. ### paperless-ng 0.9.4 -- Searching: - - Paperless now supports searching by tags, types and dates and - correspondents. In order to have this applied to your existing - documents, you need to perform a `document_index reindex` - management command (see [document search index](administration.md#index)) - that adds the data to the search index. You only need to do this - once, since the schema of the search index changed. Paperless - keeps the index updated after that whenever something changes. - - Paperless now has spelling corrections ("Did you mean") for - miss-typed queries. - - The documentation contains - [information about the query syntax](usage.md#basic-usage_searching). -- Front end: - - Clickable tags, correspondents and types allow quick filtering - for related documents. - - Saved views are now editable. - - Preview documents directly in the browser. - - Navigation from the dashboard to saved views. -- Fixes: - - A severe error when trying to use post consume scripts. - - An error in the consumer that cause invalid messages of missing - files to show up in the log. -- The documentation now contains information about bare metal installs - and a section about how to setup the development environment. +- Searching: + - Paperless now supports searching by tags, types and dates and + correspondents. In order to have this applied to your existing + documents, you need to perform a `document_index reindex` + management command (see [document search index](administration.md#index)) + that adds the data to the search index. You only need to do this + once, since the schema of the search index changed. Paperless + keeps the index updated after that whenever something changes. + - Paperless now has spelling corrections ("Did you mean") for + miss-typed queries. + - The documentation contains + [information about the query syntax](usage.md#basic-usage_searching). +- Front end: + - Clickable tags, correspondents and types allow quick filtering + for related documents. + - Saved views are now editable. + - Preview documents directly in the browser. + - Navigation from the dashboard to saved views. +- Fixes: + - A severe error when trying to use post consume scripts. + - An error in the consumer that cause invalid messages of missing + files to show up in the log. +- The documentation now contains information about bare metal installs + and a section about how to setup the development environment. ### paperless-ng 0.9.3 -- Setting `PAPERLESS_AUTO_LOGIN_USERNAME` replaces - `PAPERLESS_DISABLE_LOGIN`. You have to specify your username. -- Added a simple sanity checker that checks your documents for missing - or orphaned files, files with wrong checksums, inaccessible files, - and documents with empty content. -- It is no longer possible to encrypt your documents. For the time - being, paperless will continue to operate with already encrypted - documents. -- Fixes: - - Paperless now uses inotify again, since the watchdog was causing - issues which I was not aware of. - - Issue with the automatic classifier not working with only one - tag. - - A couple issues with the search index being opened to eagerly. -- Added lots of tests for various parts of the application. +- Setting `PAPERLESS_AUTO_LOGIN_USERNAME` replaces + `PAPERLESS_DISABLE_LOGIN`. You have to specify your username. +- Added a simple sanity checker that checks your documents for missing + or orphaned files, files with wrong checksums, inaccessible files, + and documents with empty content. +- It is no longer possible to encrypt your documents. For the time + being, paperless will continue to operate with already encrypted + documents. +- Fixes: + - Paperless now uses inotify again, since the watchdog was causing + issues which I was not aware of. + - Issue with the automatic classifier not working with only one + tag. + - A couple issues with the search index being opened to eagerly. +- Added lots of tests for various parts of the application. ### paperless-ng 0.9.2 -- Major changes to the front end (colors, logo, shadows, layout of the - cards, better mobile support) -- Paperless now uses mime types and libmagic detection to determine if - a file type is supported and which parser to use. Removes all file - type checks that where present in MANY different places in - paperless. -- Mail consumer now correctly consumes documents even when their - content type was not set correctly. (i.e. PDF documents with content - type `application/octet-stream`) -- Basic sorting of mail rules added -- Much better admin for mail rule editing. -- Docker entrypoint script awaits the database server if it is - configured. -- Disabled editing of logs. -- New setting `PAPERLESS_OCR_PAGES` limits the tesseract parser to the - first n pages of scanned documents. -- Fixed a bug where tasks with too long task names would not show up - in the admin. +- Major changes to the front end (colors, logo, shadows, layout of the + cards, better mobile support) +- Paperless now uses mime types and libmagic detection to determine if + a file type is supported and which parser to use. Removes all file + type checks that where present in MANY different places in + paperless. +- Mail consumer now correctly consumes documents even when their + content type was not set correctly. (i.e. PDF documents with content + type `application/octet-stream`) +- Basic sorting of mail rules added +- Much better admin for mail rule editing. +- Docker entrypoint script awaits the database server if it is + configured. +- Disabled editing of logs. +- New setting `PAPERLESS_OCR_PAGES` limits the tesseract parser to the + first n pages of scanned documents. +- Fixed a bug where tasks with too long task names would not show up + in the admin. ### paperless-ng 0.9.1 -- Moved documentation of the settings to the actual documentation. -- Updated release script to force the user to choose between SQLite - and PostgreSQL. This avoids confusion when upgrading from paperless. +- Moved documentation of the settings to the actual documentation. +- Updated release script to force the user to choose between SQLite + and PostgreSQL. This avoids confusion when upgrading from paperless. ### paperless-ng 0.9.0 -- **Deprecated:** GnuPG. [See this note on the state of GnuPG in paperless-ng.](administration.md#encryption) - This features will most likely be removed in future versions. -- **Added:** New frontend. Features: - - Single page application: It's much more responsive than the - django admin pages. - - Dashboard. Shows recently scanned documents, or todo notes, or - other documents at wish. Allows uploading of documents. Shows - basic statistics. - - Better document list with multiple display options. - - Full text search with result highlighting, auto completion and - scoring based on the query. It uses a document search index in - the background. - - Saveable filters. - - Better log viewer. -- **Added:** Document types. Assign these to documents just as - correspondents. They may be used in the future to perform automatic - operations on documents depending on the type. -- **Added:** Inbox tags. Define an inbox tag and it will automatically - be assigned to any new document scanned into the system. -- **Added:** Automatic matching. A new matching algorithm that - automatically assigns tags, document types and correspondents to - your documents. It uses a neural network trained on your data. -- **Added:** Archive serial numbers. Assign these to quickly find - documents stored in physical binders. -- **Added:** Enabled the internal user management of django. This - isn't really a multi user solution, however, it allows more than - one user to access the website and set some basic permissions / - renew passwords. -- **Modified \[breaking\]:** All new mail consumer with customizable - filters, actions and multiple account support. Replaces the old mail - consumer. The new mail consumer needs different configuration but - can be configured to act exactly like the old consumer. -- **Modified:** Changes to the consumer: - - Now uses the excellent watchdog library that should make sure - files are discovered no matter what the platform is. - - The consumer now uses a task scheduler to run consumption - processes in parallel. This means that consuming many documents - should be much faster on systems with many cores. - - Concurrency is controlled with the new settings - `PAPERLESS_TASK_WORKERS` and `PAPERLESS_THREADS_PER_WORKER`. See - TODO for details on concurrency. - - The consumer no longer blocks the database for extended periods - of time. - - An issue with tesseract running multiple threads per page and - slowing down the consumer was fixed. -- **Modified \[breaking\]:** REST Api changes: - - New filters added, other filters removed (case sensitive - filters, slug filters) - - Endpoints for thumbnails, previews and downloads replace the old - `/fetch/` urls. Redirects are in place. - - Endpoint for document uploads replaces the old `/push` url. - Redirects are in place. - - Foreign key relationships are now served as IDs, not as urls. -- **Modified \[breaking\]:** PostgreSQL: - - If `PAPERLESS_DBHOST` is specified in the settings, paperless - uses PostgreSQL instead of SQLite. Username, database and - password all default to `paperless` if not specified. -- **Modified \[breaking\]:** document_retagger management command - rework. See [Document retagger](administration.md#retagger) for - details. Replaces `document_correspondents` management command. -- **Removed \[breaking\]:** Reminders. -- **Removed:** All customizations made to the django admin pages. -- **Removed \[breaking\]:** The docker image no longer supports SSL. - If you want to expose paperless to the internet, hide paperless - behind a proxy server that handles SSL requests. -- **Internal changes:** Mostly code cleanup, including: - - Rework of the code of the tesseract parser. This is now a lot - cleaner. - - Rework of the filename handling code. It was a mess. - - Fixed some issues with the document exporter not exporting all - documents when encountering duplicate filenames. - - Added a task scheduler that takes care of checking mail, - training the classifier, maintaining the document search index - and consuming documents. - - Updated dependencies. Now uses Pipenv all around. - - Updated Dockerfile and docker-compose. Now uses `supervisord` to - run everything paperless-related in a single container. -- **Settings:** - - `PAPERLESS_FORGIVING_OCR` is now default and gone. Reason: Even - if `langdetect` fails to detect a language, tesseract still does - a very good job at ocr'ing a document with the default - language. Certain language specifics such as umlauts may not get - picked up properly. - - The presence of `PAPERLESS_DBHOST` now determines whether to use - PostgreSQL or SQLite. - - `PAPERLESS_OCR_THREADS` is gone and replaced with - `PAPERLESS_TASK_WORKERS` and `PAPERLESS_THREADS_PER_WORKER`. - Refer to the config example for details. - - `PAPERLESS_OPTIMIZE_THUMBNAILS` allows you to disable or enable - thumbnail optimization. This is useful on less powerful devices. -- Many more small changes here and there. The usual stuff. +- **Deprecated:** GnuPG. [See this note on the state of GnuPG in paperless-ng.](administration.md#encryption) + This features will most likely be removed in future versions. +- **Added:** New frontend. Features: + - Single page application: It's much more responsive than the + django admin pages. + - Dashboard. Shows recently scanned documents, or todo notes, or + other documents at wish. Allows uploading of documents. Shows + basic statistics. + - Better document list with multiple display options. + - Full text search with result highlighting, auto completion and + scoring based on the query. It uses a document search index in + the background. + - Saveable filters. + - Better log viewer. +- **Added:** Document types. Assign these to documents just as + correspondents. They may be used in the future to perform automatic + operations on documents depending on the type. +- **Added:** Inbox tags. Define an inbox tag and it will automatically + be assigned to any new document scanned into the system. +- **Added:** Automatic matching. A new matching algorithm that + automatically assigns tags, document types and correspondents to + your documents. It uses a neural network trained on your data. +- **Added:** Archive serial numbers. Assign these to quickly find + documents stored in physical binders. +- **Added:** Enabled the internal user management of django. This + isn't really a multi user solution, however, it allows more than + one user to access the website and set some basic permissions / + renew passwords. +- **Modified \[breaking\]:** All new mail consumer with customizable + filters, actions and multiple account support. Replaces the old mail + consumer. The new mail consumer needs different configuration but + can be configured to act exactly like the old consumer. +- **Modified:** Changes to the consumer: + - Now uses the excellent watchdog library that should make sure + files are discovered no matter what the platform is. + - The consumer now uses a task scheduler to run consumption + processes in parallel. This means that consuming many documents + should be much faster on systems with many cores. + - Concurrency is controlled with the new settings + `PAPERLESS_TASK_WORKERS` and `PAPERLESS_THREADS_PER_WORKER`. See + TODO for details on concurrency. + - The consumer no longer blocks the database for extended periods + of time. + - An issue with tesseract running multiple threads per page and + slowing down the consumer was fixed. +- **Modified \[breaking\]:** REST Api changes: + - New filters added, other filters removed (case sensitive + filters, slug filters) + - Endpoints for thumbnails, previews and downloads replace the old + `/fetch/` urls. Redirects are in place. + - Endpoint for document uploads replaces the old `/push` url. + Redirects are in place. + - Foreign key relationships are now served as IDs, not as urls. +- **Modified \[breaking\]:** PostgreSQL: + - If `PAPERLESS_DBHOST` is specified in the settings, paperless + uses PostgreSQL instead of SQLite. Username, database and + password all default to `paperless` if not specified. +- **Modified \[breaking\]:** document_retagger management command + rework. See [Document retagger](administration.md#retagger) for + details. Replaces `document_correspondents` management command. +- **Removed \[breaking\]:** Reminders. +- **Removed:** All customizations made to the django admin pages. +- **Removed \[breaking\]:** The docker image no longer supports SSL. + If you want to expose paperless to the internet, hide paperless + behind a proxy server that handles SSL requests. +- **Internal changes:** Mostly code cleanup, including: + - Rework of the code of the tesseract parser. This is now a lot + cleaner. + - Rework of the filename handling code. It was a mess. + - Fixed some issues with the document exporter not exporting all + documents when encountering duplicate filenames. + - Added a task scheduler that takes care of checking mail, + training the classifier, maintaining the document search index + and consuming documents. + - Updated dependencies. Now uses Pipenv all around. + - Updated Dockerfile and docker-compose. Now uses `supervisord` to + run everything paperless-related in a single container. +- **Settings:** + - `PAPERLESS_FORGIVING_OCR` is now default and gone. Reason: Even + if `langdetect` fails to detect a language, tesseract still does + a very good job at ocr'ing a document with the default + language. Certain language specifics such as umlauts may not get + picked up properly. + - The presence of `PAPERLESS_DBHOST` now determines whether to use + PostgreSQL or SQLite. + - `PAPERLESS_OCR_THREADS` is gone and replaced with + `PAPERLESS_TASK_WORKERS` and `PAPERLESS_THREADS_PER_WORKER`. + Refer to the config example for details. + - `PAPERLESS_OPTIMIZE_THUMBNAILS` allows you to disable or enable + thumbnail optimization. This is useful on less powerful devices. +- Many more small changes here and there. The usual stuff. ## Paperless ### 2.7.0 -- [syntonym](https://github.com/syntonym) submitted a pull request to - catch IMAP connection errors - [#475](https://github.com/the-paperless-project/paperless/pull/475). -- [Stéphane Brunner](https://github.com/sbrunner) added `psycopg2` to - the Pipfile - [#489](https://github.com/the-paperless-project/paperless/pull/489). - He also fixed a syntax error in `docker-compose.yml.example` - [#488](https://github.com/the-paperless-project/paperless/pull/488) - and added [DjangoQL](https://github.com/ivelum/djangoql), which - allows a litany of handy search functionality - [#492](https://github.com/the-paperless-project/paperless/pull/492). -- [CkuT](https://github.com/CkuT) and - [JOKer](https://github.com/MasterofJOKers) hacked out a simple, but - super-helpful optimisation to how the thumbnails are served up, - improving performance considerably - [#481](https://github.com/the-paperless-project/paperless/pull/481). -- [tsia](https://github.com/tsia) added a few fields to the tags REST - API. - [#483](https://github.com/the-paperless-project/paperless/pull/483). -- [Brian Cribbs](https://github.com/cribbstechnolog) improved the - documentation to help people using Paperless over NFS - [#484](https://github.com/the-paperless-project/paperless/pull/484). -- [Brendan M. Sleight](https://github.com/bmsleight) updated the - documentation to include a note for setting the `DEBUG` value. The - `paperless.conf.example` file was also updated to mirror the project - defaults. +- [syntonym](https://github.com/syntonym) submitted a pull request to + catch IMAP connection errors + [#475](https://github.com/the-paperless-project/paperless/pull/475). +- [Stéphane Brunner](https://github.com/sbrunner) added `psycopg2` to + the Pipfile + [#489](https://github.com/the-paperless-project/paperless/pull/489). + He also fixed a syntax error in `docker-compose.yml.example` + [#488](https://github.com/the-paperless-project/paperless/pull/488) + and added [DjangoQL](https://github.com/ivelum/djangoql), which + allows a litany of handy search functionality + [#492](https://github.com/the-paperless-project/paperless/pull/492). +- [CkuT](https://github.com/CkuT) and + [JOKer](https://github.com/MasterofJOKers) hacked out a simple, but + super-helpful optimisation to how the thumbnails are served up, + improving performance considerably + [#481](https://github.com/the-paperless-project/paperless/pull/481). +- [tsia](https://github.com/tsia) added a few fields to the tags REST + API. + [#483](https://github.com/the-paperless-project/paperless/pull/483). +- [Brian Cribbs](https://github.com/cribbstechnolog) improved the + documentation to help people using Paperless over NFS + [#484](https://github.com/the-paperless-project/paperless/pull/484). +- [Brendan M. Sleight](https://github.com/bmsleight) updated the + documentation to include a note for setting the `DEBUG` value. The + `paperless.conf.example` file was also updated to mirror the project + defaults. ### 2.6.1 -- We now have a logo, complete with a favicon :-) -- Removed some problematic tests. -- Fix the docker-compose example config to include a shared consume - volume so that using the push API will work for users of the Docker - install. Thanks to [Colin Frei](https://github.com/colinfrei) for - fixing this in - [#466](https://github.com/the-paperless-project/paperless/pull/466). -- [khrise](https://github.com/khrise) submitted a pull request to - include the `added` property to the REST API - [#471](https://github.com/the-paperless-project/paperless/pull/471). +- We now have a logo, complete with a favicon :-) +- Removed some problematic tests. +- Fix the docker-compose example config to include a shared consume + volume so that using the push API will work for users of the Docker + install. Thanks to [Colin Frei](https://github.com/colinfrei) for + fixing this in + [#466](https://github.com/the-paperless-project/paperless/pull/466). +- [khrise](https://github.com/khrise) submitted a pull request to + include the `added` property to the REST API + [#471](https://github.com/the-paperless-project/paperless/pull/471). ### 2.6.0 -- Allow an infinite number of logs to be deleted. Thanks to - [Ulli](https://github.com/Ulli2k) for noting the problem in - [#433](https://github.com/the-paperless-project/paperless/issues/433). -- Fix the `RecentCorrespondentsFilter` correspondents filter that was - added in 2.4 to play nice with the defaults. Thanks to - [tsia](https://github.com/tsia) and - [Sblop](https://github.com/Sblop) who pointed this out. - [#423](https://github.com/the-paperless-project/paperless/issues/423). -- Updated dependencies to include (among other things) a security - patch to requests. -- Fix text in sample data for tests so that the language guesser stops - thinking that everything is in Catalan because we had _Lorem ipsum_ - in there. -- Tweaked the gunicorn sample command to use filesystem paths instead - of Python paths. - [#441](https://github.com/the-paperless-project/paperless/pull/441) -- Added pretty colour boxes next to the hex values in the Tags - section, thanks to a pull request from [Joshua - Taillon](https://github.com/jat255) - [#442](https://github.com/the-paperless-project/paperless/pull/442). -- Added a `.editorconfig` file to better specify coding style. -- [Joshua Taillon](https://github.com/jat255) also added some logic to - tie Paperless' date guessing logic into how it parses file names on - import. - [#440](https://github.com/the-paperless-project/paperless/pull/440) +- Allow an infinite number of logs to be deleted. Thanks to + [Ulli](https://github.com/Ulli2k) for noting the problem in + [#433](https://github.com/the-paperless-project/paperless/issues/433). +- Fix the `RecentCorrespondentsFilter` correspondents filter that was + added in 2.4 to play nice with the defaults. Thanks to + [tsia](https://github.com/tsia) and + [Sblop](https://github.com/Sblop) who pointed this out. + [#423](https://github.com/the-paperless-project/paperless/issues/423). +- Updated dependencies to include (among other things) a security + patch to requests. +- Fix text in sample data for tests so that the language guesser stops + thinking that everything is in Catalan because we had _Lorem ipsum_ + in there. +- Tweaked the gunicorn sample command to use filesystem paths instead + of Python paths. + [#441](https://github.com/the-paperless-project/paperless/pull/441) +- Added pretty colour boxes next to the hex values in the Tags + section, thanks to a pull request from [Joshua + Taillon](https://github.com/jat255) + [#442](https://github.com/the-paperless-project/paperless/pull/442). +- Added a `.editorconfig` file to better specify coding style. +- [Joshua Taillon](https://github.com/jat255) also added some logic to + tie Paperless' date guessing logic into how it parses file names on + import. + [#440](https://github.com/the-paperless-project/paperless/pull/440) ### 2.5.0 -- **New dependency**: Paperless now optimises thumbnail generation - with [optipng](https://optipng.sourceforge.net/), so you'll need to - install that somewhere in your PATH or declare its location in - `PAPERLESS_OPTIPNG_BINARY`. The Docker image has already been - updated on the Docker Hub, so you just need to pull the latest one - from there if you're a Docker user. -- "Login free" instances of Paperless were breaking whenever you - tried to edit objects in the admin: adding/deleting tags or - correspondents, or even fixing spelling. This was due to the "user - hack" we were applying to sessions that weren't using a login, as - that hack user didn't have a valid id. The fix was to attribute the - first user id in the system to this hack user. - [#394](https://github.com/the-paperless-project/paperless/issues/394) -- A problem in how we handle slug values on Tags and Correspondents - required a few changes to how we handle this field - [#393](https://github.com/the-paperless-project/paperless/issues/393): - 1. Slugs are no longer editable. They're derived from the name of - the tag or correspondent at save time, so if you wanna change - the slug, you have to change the name, and even then you're - restricted to the rules of the `slugify()` function. The slug - value is still visible in the admin though. - 2. I've added a migration to go over all existing tags & - correspondents and rewrite the `.slug` values to ones conforming - to the `slugify()` rules. - 3. The consumption process now uses the same rules as `.save()` in - determining a slug and using that to check for an existing - tag/correspondent. -- An annoying bug in the date capture code was causing some bogus - dates to be attached to documents, which in turn busted the UI. - Thanks to [Andrew Peng](https://github.com/pengc99) for reporting - this. - [#414](https://github.com/the-paperless-project/paperless/issues/414). -- A bug in the Dockerfile meant that Tesseract language files weren't - being installed correctly. [euri10](https://github.com/euri10) was - quick to provide a fix: - [#406](https://github.com/the-paperless-project/paperless/issues/406), - [#413](https://github.com/the-paperless-project/paperless/pull/413). -- Document consumption is now wrapped in a transaction as per an old - ticket - [#262](https://github.com/the-paperless-project/paperless/issues/262). -- The `get_date()` functionality of the parsers has been consolidated - onto the `DocumentParser` class since much of that code was - redundant anyway. +- **New dependency**: Paperless now optimises thumbnail generation + with [optipng](https://optipng.sourceforge.net/), so you'll need to + install that somewhere in your PATH or declare its location in + `PAPERLESS_OPTIPNG_BINARY`. The Docker image has already been + updated on the Docker Hub, so you just need to pull the latest one + from there if you're a Docker user. +- "Login free" instances of Paperless were breaking whenever you + tried to edit objects in the admin: adding/deleting tags or + correspondents, or even fixing spelling. This was due to the "user + hack" we were applying to sessions that weren't using a login, as + that hack user didn't have a valid id. The fix was to attribute the + first user id in the system to this hack user. + [#394](https://github.com/the-paperless-project/paperless/issues/394) +- A problem in how we handle slug values on Tags and Correspondents + required a few changes to how we handle this field + [#393](https://github.com/the-paperless-project/paperless/issues/393): + 1. Slugs are no longer editable. They're derived from the name of + the tag or correspondent at save time, so if you wanna change + the slug, you have to change the name, and even then you're + restricted to the rules of the `slugify()` function. The slug + value is still visible in the admin though. + 2. I've added a migration to go over all existing tags & + correspondents and rewrite the `.slug` values to ones conforming + to the `slugify()` rules. + 3. The consumption process now uses the same rules as `.save()` in + determining a slug and using that to check for an existing + tag/correspondent. +- An annoying bug in the date capture code was causing some bogus + dates to be attached to documents, which in turn busted the UI. + Thanks to [Andrew Peng](https://github.com/pengc99) for reporting + this. + [#414](https://github.com/the-paperless-project/paperless/issues/414). +- A bug in the Dockerfile meant that Tesseract language files weren't + being installed correctly. [euri10](https://github.com/euri10) was + quick to provide a fix: + [#406](https://github.com/the-paperless-project/paperless/issues/406), + [#413](https://github.com/the-paperless-project/paperless/pull/413). +- Document consumption is now wrapped in a transaction as per an old + ticket + [#262](https://github.com/the-paperless-project/paperless/issues/262). +- The `get_date()` functionality of the parsers has been consolidated + onto the `DocumentParser` class since much of that code was + redundant anyway. ### 2.4.0 -- A new set of actions are now available thanks to - [jonaswinkler](https://github.com/jonaswinkler)'s very first pull - request! You can now do nifty things like tag documents in bulk, or - set correspondents in bulk. - [#405](https://github.com/the-paperless-project/paperless/pull/405) -- The import/export system is now a little smarter. By default, - documents are tagged as `unencrypted`, since exports are by their - nature unencrypted. It's now in the import step that we decide the - storage type. This allows you to export from an encrypted system and - import into an unencrypted one, or vice-versa. -- The migration history has been slightly modified to accommodate - PostgreSQL users. Additionally, you can now tell paperless to use - PostgreSQL simply by declaring `PAPERLESS_DBUSER` in your - environment. This will attempt to connect to your Postgres database - without a password unless you also set `PAPERLESS_DBPASS`. -- A bug was found in the REST API filter system that was the result of - an update of django-filter some time ago. This has now been patched - in - [#412](https://github.com/the-paperless-project/paperless/issues/412). - Thanks to [thepill](https://github.com/thepill) for spotting it! +- A new set of actions are now available thanks to + [jonaswinkler](https://github.com/jonaswinkler)'s very first pull + request! You can now do nifty things like tag documents in bulk, or + set correspondents in bulk. + [#405](https://github.com/the-paperless-project/paperless/pull/405) +- The import/export system is now a little smarter. By default, + documents are tagged as `unencrypted`, since exports are by their + nature unencrypted. It's now in the import step that we decide the + storage type. This allows you to export from an encrypted system and + import into an unencrypted one, or vice-versa. +- The migration history has been slightly modified to accommodate + PostgreSQL users. Additionally, you can now tell paperless to use + PostgreSQL simply by declaring `PAPERLESS_DBUSER` in your + environment. This will attempt to connect to your Postgres database + without a password unless you also set `PAPERLESS_DBPASS`. +- A bug was found in the REST API filter system that was the result of + an update of django-filter some time ago. This has now been patched + in + [#412](https://github.com/the-paperless-project/paperless/issues/412). + Thanks to [thepill](https://github.com/thepill) for spotting it! ### 2.3.0 -- Support for consuming plain text & markdown documents was added by - [Joshua Taillon](https://github.com/jat255)! This was a - long-requested feature, and it's addition is likely to be greatly - appreciated by the community: - [#395](https://github.com/the-paperless-project/paperless/pull/395) - Thanks also to [David Martin](https://github.com/ddddavidmartin) for - his assistance on the issue. -- [dubit0](https://github.com/dubit0) found & fixed a bug that - prevented management commands from running before we had an - operational database: - [#396](https://github.com/the-paperless-project/paperless/pull/396) -- Joshua also added a simple update to the thumbnail generation - process to improve performance: - [#399](https://github.com/the-paperless-project/paperless/pull/399) -- As his last bit of effort on this release, Joshua also added some - code to allow you to view the documents inline rather than download - them as an attachment. - [#400](https://github.com/the-paperless-project/paperless/pull/400) -- Finally, [ahyear](https://github.com/ahyear) found a slip in the - Docker documentation and patched it. - [#401](https://github.com/the-paperless-project/paperless/pull/401) +- Support for consuming plain text & markdown documents was added by + [Joshua Taillon](https://github.com/jat255)! This was a + long-requested feature, and it's addition is likely to be greatly + appreciated by the community: + [#395](https://github.com/the-paperless-project/paperless/pull/395) + Thanks also to [David Martin](https://github.com/ddddavidmartin) for + his assistance on the issue. +- [dubit0](https://github.com/dubit0) found & fixed a bug that + prevented management commands from running before we had an + operational database: + [#396](https://github.com/the-paperless-project/paperless/pull/396) +- Joshua also added a simple update to the thumbnail generation + process to improve performance: + [#399](https://github.com/the-paperless-project/paperless/pull/399) +- As his last bit of effort on this release, Joshua also added some + code to allow you to view the documents inline rather than download + them as an attachment. + [#400](https://github.com/the-paperless-project/paperless/pull/400) +- Finally, [ahyear](https://github.com/ahyear) found a slip in the + Docker documentation and patched it. + [#401](https://github.com/the-paperless-project/paperless/pull/401) ### 2.2.1 -- [Kyle Lucy](https://github.com/kmlucy) reported a bug quickly after - the release of 2.2.0 where we broke the `DISABLE_LOGIN` feature: - [#392](https://github.com/the-paperless-project/paperless/issues/392). +- [Kyle Lucy](https://github.com/kmlucy) reported a bug quickly after + the release of 2.2.0 where we broke the `DISABLE_LOGIN` feature: + [#392](https://github.com/the-paperless-project/paperless/issues/392). ### 2.2.0 -- Thanks to [dadosch](https://github.com/dadosch), [Wolfgang - Mader](https://github.com/wmader), and [Tim - Brooks](https://github.com/brookst) this is the first version of - Paperless that supports Django 2.0! As a result of their hard work, - you can now also run Paperless on Python 3.7 as well: - [#386](https://github.com/the-paperless-project/paperless/issues/386) - & - [#390](https://github.com/the-paperless-project/paperless/pull/390). -- [Stéphane Brunner](https://github.com/sbrunner) added a few lines of - code that made tagging interface a lot easier on those of us with - lots of different tags: - [#391](https://github.com/the-paperless-project/paperless/pull/391). -- [Kilian Koeltzsch](https://github.com/kiliankoe) noticed a bug in - how we capture & automatically create tags, so that's fixed now - too: - [#384](https://github.com/the-paperless-project/paperless/issues/384). -- [erikarvstedt](https://github.com/erikarvstedt) tweaked the - behaviour of the test suite to be better behaved for packaging - environments: - [#383](https://github.com/the-paperless-project/paperless/pull/383). -- [Lukasz Soluch](https://github.com/LukaszSolo) added CORS support to - make building a new Javascript-based front-end cleaner & easier: - [#387](https://github.com/the-paperless-project/paperless/pull/387). +- Thanks to [dadosch](https://github.com/dadosch), [Wolfgang + Mader](https://github.com/wmader), and [Tim + Brooks](https://github.com/brookst) this is the first version of + Paperless that supports Django 2.0! As a result of their hard work, + you can now also run Paperless on Python 3.7 as well: + [#386](https://github.com/the-paperless-project/paperless/issues/386) + & + [#390](https://github.com/the-paperless-project/paperless/pull/390). +- [Stéphane Brunner](https://github.com/sbrunner) added a few lines of + code that made tagging interface a lot easier on those of us with + lots of different tags: + [#391](https://github.com/the-paperless-project/paperless/pull/391). +- [Kilian Koeltzsch](https://github.com/kiliankoe) noticed a bug in + how we capture & automatically create tags, so that's fixed now + too: + [#384](https://github.com/the-paperless-project/paperless/issues/384). +- [erikarvstedt](https://github.com/erikarvstedt) tweaked the + behaviour of the test suite to be better behaved for packaging + environments: + [#383](https://github.com/the-paperless-project/paperless/pull/383). +- [Lukasz Soluch](https://github.com/LukaszSolo) added CORS support to + make building a new Javascript-based front-end cleaner & easier: + [#387](https://github.com/the-paperless-project/paperless/pull/387). ### 2.1.0 -- [Enno Lohmeier](https://github.com/elohmeier) added three simple - features that make Paperless a lot more user (and developer) - friendly: - 1. There's a new search box on the front page: - [#374](https://github.com/the-paperless-project/paperless/pull/374). - 2. The correspondents & tags pages now have a column showing the - number of relevant documents: - [#375](https://github.com/the-paperless-project/paperless/pull/375). - 3. The Dockerfile has been tweaked to build faster for those of us - who are doing active development on Paperless using the Docker - environment: - [#376](https://github.com/the-paperless-project/paperless/pull/376). -- ~~You now also have the ability to customise the interface to your - heart's content by creating a file called `overrides.css` and/or - `overrides.js` in the root of your media directory. Thanks to [Mark - McFate](https://github.com/SummittDweller) for this idea: - [#371](https://github.com/the-paperless-project/paperless/issues/371)~~ - (Not supported by Paperless-ngx) +- [Enno Lohmeier](https://github.com/elohmeier) added three simple + features that make Paperless a lot more user (and developer) + friendly: + 1. There's a new search box on the front page: + [#374](https://github.com/the-paperless-project/paperless/pull/374). + 2. The correspondents & tags pages now have a column showing the + number of relevant documents: + [#375](https://github.com/the-paperless-project/paperless/pull/375). + 3. The Dockerfile has been tweaked to build faster for those of us + who are doing active development on Paperless using the Docker + environment: + [#376](https://github.com/the-paperless-project/paperless/pull/376). +- ~~You now also have the ability to customise the interface to your + heart's content by creating a file called `overrides.css` and/or + `overrides.js` in the root of your media directory. Thanks to [Mark + McFate](https://github.com/SummittDweller) for this idea: + [#371](https://github.com/the-paperless-project/paperless/issues/371)~~ + (Not supported by Paperless-ngx) ### 2.0.0 @@ -6771,462 +7163,462 @@ this big change. ### 1.4.0 -- [Quentin Dawans](https://github.com/ovv) has refactored the document - consumer to allow for some command-line options. Notably, you can - now direct it to consume from a particular `--directory`, limit the - `--loop-time`, set the time between mail server checks with - `--mail-delta` or just run it as a one-off with `--one-shot`. See - [#305](https://github.com/the-paperless-project/paperless/issues/305) - & - [#313](https://github.com/the-paperless-project/paperless/pull/313) - for more information. -- Refactor the use of travis/tox/pytest/coverage into two files: - `.travis.yml` and `setup.cfg`. -- Start generating requirements.txt from a Pipfile. I'll probably - switch over to just using pipenv in the future. -- All for a alternative FreeBSD-friendly location for - `paperless.conf`. Thanks to [Martin - Arendtsen](https://github.com/Arendtsen) who provided this - ([#322](https://github.com/the-paperless-project/paperless/pull/322)). -- Document consumption events are now logged in the Django admin - events log. Thanks to [CkuT](https://github.com/CkuT) for doing the - legwork on this one and to [Quentin Dawans](https://github.com/ovv) - & [David Martin](https://github.com/ddddavidmartin) for helping to - coordinate & work out how the feature would be developed. -- [erikarvstedt](https://github.com/erikarvstedt) contributed a pull - request - ([#328](https://github.com/the-paperless-project/paperless/pull/328)) - to add `--noreload` to the default server start process. This helps - reduce the load imposed by the running webservice. -- Through some discussion on - [#253](https://github.com/the-paperless-project/paperless/issues/253) - and - [#323](https://github.com/the-paperless-project/paperless/issues/323), - we've removed a few of the hardcoded URL values to make it easier - for people to host Paperless on a subdirectory. Thanks to [Quentin - Dawans](https://github.com/ovv) and [Kyle - Lucy](https://github.com/kmlucy) for helping to work this out. -- The clickable area for documents on the listing page has been - increased to a more predictable space thanks to a glorious hack from - [erikarvstedt](https://github.com/erikarvstedt) in - [#344](https://github.com/the-paperless-project/paperless/pull/344). -- [Strubbl](https://github.com/strubbl) noticed an annoying bug in the - bash script wrapping the Docker entrypoint and fixed it with some - very creating Bash skills: - [#352](https://github.com/the-paperless-project/paperless/pull/352). -- You can now use the search field to find documents by tag thanks to - [thinkjk](https://github.com/thinkjk)'s _first ever issue_: - [#354](https://github.com/the-paperless-project/paperless/issues/354). -- Inotify is now being used to detect additions to the consume - directory thanks to some excellent work from - [erikarvstedt](https://github.com/erikarvstedt) on - [#351](https://github.com/the-paperless-project/paperless/pull/351) +- [Quentin Dawans](https://github.com/ovv) has refactored the document + consumer to allow for some command-line options. Notably, you can + now direct it to consume from a particular `--directory`, limit the + `--loop-time`, set the time between mail server checks with + `--mail-delta` or just run it as a one-off with `--one-shot`. See + [#305](https://github.com/the-paperless-project/paperless/issues/305) + & + [#313](https://github.com/the-paperless-project/paperless/pull/313) + for more information. +- Refactor the use of travis/tox/pytest/coverage into two files: + `.travis.yml` and `setup.cfg`. +- Start generating requirements.txt from a Pipfile. I'll probably + switch over to just using pipenv in the future. +- All for a alternative FreeBSD-friendly location for + `paperless.conf`. Thanks to [Martin + Arendtsen](https://github.com/Arendtsen) who provided this + ([#322](https://github.com/the-paperless-project/paperless/pull/322)). +- Document consumption events are now logged in the Django admin + events log. Thanks to [CkuT](https://github.com/CkuT) for doing the + legwork on this one and to [Quentin Dawans](https://github.com/ovv) + & [David Martin](https://github.com/ddddavidmartin) for helping to + coordinate & work out how the feature would be developed. +- [erikarvstedt](https://github.com/erikarvstedt) contributed a pull + request + ([#328](https://github.com/the-paperless-project/paperless/pull/328)) + to add `--noreload` to the default server start process. This helps + reduce the load imposed by the running webservice. +- Through some discussion on + [#253](https://github.com/the-paperless-project/paperless/issues/253) + and + [#323](https://github.com/the-paperless-project/paperless/issues/323), + we've removed a few of the hardcoded URL values to make it easier + for people to host Paperless on a subdirectory. Thanks to [Quentin + Dawans](https://github.com/ovv) and [Kyle + Lucy](https://github.com/kmlucy) for helping to work this out. +- The clickable area for documents on the listing page has been + increased to a more predictable space thanks to a glorious hack from + [erikarvstedt](https://github.com/erikarvstedt) in + [#344](https://github.com/the-paperless-project/paperless/pull/344). +- [Strubbl](https://github.com/strubbl) noticed an annoying bug in the + bash script wrapping the Docker entrypoint and fixed it with some + very creating Bash skills: + [#352](https://github.com/the-paperless-project/paperless/pull/352). +- You can now use the search field to find documents by tag thanks to + [thinkjk](https://github.com/thinkjk)'s _first ever issue_: + [#354](https://github.com/the-paperless-project/paperless/issues/354). +- Inotify is now being used to detect additions to the consume + directory thanks to some excellent work from + [erikarvstedt](https://github.com/erikarvstedt) on + [#351](https://github.com/the-paperless-project/paperless/pull/351) ### 1.3.0 -- You can now run Paperless without a login, though you'll still have - to create at least one user. This is thanks to a pull-request from - [matthewmoto](https://github.com/matthewmoto): - [#295](https://github.com/the-paperless-project/paperless/pull/295). - Note that logins are still required by default, and that you need to - disable them by setting `PAPERLESS_DISABLE_LOGIN="true"` in your - environment or in `/etc/paperless.conf`. -- Fix for - [#303](https://github.com/the-paperless-project/paperless/issues/303) - where sketchily-formatted documents could cause the consumer to - break and insert half-records into the database breaking all sorts - of things. We now capture the return codes of both `convert` and - `unpaper` and fail-out nicely. -- Fix for additional date types thanks to input from - [Isaac](https://github.com/isaacsando) and code from - [BastianPoe](https://github.com/BastianPoe) - ([#301](https://github.com/the-paperless-project/paperless/issues/301)). -- Fix for running migrations in the Docker container - ([#299](https://github.com/the-paperless-project/paperless/issues/299)). - Thanks to [Georgi Todorov](https://github.com/TeraHz) for the fix - ([#300](https://github.com/the-paperless-project/paperless/pull/300)) - and to [Pit](https://github.com/pitkley) for the review. -- Fix for Docker cases where the issuing user is not UID 1000. This - was a collaborative fix between [Jeffrey - Portman](https://github.com/ChromoX) and - [Pit](https://github.com/pitkley) in - [#311](https://github.com/the-paperless-project/paperless/pull/311) - and - [#312](https://github.com/the-paperless-project/paperless/pull/312) - to fix - [#306](https://github.com/the-paperless-project/paperless/issues/306). -- Patch the historical migrations to support MySQL's um, - _interesting_ way of handing indexes - ([#308](https://github.com/the-paperless-project/paperless/issues/308)). - Thanks to [Simon Taddiken](https://github.com/skuzzle) for reporting - the problem and helping me find where to fix it. +- You can now run Paperless without a login, though you'll still have + to create at least one user. This is thanks to a pull-request from + [matthewmoto](https://github.com/matthewmoto): + [#295](https://github.com/the-paperless-project/paperless/pull/295). + Note that logins are still required by default, and that you need to + disable them by setting `PAPERLESS_DISABLE_LOGIN="true"` in your + environment or in `/etc/paperless.conf`. +- Fix for + [#303](https://github.com/the-paperless-project/paperless/issues/303) + where sketchily-formatted documents could cause the consumer to + break and insert half-records into the database breaking all sorts + of things. We now capture the return codes of both `convert` and + `unpaper` and fail-out nicely. +- Fix for additional date types thanks to input from + [Isaac](https://github.com/isaacsando) and code from + [BastianPoe](https://github.com/BastianPoe) + ([#301](https://github.com/the-paperless-project/paperless/issues/301)). +- Fix for running migrations in the Docker container + ([#299](https://github.com/the-paperless-project/paperless/issues/299)). + Thanks to [Georgi Todorov](https://github.com/TeraHz) for the fix + ([#300](https://github.com/the-paperless-project/paperless/pull/300)) + and to [Pit](https://github.com/pitkley) for the review. +- Fix for Docker cases where the issuing user is not UID 1000. This + was a collaborative fix between [Jeffrey + Portman](https://github.com/ChromoX) and + [Pit](https://github.com/pitkley) in + [#311](https://github.com/the-paperless-project/paperless/pull/311) + and + [#312](https://github.com/the-paperless-project/paperless/pull/312) + to fix + [#306](https://github.com/the-paperless-project/paperless/issues/306). +- Patch the historical migrations to support MySQL's um, + _interesting_ way of handing indexes + ([#308](https://github.com/the-paperless-project/paperless/issues/308)). + Thanks to [Simon Taddiken](https://github.com/skuzzle) for reporting + the problem and helping me find where to fix it. ### 1.2.0 -- New Docker image, now based on Alpine, thanks to the efforts of - [addadi](https://github.com/addadi) and - [Pit](https://github.com/pitkley). This new image is dramatically - smaller than the Debian-based one, and it also has [a new home on - Docker Hub](https://hub.docker.com/r/danielquinn/paperless/). A - proper thank-you to [Pit](https://github.com/pitkley) for hosting - the image on his Docker account all this time, but after some - discussion, we decided the image needed a more _official-looking_ - home. -- [BastianPoe](https://github.com/BastianPoe) has added the - long-awaited feature to automatically skip the OCR step when the PDF - already contains text. This can be overridden by setting - `PAPERLESS_OCR_ALWAYS=YES` either in your `paperless.conf` or in the - environment. Note that this also means that Paperless now requires - `libpoppler-cpp-dev` to be installed. **Important**: You'll need to - run `pip install -r requirements.txt` after the usual `git pull` to - properly update. -- [BastianPoe](https://github.com/BastianPoe) has also contributed a - monumental amount of work - ([#291](https://github.com/the-paperless-project/paperless/pull/291)) - to solving - [#158](https://github.com/the-paperless-project/paperless/issues/158): - setting the document creation date based on finding a date in the - document text. +- New Docker image, now based on Alpine, thanks to the efforts of + [addadi](https://github.com/addadi) and + [Pit](https://github.com/pitkley). This new image is dramatically + smaller than the Debian-based one, and it also has [a new home on + Docker Hub](https://hub.docker.com/r/danielquinn/paperless/). A + proper thank-you to [Pit](https://github.com/pitkley) for hosting + the image on his Docker account all this time, but after some + discussion, we decided the image needed a more _official-looking_ + home. +- [BastianPoe](https://github.com/BastianPoe) has added the + long-awaited feature to automatically skip the OCR step when the PDF + already contains text. This can be overridden by setting + `PAPERLESS_OCR_ALWAYS=YES` either in your `paperless.conf` or in the + environment. Note that this also means that Paperless now requires + `libpoppler-cpp-dev` to be installed. **Important**: You'll need to + run `pip install -r requirements.txt` after the usual `git pull` to + properly update. +- [BastianPoe](https://github.com/BastianPoe) has also contributed a + monumental amount of work + ([#291](https://github.com/the-paperless-project/paperless/pull/291)) + to solving + [#158](https://github.com/the-paperless-project/paperless/issues/158): + setting the document creation date based on finding a date in the + document text. ### 1.1.0 -- Fix for - [#283](https://github.com/the-paperless-project/paperless/issues/283), - a redirect bug which broke interactions with paperless-desktop. - Thanks to [chris-aeviator](https://github.com/chris-aeviator) for - reporting it. -- Addition of an optional new financial year filter, courtesy of - [David Martin](https://github.com/ddddavidmartin) - [#256](https://github.com/the-paperless-project/paperless/pull/256) -- Fixed a typo in how thumbnails were named in exports - [#285](https://github.com/the-paperless-project/paperless/pull/285), - courtesy of [Dan Panzarella](https://github.com/pzl) +- Fix for + [#283](https://github.com/the-paperless-project/paperless/issues/283), + a redirect bug which broke interactions with paperless-desktop. + Thanks to [chris-aeviator](https://github.com/chris-aeviator) for + reporting it. +- Addition of an optional new financial year filter, courtesy of + [David Martin](https://github.com/ddddavidmartin) + [#256](https://github.com/the-paperless-project/paperless/pull/256) +- Fixed a typo in how thumbnails were named in exports + [#285](https://github.com/the-paperless-project/paperless/pull/285), + courtesy of [Dan Panzarella](https://github.com/pzl) ### 1.0.0 -- Upgrade to Django 1.11. **You'll need to run \`\`pip install -r - requirements.txt\`\` after the usual \`\`git pull\`\` to properly - update**. -- Replace the templatetag-based hack we had for document listing in - favour of a slightly less ugly solution in the form of another - template tag with less copypasta. -- Support for multi-word-matches for auto-tagging thanks to an - excellent patch from [ishirav](https://github.com/ishirav) - [#277](https://github.com/the-paperless-project/paperless/pull/277). -- Fixed a CSS bug reported by [Stefan Hagen](https://github.com/xkpd3) - that caused an overlapping of the text and checkboxes under some - resolutions - [#272](https://github.com/the-paperless-project/paperless/issues/272). -- Patched the Docker config to force the serving of static files. - Credit for this one goes to [dev-rke](https://github.com/dev-rke) - via - [#248](https://github.com/the-paperless-project/paperless/issues/248). -- Fix file permissions during Docker start up thanks to - [Pit](https://github.com/pitkley) on - [#268](https://github.com/the-paperless-project/paperless/pull/268). -- Date fields in the admin are now expressed as HTML5 date fields - thanks to [Lukas Winkler](https://github.com/Findus23)'s issue - [#278](https://github.com/the-paperless-project/paperless/issues/248) +- Upgrade to Django 1.11. **You'll need to run \`\`pip install -r + requirements.txt\`\` after the usual \`\`git pull\`\` to properly + update**. +- Replace the templatetag-based hack we had for document listing in + favour of a slightly less ugly solution in the form of another + template tag with less copypasta. +- Support for multi-word-matches for auto-tagging thanks to an + excellent patch from [ishirav](https://github.com/ishirav) + [#277](https://github.com/the-paperless-project/paperless/pull/277). +- Fixed a CSS bug reported by [Stefan Hagen](https://github.com/xkpd3) + that caused an overlapping of the text and checkboxes under some + resolutions + [#272](https://github.com/the-paperless-project/paperless/issues/272). +- Patched the Docker config to force the serving of static files. + Credit for this one goes to [dev-rke](https://github.com/dev-rke) + via + [#248](https://github.com/the-paperless-project/paperless/issues/248). +- Fix file permissions during Docker start up thanks to + [Pit](https://github.com/pitkley) on + [#268](https://github.com/the-paperless-project/paperless/pull/268). +- Date fields in the admin are now expressed as HTML5 date fields + thanks to [Lukas Winkler](https://github.com/Findus23)'s issue + [#278](https://github.com/the-paperless-project/paperless/issues/248) ### 0.8.0 -- Paperless can now run in a subdirectory on a host (`/paperless`), - rather than always running in the root (`/`) thanks to - [maphy-psd](https://github.com/maphy-psd)'s work on - [#255](https://github.com/the-paperless-project/paperless/pull/255). +- Paperless can now run in a subdirectory on a host (`/paperless`), + rather than always running in the root (`/`) thanks to + [maphy-psd](https://github.com/maphy-psd)'s work on + [#255](https://github.com/the-paperless-project/paperless/pull/255). ### 0.7.0 -- **Potentially breaking change**: As per - [#235](https://github.com/the-paperless-project/paperless/issues/235), - Paperless will no longer automatically delete documents attached to - correspondents when those correspondents are themselves deleted. - This was Django's default behaviour, but didn't make much sense in - Paperless' case. Thanks to [Thomas - Brueggemann](https://github.com/thomasbrueggemann) and [David - Martin](https://github.com/ddddavidmartin) for their input on this - one. -- Fix for - [#232](https://github.com/the-paperless-project/paperless/issues/232) - wherein Paperless wasn't recognising `.tif` files properly. Thanks - to [ayounggun](https://github.com/ayounggun) for reporting this one - and to [Kusti Skytén](https://github.com/kskyten) for posting the - correct solution in the GitHub issue. +- **Potentially breaking change**: As per + [#235](https://github.com/the-paperless-project/paperless/issues/235), + Paperless will no longer automatically delete documents attached to + correspondents when those correspondents are themselves deleted. + This was Django's default behaviour, but didn't make much sense in + Paperless' case. Thanks to [Thomas + Brueggemann](https://github.com/thomasbrueggemann) and [David + Martin](https://github.com/ddddavidmartin) for their input on this + one. +- Fix for + [#232](https://github.com/the-paperless-project/paperless/issues/232) + wherein Paperless wasn't recognising `.tif` files properly. Thanks + to [ayounggun](https://github.com/ayounggun) for reporting this one + and to [Kusti Skytén](https://github.com/kskyten) for posting the + correct solution in the GitHub issue. ### 0.6.0 -- Abandon the shared-secret trick we were using for the POST API in - favour of BasicAuth or Django session. -- Fix the POST API so it actually works. - [#236](https://github.com/the-paperless-project/paperless/issues/236) -- **Breaking change**: We've dropped the use of - `PAPERLESS_SHARED_SECRET` as it was being used both for the API (now - replaced with a normal auth) and form email polling. Now that we're - only using it for email, this variable has been renamed to - `PAPERLESS_EMAIL_SECRET`. The old value will still work for a while, - but you should change your config if you've been using the email - polling feature. Thanks to [Joshua - Gilman](https://github.com/jmgilman) for all the help with this - feature. +- Abandon the shared-secret trick we were using for the POST API in + favour of BasicAuth or Django session. +- Fix the POST API so it actually works. + [#236](https://github.com/the-paperless-project/paperless/issues/236) +- **Breaking change**: We've dropped the use of + `PAPERLESS_SHARED_SECRET` as it was being used both for the API (now + replaced with a normal auth) and form email polling. Now that we're + only using it for email, this variable has been renamed to + `PAPERLESS_EMAIL_SECRET`. The old value will still work for a while, + but you should change your config if you've been using the email + polling feature. Thanks to [Joshua + Gilman](https://github.com/jmgilman) for all the help with this + feature. ### 0.5.0 -- Support for fuzzy matching in the auto-tagger & auto-correspondent - systems thanks to [Jake Gysland](https://github.com/jgysland)'s - patch - [#220](https://github.com/the-paperless-project/paperless/pull/220). -- Modified the Dockerfile to prepare an export directory - ([#212](https://github.com/the-paperless-project/paperless/pull/212)). - Thanks to combined efforts from [Pit](https://github.com/pitkley) - and [Strubbl](https://github.com/strubbl) in working out the kinks - on this one. -- Updated the import/export scripts to include support for thumbnails. - Big thanks to [CkuT](https://github.com/CkuT) for finding this - shortcoming and doing the work to get it fixed in - [#224](https://github.com/the-paperless-project/paperless/pull/224). -- All of the following changes are thanks to [David - Martin](https://github.com/ddddavidmartin): \* Bumped the dependency on pyocr to 0.4.7 so new users can make use - of Tesseract 4 if they so prefer - ([#226](https://github.com/the-paperless-project/paperless/pull/226)). - - Fixed a number of issues with the automated mail handler - ([#227](https://github.com/the-paperless-project/paperless/pull/227), - [#228](https://github.com/the-paperless-project/paperless/pull/228)) - - Amended the documentation for better handling of systemd service - files - ([#229](https://github.com/the-paperless-project/paperless/pull/229)) - - Amended the Django Admin configuration to have nice headers - ([#230](https://github.com/the-paperless-project/paperless/pull/230)) +- Support for fuzzy matching in the auto-tagger & auto-correspondent + systems thanks to [Jake Gysland](https://github.com/jgysland)'s + patch + [#220](https://github.com/the-paperless-project/paperless/pull/220). +- Modified the Dockerfile to prepare an export directory + ([#212](https://github.com/the-paperless-project/paperless/pull/212)). + Thanks to combined efforts from [Pit](https://github.com/pitkley) + and [Strubbl](https://github.com/strubbl) in working out the kinks + on this one. +- Updated the import/export scripts to include support for thumbnails. + Big thanks to [CkuT](https://github.com/CkuT) for finding this + shortcoming and doing the work to get it fixed in + [#224](https://github.com/the-paperless-project/paperless/pull/224). +- All of the following changes are thanks to [David + Martin](https://github.com/ddddavidmartin): \* Bumped the dependency on pyocr to 0.4.7 so new users can make use + of Tesseract 4 if they so prefer + ([#226](https://github.com/the-paperless-project/paperless/pull/226)). + - Fixed a number of issues with the automated mail handler + ([#227](https://github.com/the-paperless-project/paperless/pull/227), + [#228](https://github.com/the-paperless-project/paperless/pull/228)) + - Amended the documentation for better handling of systemd service + files + ([#229](https://github.com/the-paperless-project/paperless/pull/229)) + - Amended the Django Admin configuration to have nice headers + ([#230](https://github.com/the-paperless-project/paperless/pull/230)) ### 0.4.1 -- Fix for - [#206](https://github.com/the-paperless-project/paperless/issues/206) - wherein the pluggable parser didn't recognise files with all-caps - suffixes like `.PDF` +- Fix for + [#206](https://github.com/the-paperless-project/paperless/issues/206) + wherein the pluggable parser didn't recognise files with all-caps + suffixes like `.PDF` ### 0.4.0 -- Introducing reminders. See - [#199](https://github.com/the-paperless-project/paperless/issues/199) - for more information, but the short explanation is that you can now - attach simple notes & times to documents which are made available - via the API. Currently, the default API (basically just the Django - admin) doesn't really make use of this, but [Thomas - Brueggemann](https://github.com/thomasbrueggemann) over at - [Paperless - Desktop](https://github.com/thomasbrueggemann/paperless-desktop) has - said that he would like to make use of this feature in his project. +- Introducing reminders. See + [#199](https://github.com/the-paperless-project/paperless/issues/199) + for more information, but the short explanation is that you can now + attach simple notes & times to documents which are made available + via the API. Currently, the default API (basically just the Django + admin) doesn't really make use of this, but [Thomas + Brueggemann](https://github.com/thomasbrueggemann) over at + [Paperless + Desktop](https://github.com/thomasbrueggemann/paperless-desktop) has + said that he would like to make use of this feature in his project. ### 0.3.6 -- Fix for - [#200](https://github.com/the-paperless-project/paperless/issues/200) - (!!) where the API wasn't configured to allow updating the - correspondent or the tags for a document. -- The `content` field is now optional, to allow for the edge case of a - purely graphical document. -- You can no longer add documents via the admin. This never worked in - the first place, so all I've done here is remove the link to the - broken form. -- The consumer code has been heavily refactored to support a pluggable - interface. Install a paperless consumer via pip and tell paperless - about it with an environment variable, and you're good to go. - Proper documentation is on its way. +- Fix for + [#200](https://github.com/the-paperless-project/paperless/issues/200) + (!!) where the API wasn't configured to allow updating the + correspondent or the tags for a document. +- The `content` field is now optional, to allow for the edge case of a + purely graphical document. +- You can no longer add documents via the admin. This never worked in + the first place, so all I've done here is remove the link to the + broken form. +- The consumer code has been heavily refactored to support a pluggable + interface. Install a paperless consumer via pip and tell paperless + about it with an environment variable, and you're good to go. + Proper documentation is on its way. ### 0.3.5 -- A serious facelift for the documents listing page wherein we drop - the tabular layout in favour of a tiled interface. -- Users can now configure the number of items per page. -- Fix for - [#171](https://github.com/the-paperless-project/paperless/issues/171): - Allow users to specify their own `SECRET_KEY` value. -- Moved the dotenv loading to the top of settings.py -- Fix for - [#112](https://github.com/the-paperless-project/paperless/issues/112): - Added checks for binaries required for document consumption. +- A serious facelift for the documents listing page wherein we drop + the tabular layout in favour of a tiled interface. +- Users can now configure the number of items per page. +- Fix for + [#171](https://github.com/the-paperless-project/paperless/issues/171): + Allow users to specify their own `SECRET_KEY` value. +- Moved the dotenv loading to the top of settings.py +- Fix for + [#112](https://github.com/the-paperless-project/paperless/issues/112): + Added checks for binaries required for document consumption. ### 0.3.4 -- Removal of django-suit due to a licensing conflict I bumped into in - 0.3.3. Note that you _can_ use Django Suit with Paperless, but only - in a non-profit situation as their free license prohibits for-profit - use. As a result, I can't bundle Suit with Paperless without - conflicting with the GPL. Further development will be done against - the stock Django admin. -- I shrunk the thumbnails a little 'cause they were too big for me, - even on my high-DPI monitor. -- BasicAuth support for document and thumbnail downloads, as well as - the Push API thanks to \@thomasbrueggemann. See - [#179](https://github.com/the-paperless-project/paperless/pull/179). +- Removal of django-suit due to a licensing conflict I bumped into in + 0.3.3. Note that you _can_ use Django Suit with Paperless, but only + in a non-profit situation as their free license prohibits for-profit + use. As a result, I can't bundle Suit with Paperless without + conflicting with the GPL. Further development will be done against + the stock Django admin. +- I shrunk the thumbnails a little 'cause they were too big for me, + even on my high-DPI monitor. +- BasicAuth support for document and thumbnail downloads, as well as + the Push API thanks to \@thomasbrueggemann. See + [#179](https://github.com/the-paperless-project/paperless/pull/179). ### 0.3.3 -- Thumbnails in the UI and a Django-suit -based face-lift courtesy of - \@ekw! -- Timezone, items per page, and default language are now all - configurable, also thanks to \@ekw. +- Thumbnails in the UI and a Django-suit -based face-lift courtesy of + \@ekw! +- Timezone, items per page, and default language are now all + configurable, also thanks to \@ekw. ### 0.3.2 -- Fix for - [#172](https://github.com/the-paperless-project/paperless/issues/172): - defaulting ALLOWED_HOSTS to `["*"]` and allowing the user to set - her own value via `PAPERLESS_ALLOWED_HOSTS` should the need arise. +- Fix for + [#172](https://github.com/the-paperless-project/paperless/issues/172): + defaulting ALLOWED_HOSTS to `["*"]` and allowing the user to set + her own value via `PAPERLESS_ALLOWED_HOSTS` should the need arise. ### 0.3.1 -- Added a default value for `CONVERT_BINARY` +- Added a default value for `CONVERT_BINARY` ### 0.3.0 -- Updated to using django-filter 1.x -- Added some system checks so new users aren't confused by - misconfigurations. -- Consumer loop time is now configurable for systems with slow writes. - Just set `PAPERLESS_CONSUMER_LOOP_TIME` to a number of seconds. The - default is 10. -- As per - [#44](https://github.com/the-paperless-project/paperless/issues/44), - we've removed support for `PAPERLESS_CONVERT`, `PAPERLESS_CONSUME`, - and `PAPERLESS_SECRET`. Please use `PAPERLESS_CONVERT_BINARY`, - `PAPERLESS_CONSUMPTION_DIR`, and `PAPERLESS_SHARED_SECRET` - respectively instead. +- Updated to using django-filter 1.x +- Added some system checks so new users aren't confused by + misconfigurations. +- Consumer loop time is now configurable for systems with slow writes. + Just set `PAPERLESS_CONSUMER_LOOP_TIME` to a number of seconds. The + default is 10. +- As per + [#44](https://github.com/the-paperless-project/paperless/issues/44), + we've removed support for `PAPERLESS_CONVERT`, `PAPERLESS_CONSUME`, + and `PAPERLESS_SECRET`. Please use `PAPERLESS_CONVERT_BINARY`, + `PAPERLESS_CONSUMPTION_DIR`, and `PAPERLESS_SHARED_SECRET` + respectively instead. ### 0.2.0 -- [#150](https://github.com/the-paperless-project/paperless/pull/150): - The media root is now a variable you can set in `paperless.conf`. -- [#148](https://github.com/the-paperless-project/paperless/pull/148): - The database location (sqlite) is now a variable you can set in - `paperless.conf`. -- [#146](https://github.com/the-paperless-project/paperless/issues/146): - Fixed a bug that allowed unauthorised access to the `/fetch` URL. -- [#131](https://github.com/the-paperless-project/paperless/issues/131): - Document files are now automatically removed from disk when they're - deleted in Paperless. -- [#121](https://github.com/the-paperless-project/paperless/issues/121): - Fixed a bug where Paperless wasn't setting document creation time - based on the file naming scheme. -- [#81](https://github.com/the-paperless-project/paperless/issues/81): - Added a hook to run an arbitrary script after every document is - consumed. -- [#98](https://github.com/the-paperless-project/paperless/issues/98): - Added optional environment variables for ImageMagick so that it - doesn't explode when handling Very Large Documents or when it's - just running on a low-memory system. Thanks to [Florian - Harr](https://github.com/evils) for his help on this one. -- [#89](https://github.com/the-paperless-project/paperless/issues/89) - Ported the auto-tagging code to correspondents as well. Thanks to - [Justin Snyman](https://github.com/stringlytyped) for the pointers - in the issue queue. -- Added support for guessing the date from the file name along with - the correspondent, title, and tags. Thanks to [Tikitu de - Jager](https://github.com/tikitu) for his pull request that I took - forever to merge and to [Pit](https://github.com/pitkley) for his - efforts on the regex front. -- [#94](https://github.com/the-paperless-project/paperless/issues/94): - Restored support for changing the created date in the UI. Thanks to - [Martin Honermeyer](https://github.com/djmaze) and [Tim - White](https://github.com/timwhite) for working with me on this. +- [#150](https://github.com/the-paperless-project/paperless/pull/150): + The media root is now a variable you can set in `paperless.conf`. +- [#148](https://github.com/the-paperless-project/paperless/pull/148): + The database location (sqlite) is now a variable you can set in + `paperless.conf`. +- [#146](https://github.com/the-paperless-project/paperless/issues/146): + Fixed a bug that allowed unauthorised access to the `/fetch` URL. +- [#131](https://github.com/the-paperless-project/paperless/issues/131): + Document files are now automatically removed from disk when they're + deleted in Paperless. +- [#121](https://github.com/the-paperless-project/paperless/issues/121): + Fixed a bug where Paperless wasn't setting document creation time + based on the file naming scheme. +- [#81](https://github.com/the-paperless-project/paperless/issues/81): + Added a hook to run an arbitrary script after every document is + consumed. +- [#98](https://github.com/the-paperless-project/paperless/issues/98): + Added optional environment variables for ImageMagick so that it + doesn't explode when handling Very Large Documents or when it's + just running on a low-memory system. Thanks to [Florian + Harr](https://github.com/evils) for his help on this one. +- [#89](https://github.com/the-paperless-project/paperless/issues/89) + Ported the auto-tagging code to correspondents as well. Thanks to + [Justin Snyman](https://github.com/stringlytyped) for the pointers + in the issue queue. +- Added support for guessing the date from the file name along with + the correspondent, title, and tags. Thanks to [Tikitu de + Jager](https://github.com/tikitu) for his pull request that I took + forever to merge and to [Pit](https://github.com/pitkley) for his + efforts on the regex front. +- [#94](https://github.com/the-paperless-project/paperless/issues/94): + Restored support for changing the created date in the UI. Thanks to + [Martin Honermeyer](https://github.com/djmaze) and [Tim + White](https://github.com/timwhite) for working with me on this. ### 0.1.1 -- Potentially **Breaking Change**: All references to "sender" in the - code have been renamed to "correspondent" to better reflect the - nature of the property (one could quite reasonably scan a document - before sending it to someone.) -- [#67](https://github.com/the-paperless-project/paperless/issues/67): - Rewrote the document exporter and added a new importer that allows - for full metadata retention without depending on the file name and - modification time. A big thanks to [Tikitu de - Jager](https://github.com/tikitu), - [Pit](https://github.com/pitkley), [Florian - Jung](https://github.com/the01), and [Christopher - Luu](https://github.com/nuudles) for their code snippets and - contributing conversation that lead to this change. -- [#20](https://github.com/the-paperless-project/paperless/issues/20): - Added _unpaper_ support to help in cleaning up the scanned image - before it's OCR'd. Thanks to [Pit](https://github.com/pitkley) for - this one. -- [#71](https://github.com/the-paperless-project/paperless/issues/71) - Added (encrypted) thumbnails in anticipation of a proper UI. -- [#68](https://github.com/the-paperless-project/paperless/issues/68): - Added support for using a proper config file at - `/etc/paperless.conf` and modified the systemd unit files to use it. -- Refactored the Vagrant installation process to use environment - variables rather than asking the user to modify `settings.py`. -- [#44](https://github.com/the-paperless-project/paperless/issues/44): - Harmonise environment variable names with constant names. -- [#60](https://github.com/the-paperless-project/paperless/issues/60): - Setup logging to actually use the Python native logging framework. -- [#53](https://github.com/the-paperless-project/paperless/issues/53): - Fixed an annoying bug that caused `.jpeg` and `.JPG` images to be - imported but made unavailable. +- Potentially **Breaking Change**: All references to "sender" in the + code have been renamed to "correspondent" to better reflect the + nature of the property (one could quite reasonably scan a document + before sending it to someone.) +- [#67](https://github.com/the-paperless-project/paperless/issues/67): + Rewrote the document exporter and added a new importer that allows + for full metadata retention without depending on the file name and + modification time. A big thanks to [Tikitu de + Jager](https://github.com/tikitu), + [Pit](https://github.com/pitkley), [Florian + Jung](https://github.com/the01), and [Christopher + Luu](https://github.com/nuudles) for their code snippets and + contributing conversation that lead to this change. +- [#20](https://github.com/the-paperless-project/paperless/issues/20): + Added _unpaper_ support to help in cleaning up the scanned image + before it's OCR'd. Thanks to [Pit](https://github.com/pitkley) for + this one. +- [#71](https://github.com/the-paperless-project/paperless/issues/71) + Added (encrypted) thumbnails in anticipation of a proper UI. +- [#68](https://github.com/the-paperless-project/paperless/issues/68): + Added support for using a proper config file at + `/etc/paperless.conf` and modified the systemd unit files to use it. +- Refactored the Vagrant installation process to use environment + variables rather than asking the user to modify `settings.py`. +- [#44](https://github.com/the-paperless-project/paperless/issues/44): + Harmonise environment variable names with constant names. +- [#60](https://github.com/the-paperless-project/paperless/issues/60): + Setup logging to actually use the Python native logging framework. +- [#53](https://github.com/the-paperless-project/paperless/issues/53): + Fixed an annoying bug that caused `.jpeg` and `.JPG` images to be + imported but made unavailable. ### 0.1.0 -- Docker support! Big thanks to [Wayne - Werner](https://github.com/waynew), [Brian - Conn](https://github.com/TheConnMan), and [Tikitu de - Jager](https://github.com/tikitu) for this one, and especially to - [Pit](https://github.com/pitkley) who spearheadded this effort. -- A simple REST API is in place, but it should be considered unstable. -- Cleaned up the consumer to use temporary directories instead of a - single scratch space. (Thanks [Pit](https://github.com/pitkley)) -- Improved the efficiency of the consumer by parsing pages more - intelligently and introducing a threaded OCR process (thanks again - [Pit](https://github.com/pitkley)). -- [#45](https://github.com/the-paperless-project/paperless/issues/45): - Cleaned up the logic for tag matching. Reported by - [darkmatter](https://github.com/darkmatter). -- [#47](https://github.com/the-paperless-project/paperless/issues/47): - Auto-rotate landscape documents. Reported by - [Paul](https://github.com/polo2ro) and fixed by - [Pit](https://github.com/pitkley). -- [#48](https://github.com/the-paperless-project/paperless/issues/48): - Matching algorithms should do so on a word boundary - ([darkmatter](https://github.com/darkmatter)) -- [#54](https://github.com/the-paperless-project/paperless/issues/54): - Documented the re-tagger ([zedster](https://github.com/zedster)) -- [#57](https://github.com/the-paperless-project/paperless/issues/57): - Make sure file is preserved on import failure - ([darkmatter](https://github.com/darkmatter)) -- Added tox with pep8 checking +- Docker support! Big thanks to [Wayne + Werner](https://github.com/waynew), [Brian + Conn](https://github.com/TheConnMan), and [Tikitu de + Jager](https://github.com/tikitu) for this one, and especially to + [Pit](https://github.com/pitkley) who spearheadded this effort. +- A simple REST API is in place, but it should be considered unstable. +- Cleaned up the consumer to use temporary directories instead of a + single scratch space. (Thanks [Pit](https://github.com/pitkley)) +- Improved the efficiency of the consumer by parsing pages more + intelligently and introducing a threaded OCR process (thanks again + [Pit](https://github.com/pitkley)). +- [#45](https://github.com/the-paperless-project/paperless/issues/45): + Cleaned up the logic for tag matching. Reported by + [darkmatter](https://github.com/darkmatter). +- [#47](https://github.com/the-paperless-project/paperless/issues/47): + Auto-rotate landscape documents. Reported by + [Paul](https://github.com/polo2ro) and fixed by + [Pit](https://github.com/pitkley). +- [#48](https://github.com/the-paperless-project/paperless/issues/48): + Matching algorithms should do so on a word boundary + ([darkmatter](https://github.com/darkmatter)) +- [#54](https://github.com/the-paperless-project/paperless/issues/54): + Documented the re-tagger ([zedster](https://github.com/zedster)) +- [#57](https://github.com/the-paperless-project/paperless/issues/57): + Make sure file is preserved on import failure + ([darkmatter](https://github.com/darkmatter)) +- Added tox with pep8 checking ### 0.0.6 -- Added support for parallel OCR (significant work from - [Pit](https://github.com/pitkley)) -- Sped up the language detection (significant work from - [Pit](https://github.com/pitkley)) -- Added simple logging +- Added support for parallel OCR (significant work from + [Pit](https://github.com/pitkley)) +- Sped up the language detection (significant work from + [Pit](https://github.com/pitkley)) +- Added simple logging ### 0.0.5 -- Added support for image files as documents (png, jpg, gif, tiff) -- Added a crude means of HTTP POST for document imports -- Added IMAP mail support -- Added a re-tagging utility -- Documentation for the above as well as data migration +- Added support for image files as documents (png, jpg, gif, tiff) +- Added a crude means of HTTP POST for document imports +- Added IMAP mail support +- Added a re-tagging utility +- Documentation for the above as well as data migration ### 0.0.4 -- Added automated tagging basted on keyword matching -- Cleaned up the document listing page -- Removed `User` and `Group` from the admin -- Added `pytz` to the list of requirements +- Added automated tagging basted on keyword matching +- Cleaned up the document listing page +- Removed `User` and `Group` from the admin +- Added `pytz` to the list of requirements ### 0.0.3 -- Added basic tagging +- Added basic tagging ### 0.0.2 -- Added language detection -- Added datestamps to `document_exporter`. -- Changed `settings.TESSERACT_LANGUAGE` to `settings.OCR_LANGUAGE`. +- Added language detection +- Added datestamps to `document_exporter`. +- Changed `settings.TESSERACT_LANGUAGE` to `settings.OCR_LANGUAGE`. ### 0.0.1 -- Initial release +- Initial release diff --git a/docs/configuration.md b/docs/configuration.md index 51c00d1a5e..4ce2d9dc6d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -8,17 +8,17 @@ common [OCR](#ocr) related settings and some frontend settings. If set, these wi preference over the settings via environment variables. If not set, the environment setting or applicable default will be utilized instead. -- If you run paperless on docker, `paperless.conf` is not used. - Rather, configure paperless by copying necessary options to - `docker-compose.env`. - -- If you are running paperless on anything else, paperless will search - for the configuration file in these locations and use the first one - it finds: - - The environment variable `PAPERLESS_CONFIGURATION_PATH` - - `/path/to/paperless/paperless.conf` - - `/etc/paperless.conf` - - `/usr/local/etc/paperless.conf` +- If you run paperless on docker, `paperless.conf` is not used. + Rather, configure paperless by copying necessary options to + `docker-compose.env`. + +- If you are running paperless on anything else, paperless will search + for the configuration file in these locations and use the first one + it finds: + - The environment variable `PAPERLESS_CONFIGURATION_PATH` + - `/path/to/paperless/paperless.conf` + - `/etc/paperless.conf` + - `/usr/local/etc/paperless.conf` ## Required services @@ -51,130 +51,172 @@ matcher. ### Database By default, Paperless uses **SQLite** with a database stored at `data/db.sqlite3`. -To switch to **PostgreSQL** or **MariaDB**, set [`PAPERLESS_DBHOST`](#PAPERLESS_DBHOST) and optionally configure other -database-related environment variables. +For multi-user or higher-throughput deployments, **PostgreSQL** (recommended) or +**MariaDB** can be used instead by setting [`PAPERLESS_DBENGINE`](#PAPERLESS_DBENGINE) +and the relevant connection variables. -#### [`PAPERLESS_DBHOST=`](#PAPERLESS_DBHOST) {#PAPERLESS_DBHOST} - -: If unset, Paperless uses **SQLite** by default. - - Set `PAPERLESS_DBHOST` to switch to PostgreSQL or MariaDB instead. +#### [`PAPERLESS_DBENGINE=`](#PAPERLESS_DBENGINE) {#PAPERLESS_DBENGINE} -#### [`PAPERLESS_DBENGINE=`](#PAPERLESS_DBENGINE) {#PAPERLESS_DBENGINE} +: Specifies the database engine to use. Accepted values are `sqlite`, `postgresql`, +and `mariadb`. -: Optional. Specifies the database engine to use when connecting to a remote database. -Available options are `postgresql` and `mariadb`. + Defaults to `sqlite` if not set. - Defaults to `postgresql` if `PAPERLESS_DBHOST` is set. + PostgreSQL and MariaDB both require [`PAPERLESS_DBHOST`](#PAPERLESS_DBHOST) to be + set. SQLite does not use any other connection variables; the database file is always + located at `/db.sqlite3`. !!! warning + Using MariaDB comes with some caveats. + See [MySQL Caveats](advanced_usage.md#mysql-caveats). + +#### [`PAPERLESS_DBHOST=`](#PAPERLESS_DBHOST) {#PAPERLESS_DBHOST} - Using MariaDB comes with some caveats. See [MySQL Caveats](advanced_usage.md#mysql-caveats). +: Hostname of the PostgreSQL or MariaDB database server. Required when +`PAPERLESS_DBENGINE` is `postgresql` or `mariadb`. #### [`PAPERLESS_DBPORT=`](#PAPERLESS_DBPORT) {#PAPERLESS_DBPORT} : Port to use when connecting to PostgreSQL or MariaDB. - Default is `5432` for PostgreSQL and `3306` for MariaDB. + Defaults to `5432` for PostgreSQL and `3306` for MariaDB. #### [`PAPERLESS_DBNAME=`](#PAPERLESS_DBNAME) {#PAPERLESS_DBNAME} -: Name of the database to connect to when using PostgreSQL or MariaDB. +: Name of the PostgreSQL or MariaDB database to connect to. - Defaults to "paperless". + Defaults to `paperless`. -#### [`PAPERLESS_DBUSER=`](#PAPERLESS_DBUSER) {#PAPERLESS_DBUSER} +#### [`PAPERLESS_DBUSER=`](#PAPERLESS_DBUSER) {#PAPERLESS_DBUSER} : Username for authenticating with the PostgreSQL or MariaDB database. - Defaults to "paperless". + Defaults to `paperless`. #### [`PAPERLESS_DBPASS=`](#PAPERLESS_DBPASS) {#PAPERLESS_DBPASS} : Password for the PostgreSQL or MariaDB database user. - Defaults to "paperless". + Defaults to `paperless`. -#### [`PAPERLESS_DBSSLMODE=`](#PAPERLESS_DBSSLMODE) {#PAPERLESS_DBSSLMODE} +#### [`PAPERLESS_DB_OPTIONS=`](#PAPERLESS_DB_OPTIONS) {#PAPERLESS_DB_OPTIONS} -: SSL mode to use when connecting to PostgreSQL or MariaDB. +: Advanced database connection options as a semicolon-delimited key-value string. +Keys and values are separated by `=`. Dot-notation produces nested option +dictionaries; for example, `pool.max_size=20` sets +`OPTIONS["pool"]["max_size"] = 20`. - See [the official documentation about - sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html). + Options specified here are merged over the engine defaults. Unrecognised keys + are passed through to the underlying database driver without validation, so a + typo will be silently ignored rather than producing an error. - See [the official documentation about - sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-mode). + Refer to your database driver's documentation for the full set of accepted keys: - *Note*: SSL mode values differ between PostgreSQL and MariaDB. + - PostgreSQL: [libpq connection parameters](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS) + - MariaDB: [MariaDB Connector/Python](https://mariadb.com/kb/en/mariadb-connector-python/) + - SQLite: [SQLite PRAGMA statements](https://www.sqlite.org/pragma.html) - Default is `prefer` for PostgreSQL and `PREFERRED` for MariaDB. + !!! note "PostgreSQL connection pooling" -#### [`PAPERLESS_DBSSLROOTCERT=`](#PAPERLESS_DBSSLROOTCERT) {#PAPERLESS_DBSSLROOTCERT} + Pool size is controlled via `pool.min_size` and `pool.max_size`. When + configuring pooling, ensure your PostgreSQL `max_connections` is large enough + to handle all pool connections across all workers: + `(web_workers + celery_workers) * pool.max_size + safety_margin`. -: Path to the SSL root certificate used to verify the database server. + **Examples:** - See [the official documentation about - sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html). - Changes the location of `root.crt`. + ```bash title="PostgreSQL: require SSL, set a custom CA certificate, and limit the pool size" + PAPERLESS_DB_OPTIONS="sslmode=require;sslrootcert=/certs/ca.pem;pool.max_size=5" + ``` - See [the official documentation about - sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-ca). + ```bash title="MariaDB: require SSL with a custom CA certificate" + PAPERLESS_DB_OPTIONS="ssl_mode=REQUIRED;ssl.ca=/certs/ca.pem" + ``` - Defaults to unset, using the standard location in the home directory. + ```bash title="SQLite: set a busy timeout of 30 seconds" + # PostgreSQL: set a connection timeout + PAPERLESS_DB_OPTIONS="connect_timeout=10" + ``` -#### [`PAPERLESS_DBSSLCERT=`](#PAPERLESS_DBSSLCERT) {#PAPERLESS_DBSSLCERT} +#### ~~[`PAPERLESS_DBSSLMODE`](#PAPERLESS_DBSSLMODE)~~ {#PAPERLESS_DBSSLMODE} -: Path to the client SSL certificate used when connecting securely. +!!! failure "Removed in v3" - See [the official documentation about - sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html). + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. - See [the official documentation about - sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-cert). + ```bash title="PostgreSQL" + PAPERLESS_DB_OPTIONS="sslmode=require" + ``` - Changes the location of `postgresql.crt`. + ```bash title="MariaDB" + PAPERLESS_DB_OPTIONS="ssl_mode=REQUIRED" + ``` - Defaults to unset, using the standard location in the home directory. +#### ~~[`PAPERLESS_DBSSLROOTCERT`](#PAPERLESS_DBSSLROOTCERT)~~ {#PAPERLESS_DBSSLROOTCERT} -#### [`PAPERLESS_DBSSLKEY=`](#PAPERLESS_DBSSLKEY) {#PAPERLESS_DBSSLKEY} +!!! failure "Removed in v3" -: Path to the client SSL private key used when connecting securely. + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. - See [the official documentation about - sslmode for PostgreSQL](https://www.postgresql.org/docs/current/libpq-ssl.html). + ```bash title="PostgreSQL" + PAPERLESS_DB_OPTIONS="sslrootcert=/path/to/ca.pem" + ``` - See [the official documentation about - sslmode for MySQL and MariaDB](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-key). + ```bash title="MariaDB" + PAPERLESS_DB_OPTIONS="ssl.ca=/path/to/ca.pem" + ``` - Changes the location of `postgresql.key`. +#### ~~[`PAPERLESS_DBSSLCERT`](#PAPERLESS_DBSSLCERT)~~ {#PAPERLESS_DBSSLCERT} - Defaults to unset, using the standard location in the home directory. +!!! failure "Removed in v3" -#### [`PAPERLESS_DB_TIMEOUT=`](#PAPERLESS_DB_TIMEOUT) {#PAPERLESS_DB_TIMEOUT} + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. -: Sets how long a database connection should wait before timing out. + ```bash title="PostgreSQL" + PAPERLESS_DB_OPTIONS="sslcert=/path/to/client.crt" + ``` - For SQLite, this sets how long to wait if the database is locked. - For PostgreSQL or MariaDB, this sets the connection timeout. + ```bash title="MariaDB" + PAPERLESS_DB_OPTIONS="ssl.cert=/path/to/client.crt" + ``` - Defaults to unset, which uses Django’s built-in defaults. +#### ~~[`PAPERLESS_DBSSLKEY`](#PAPERLESS_DBSSLKEY)~~ {#PAPERLESS_DBSSLKEY} -#### [`PAPERLESS_DB_POOLSIZE=`](#PAPERLESS_DB_POOLSIZE) {#PAPERLESS_DB_POOLSIZE} +!!! failure "Removed in v3" -: Defines the maximum number of database connections to keep in the pool. + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. - Only applies to PostgreSQL. This setting is ignored for other database engines. + ```bash title="PostgreSQL" + PAPERLESS_DB_OPTIONS="sslkey=/path/to/client.key" + ``` - The value must be greater than or equal to 1 to be used. - Defaults to unset, which disables connection pooling. + ```bash title="MariaDB" + PAPERLESS_DB_OPTIONS="ssl.key=/path/to/client.key" + ``` - !!! note +#### ~~[`PAPERLESS_DB_TIMEOUT`](#PAPERLESS_DB_TIMEOUT)~~ {#PAPERLESS_DB_TIMEOUT} - A small pool is typically sufficient — for example, a size of 4. - Make sure your PostgreSQL server's max_connections setting is large enough to handle: - ```(Paperless workers + Celery workers) × pool size + safety margin``` - For example, with 4 Paperless workers and 2 Celery workers, and a pool size of 4: - (4 + 2) × 4 + 10 = 34 connections required. +!!! failure "Removed in v3" + + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. + + ```bash title="SQLite" + PAPERLESS_DB_OPTIONS="timeout=30" + ``` + + ```bash title="PostgreSQL or MariaDB" + PAPERLESS_DB_OPTIONS="connect_timeout=30" + ``` + +#### ~~[`PAPERLESS_DB_POOLSIZE`](#PAPERLESS_DB_POOLSIZE)~~ {#PAPERLESS_DB_POOLSIZE} + +!!! failure "Removed in v3" + + Use [`PAPERLESS_DB_OPTIONS`](#PAPERLESS_DB_OPTIONS) instead. + + ```bash + PAPERLESS_DB_OPTIONS="pool.max_size=10" + ``` #### [`PAPERLESS_DB_READ_CACHE_ENABLED=`](#PAPERLESS_DB_READ_CACHE_ENABLED) {#PAPERLESS_DB_READ_CACHE_ENABLED} @@ -632,6 +674,9 @@ See the corresponding [django-allauth documentation](https://docs.allauth.org/en for a list of provider configurations. You will also need to include the relevant Django 'application' inside the [PAPERLESS_APPS](#PAPERLESS_APPS) setting to activate that specific authentication provider (e.g. `allauth.socialaccount.providers.openid_connect` for the [OIDC Connect provider](https://docs.allauth.org/en/latest/socialaccount/providers/openid_connect.html)). +: For OpenID Connect providers, set `settings.token_auth_method` if your identity provider +requires a specific token endpoint authentication method. + Defaults to None, which does not enable any third party authentication systems. #### [`PAPERLESS_SOCIAL_AUTO_SIGNUP=`](#PAPERLESS_SOCIAL_AUTO_SIGNUP) {#PAPERLESS_SOCIAL_AUTO_SIGNUP} @@ -652,7 +697,7 @@ system. See the corresponding : Sync groups from the third party authentication system (e.g. OIDC) to Paperless-ngx. When enabled, users will be added or removed from groups based on their group membership in the third party authentication system. Groups must already exist in Paperless-ngx and have the same name as in the third party authentication system. Groups are updated upon logging in via the third party authentication system, see the corresponding [django-allauth documentation](https://docs.allauth.org/en/dev/socialaccount/signals.html). -: In order to pass groups from the authentication system you will need to update your [PAPERLESS_SOCIALACCOUNT_PROVIDERS](#PAPERLESS_SOCIALACCOUNT_PROVIDERS) setting by adding a top-level "SCOPES" setting which includes "groups", e.g.: +: In order to pass groups from the authentication system you will need to update your [PAPERLESS_SOCIALACCOUNT_PROVIDERS](#PAPERLESS_SOCIALACCOUNT_PROVIDERS) setting by adding a top-level "SCOPES" setting which includes "groups", or the custom groups claim configured in [`PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS_CLAIM`](#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS_CLAIM) e.g.: ```json {"openid_connect":{"SCOPE": ["openid","profile","email","groups"]... @@ -660,6 +705,12 @@ system. See the corresponding Defaults to False +#### [`PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS_CLAIM=`](#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS_CLAIM) {#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS_CLAIM} + +: Allows you to define a custom groups claim. See [PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS](#PAPERLESS_SOCIAL_ACCOUNT_SYNC_GROUPS) which is required for this setting to take effect. + + Defaults to "groups" + #### [`PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS=`](#PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS) {#PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS} : A list of group names that users who signup via social accounts will be added to upon signup. Groups listed here must already exist. @@ -1007,7 +1058,7 @@ still perform some basic text pre-processing before matching. : See also `PAPERLESS_NLTK_DIR`. - Defaults to 1. + Defaults to true, enabling the feature. #### [`PAPERLESS_DATE_PARSER_LANGUAGES=`](#PAPERLESS_DATE_PARSER_LANGUAGES) {#PAPERLESS_DATE_PARSER_LANGUAGES} @@ -1054,17 +1105,27 @@ should be a valid crontab(5) expression describing when to run. #### [`PAPERLESS_SANITY_TASK_CRON=`](#PAPERLESS_SANITY_TASK_CRON) {#PAPERLESS_SANITY_TASK_CRON} -: Configures the scheduled sanity checker frequency. +: Configures the scheduled sanity checker frequency. The value should be a +valid crontab(5) expression describing when to run. : If set to the string "disable", the sanity checker will not run automatically. Defaults to `30 0 * * sun` or Sunday at 30 minutes past midnight. +#### [`PAPERLESS_WORKFLOW_SCHEDULED_TASK_CRON=`](#PAPERLESS_WORKFLOW_SCHEDULED_TASK_CRON) {#PAPERLESS_WORKFLOW_SCHEDULED_TASK_CRON} + +: Configures the scheduled workflow check frequency. The value should be a +valid crontab(5) expression describing when to run. + +: If set to the string "disable", scheduled workflows will not run. + + Defaults to `5 */1 * * *` or every hour at 5 minutes past the hour. + #### [`PAPERLESS_ENABLE_COMPRESSION=`](#PAPERLESS_ENABLE_COMPRESSION) {#PAPERLESS_ENABLE_COMPRESSION} : Enables compression of the responses from the webserver. -: Defaults to 1, enabling compression. +: Defaults to true, enabling compression. !!! note @@ -1129,8 +1190,9 @@ via the consumption directory, you can disable the consumer to save resources. #### [`PAPERLESS_CONSUMER_DELETE_DUPLICATES=`](#PAPERLESS_CONSUMER_DELETE_DUPLICATES) {#PAPERLESS_CONSUMER_DELETE_DUPLICATES} -: When the consumer detects a duplicate document, it will not touch -the original document. This default behavior can be changed here. +: As of version 3.0 Paperless-ngx allows duplicate documents to be consumed by default, _except_ when +this setting is enabled. When enabled, Paperless will check if a document with the same hash already +exists in the system and delete the duplicate file from the consumption directory without consuming it. Defaults to false. @@ -1158,29 +1220,45 @@ don't exist yet. #### [`PAPERLESS_CONSUMER_IGNORE_PATTERNS=`](#PAPERLESS_CONSUMER_IGNORE_PATTERNS) {#PAPERLESS_CONSUMER_IGNORE_PATTERNS} -: By default, paperless ignores certain files and folders in the -consumption directory, such as system files created by the Mac OS -or hidden folders some tools use to store data. +: Additional regex patterns for files to ignore in the consumption directory. Patterns are matched against filenames only (not full paths) +using Python's `re.match()`, which anchors at the start of the filename. - This can be adjusted by configuring a custom json array with - patterns to exclude. + See the [watchfiles documentation](https://watchfiles.helpmanual.io/api/filters/#watchfiles.BaseFilter.ignore_entity_patterns) - For example, `.DS_STORE/*` will ignore any files found in a folder - named `.DS_STORE`, including `.DS_STORE/bar.pdf` and `foo/.DS_STORE/bar.pdf` + This setting is for additional patterns beyond the built-in defaults. Common system files and directories are already ignored automatically. + The patterns will be compiled via Python's standard `re` module. - A pattern like `._*` will ignore anything starting with `._`, including: - `._foo.pdf` and `._bar/foo.pdf` + Example custom patterns: - Defaults to - `[".DS_Store", ".DS_STORE", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini", "@eaDir/*", "Thumbs.db"]`. + ```json + ["^temp_", "\\.bak$", "^~"] + ``` + + This would ignore: + + - Files starting with `temp_` (e.g., `temp_scan.pdf`) + - Files ending with `.bak` (e.g., `document.pdf.bak`) + - Files starting with `~` (e.g., `~$document.docx`) + + Defaults to `[]` (empty list, uses only built-in defaults). -#### [`PAPERLESS_CONSUMER_BARCODE_SCANNER=`](#PAPERLESS_CONSUMER_BARCODE_SCANNER) {#PAPERLESS_CONSUMER_BARCODE_SCANNER} + The default ignores are `[.DS_Store, .DS_STORE, ._*, desktop.ini, Thumbs.db]` and cannot be overridden. -: Sets the barcode scanner used for barcode functionality. +#### [`PAPERLESS_CONSUMER_IGNORE_DIRS=`](#PAPERLESS_CONSUMER_IGNORE_DIRS) {#PAPERLESS_CONSUMER_IGNORE_DIRS} - Currently, "PYZBAR" (the default) or "ZXING" might be selected. - If you have problems that your Barcodes/QR-Codes are not detected - (especially with bad scan quality and/or small codes), try the other one. +: Additional directory names to ignore in the consumption directory. Directories matching these names (and all their contents) will be skipped. + + This setting is for additional directories beyond the built-in defaults. Matching is done by directory name only, not full path. + + Example: + + ```json + ["temp", "incoming", ".hidden"] + ``` + + Defaults to `[]` (empty list, uses only built-in defaults). + + The default ignores are `[.stfolder, .stversions, .localized, @eaDir, .Spotlight-V100, .Trashes, __MACOSX]` and cannot be overridden. #### [`PAPERLESS_PRE_CONSUME_SCRIPT=`](#PAPERLESS_PRE_CONSUME_SCRIPT) {#PAPERLESS_PRE_CONSUME_SCRIPT} @@ -1271,6 +1349,25 @@ within your documents. Defaults to false. +#### [`PAPERLESS_CONSUMER_POLLING_INTERVAL=`](#PAPERLESS_CONSUMER_POLLING_INTERVAL) {#PAPERLESS_CONSUMER_POLLING_INTERVAL} + +: Configures how the consumer detects new files in the consumption directory. + + When set to `0` (default), paperless uses native filesystem notifications for efficient, immediate detection of new files. + + When set to a positive number, paperless polls the consumption directory at that interval in seconds. Use polling for network filesystems (NFS, SMB/CIFS) where native notifications may not work reliably. + + Defaults to 0. + +#### [`PAPERLESS_CONSUMER_STABILITY_DELAY=`](#PAPERLESS_CONSUMER_STABILITY_DELAY) {#PAPERLESS_CONSUMER_STABILITY_DELAY} + +: Sets the time in seconds that a file must remain unchanged (same size and modification time) before paperless will begin consuming it. + + Increase this value if you experience issues with files being consumed before they are fully written, particularly on slower network storage or + with certain scanner quirks + + Defaults to 5.0 seconds. + ## Workflow webhooks #### [`PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES=`](#PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES) {#PAPERLESS_WEBHOOKS_ALLOWED_SCHEMES} @@ -1295,49 +1392,6 @@ ports. Defaults to true, which allows internal requests. -### Polling {#polling} - -#### [`PAPERLESS_CONSUMER_POLLING=`](#PAPERLESS_CONSUMER_POLLING) {#PAPERLESS_CONSUMER_POLLING} - -: If paperless won't find documents added to your consume folder, it -might not be able to automatically detect filesystem changes. In -that case, specify a polling interval in seconds here, which will -then cause paperless to periodically check your consumption -directory for changes. This will also disable listening for file -system changes with `inotify`. - - Defaults to 0, which disables polling and uses filesystem - notifications. - -#### [`PAPERLESS_CONSUMER_POLLING_RETRY_COUNT=`](#PAPERLESS_CONSUMER_POLLING_RETRY_COUNT) {#PAPERLESS_CONSUMER_POLLING_RETRY_COUNT} - -: If consumer polling is enabled, sets the maximum number of times -paperless will check for a file to remain unmodified. If a file's -modification time and size are identical for two consecutive checks, it -will be consumed. - - Defaults to 5. - -#### [`PAPERLESS_CONSUMER_POLLING_DELAY=`](#PAPERLESS_CONSUMER_POLLING_DELAY) {#PAPERLESS_CONSUMER_POLLING_DELAY} - -: If consumer polling is enabled, sets the delay in seconds between -each check (above) paperless will do while waiting for a file to -remain unmodified. - - Defaults to 5. - -### iNotify {#inotify} - -#### [`PAPERLESS_CONSUMER_INOTIFY_DELAY=`](#PAPERLESS_CONSUMER_INOTIFY_DELAY) {#PAPERLESS_CONSUMER_INOTIFY_DELAY} - -: Sets the time in seconds the consumer will wait for additional -events from inotify before the consumer will consider a file ready -and begin consumption. Certain scanners or network setups may -generate multiple events for a single file, leading to multiple -consumers working on the same file. Configure this to prevent that. - - Defaults to 0.5 seconds. - ## Incoming Mail {#incoming_mail} ### Email OAuth {#email_oauth} @@ -1533,6 +1587,20 @@ assigns or creates tags if a properly formatted barcode is detected. Please refer to the Python regex documentation for more information. +#### [`PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT=`](#PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT) {#PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT} + +: Enables splitting of documents on tag barcodes, similar to how ASN barcodes work. + + When enabled, documents will be split into separate PDFs at pages containing + tag barcodes that match the configured `PAPERLESS_CONSUMER_TAG_BARCODE_MAPPING` + patterns. The page with the tag barcode will be retained in the new document. + + Each split document will have the detected tags assigned to it. + + This only has an effect if `PAPERLESS_CONSUMER_ENABLE_TAG_BARCODE` is also enabled. + + Defaults to false. + ## Audit Trail #### [`PAPERLESS_AUDIT_LOG_ENABLED=`](#PAPERLESS_AUDIT_LOG_ENABLED) {#PAPERLESS_AUDIT_LOG_ENABLED} @@ -1593,6 +1661,16 @@ processing. This only has an effect if Defaults to `0 1 * * *`, once per day. +## Share links + +#### [`PAPERLESS_SHARE_LINK_BUNDLE_CLEANUP_CRON=`](#PAPERLESS_SHARE_LINK_BUNDLE_CLEANUP_CRON) {#PAPERLESS_SHARE_LINK_BUNDLE_CLEANUP_CRON} + +: Controls how often Paperless-ngx removes expired share link bundles (and their generated ZIP archives). + +: If set to the string "disable", expired bundles are not cleaned up automatically. + + Defaults to `0 2 * * *`, once per day at 02:00. + ## Binaries There are a few external software packages that Paperless expects to @@ -1794,3 +1872,93 @@ password. All of these options come from their similarly-named [Django settings] #### [`PAPERLESS_EMAIL_USE_SSL=`](#PAPERLESS_EMAIL_USE_SSL) {#PAPERLESS_EMAIL_USE_SSL} : Defaults to false. + +## Remote OCR + +#### [`PAPERLESS_REMOTE_OCR_ENGINE=`](#PAPERLESS_REMOTE_OCR_ENGINE) {#PAPERLESS_REMOTE_OCR_ENGINE} + +: The remote OCR engine to use. Currently only Azure AI is supported as "azureai". + + Defaults to None, which disables remote OCR. + +#### [`PAPERLESS_REMOTE_OCR_API_KEY=`](#PAPERLESS_REMOTE_OCR_API_KEY) {#PAPERLESS_REMOTE_OCR_API_KEY} + +: The API key to use for the remote OCR engine. + + Defaults to None. + +#### [`PAPERLESS_REMOTE_OCR_ENDPOINT=`](#PAPERLESS_REMOTE_OCR_ENDPOINT) {#PAPERLESS_REMOTE_OCR_ENDPOINT} + +: The endpoint to use for the remote OCR engine. This is required for Azure AI. + + Defaults to None. + +## AI {#ai} + +#### [`PAPERLESS_AI_ENABLED=`](#PAPERLESS_AI_ENABLED) {#PAPERLESS_AI_ENABLED} + +: Enables the AI features in Paperless. This includes the AI-based +suggestions. This setting is required to be set to true in order to use the AI features. + + Defaults to false. + +#### [`PAPERLESS_AI_LLM_EMBEDDING_BACKEND=`](#PAPERLESS_AI_LLM_EMBEDDING_BACKEND) {#PAPERLESS_AI_LLM_EMBEDDING_BACKEND} + +: The embedding backend to use for RAG. This can be either "openai" or "huggingface". + + Defaults to None. + +#### [`PAPERLESS_AI_LLM_EMBEDDING_MODEL=`](#PAPERLESS_AI_LLM_EMBEDDING_MODEL) {#PAPERLESS_AI_LLM_EMBEDDING_MODEL} + +: The model to use for the embedding backend for RAG. This can be set to any of the embedding models supported by the current embedding backend. If not supplied, defaults to "text-embedding-3-small" for OpenAI and "sentence-transformers/all-MiniLM-L6-v2" for Huggingface. + + Defaults to None. + +#### [`PAPERLESS_AI_LLM_BACKEND=`](#PAPERLESS_AI_LLM_BACKEND) {#PAPERLESS_AI_LLM_BACKEND} + +: The AI backend to use. This can be either "openai" or "ollama". If set to "ollama", the AI +features will be run locally on your machine. If set to "openai", the AI features will be run +using the OpenAI API. This setting is required to be set to use the AI features. + + Defaults to None. + + !!! note + + The OpenAI API is a paid service. You will need to set up an OpenAI account and + will be charged for usage incurred by Paperless-ngx features and your document data + will (of course) be sent to the OpenAI API. Paperless-ngx does not endorse the use of the + OpenAI API in any way. + + Refer to the OpenAI terms of service, and use at your own risk. + +#### [`PAPERLESS_AI_LLM_MODEL=`](#PAPERLESS_AI_LLM_MODEL) {#PAPERLESS_AI_LLM_MODEL} + +: The model to use for the AI backend, i.e. "gpt-3.5-turbo", "gpt-4" or any of the models supported by the +current backend. If not supplied, defaults to "gpt-3.5-turbo" for OpenAI and "llama3.1" for Ollama. + + Defaults to None. + +#### [`PAPERLESS_AI_LLM_API_KEY=`](#PAPERLESS_AI_LLM_API_KEY) {#PAPERLESS_AI_LLM_API_KEY} + +: The API key to use for the AI backend. This is required for the OpenAI backend (optional for others). + + Defaults to None. + +#### [`PAPERLESS_AI_LLM_ENDPOINT=`](#PAPERLESS_AI_LLM_ENDPOINT) {#PAPERLESS_AI_LLM_ENDPOINT} + +: The endpoint / url to use for the AI backend. This is required for the Ollama backend (optional for others). + + Defaults to None. + +#### [`PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS=`](#PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS) {#PAPERLESS_AI_LLM_ALLOW_INTERNAL_ENDPOINTS} + +: If set to false, Paperless blocks AI endpoint URLs that resolve to non-public addresses (e.g., localhost, etc). + + Defaults to true, which allows internal endpoints. + +#### [`PAPERLESS_AI_LLM_INDEX_TASK_CRON=`](#PAPERLESS_AI_LLM_INDEX_TASK_CRON) {#PAPERLESS_AI_LLM_INDEX_TASK_CRON} + +: Configures the schedule to update the AI embeddings of text content and metadata for all documents. Only performed if +AI is enabled and the LLM embedding backend is set. + + Defaults to `10 2 * * *`, once per day. diff --git a/docs/development.md b/docs/development.md index 71ca4d930c..e6b9955e89 100644 --- a/docs/development.md +++ b/docs/development.md @@ -6,23 +6,23 @@ on Paperless-ngx. Check out the source from GitHub. The repository is organized in the following way: -- `main` always represents the latest release and will only see - changes when a new release is made. -- `dev` contains the code that will be in the next release. -- `feature-X` contains bigger changes that will be in some release, but - not necessarily the next one. +- `main` always represents the latest release and will only see + changes when a new release is made. +- `dev` contains the code that will be in the next release. +- `feature-X` contains bigger changes that will be in some release, but + not necessarily the next one. When making functional changes to Paperless-ngx, _always_ make your changes on the `dev` branch. Apart from that, the folder structure is as follows: -- `docs/` - Documentation. -- `src-ui/` - Code of the front end. -- `src/` - Code of the back end. -- `scripts/` - Various scripts that help with different parts of - development. -- `docker/` - Files required to build the docker image. +- `docs/` - Documentation. +- `src-ui/` - Code of the front end. +- `src/` - Code of the back end. +- `scripts/` - Various scripts that help with different parts of + development. +- `docker/` - Files required to build the docker image. ## Contributing to Paperless-ngx @@ -75,13 +75,13 @@ first-time setup. 4. Install the Python dependencies: ```bash - $ uv sync --group dev + uv sync --group dev ``` 5. Install pre-commit hooks: ```bash - $ uv run pre-commit install + uv run prek install ``` 6. Apply migrations and create a superuser (also can be done via the web UI) for your development instance: @@ -89,23 +89,22 @@ first-time setup. ```bash # src/ - $ uv run manage.py migrate - $ uv run manage.py createsuperuser + uv run manage.py migrate + uv run manage.py createsuperuser ``` 7. You can now either ... + - install Redis or - - install Redis or + - use the included `scripts/start_services.sh` to use Docker to fire + up a Redis instance (and some other services such as Tika, + Gotenberg and a database server) or - - use the included `scripts/start_services.sh` to use Docker to fire - up a Redis instance (and some other services such as Tika, - Gotenberg and a database server) or + - spin up a bare Redis container - - spin up a bare Redis container - - ``` - docker run -d -p 6379:6379 --restart unless-stopped redis:latest - ``` + ```bash + docker run -d -p 6379:6379 --restart unless-stopped redis:latest + ``` 8. Continue with either back-end or front-end development – or both :-). @@ -118,18 +117,18 @@ work well for development, but you can use whatever you want. Configure the IDE to use the `src/`-folder as the base source folder. Configure the following launch configurations in your IDE: -- `python3 manage.py runserver` -- `python3 manage.py document_consumer` -- `celery --app paperless worker -l DEBUG` (or any other log level) +- `uv run manage.py runserver` +- `uv run manage.py document_consumer` +- `uv run celery --app paperless worker -l DEBUG` (or any other log level) To start them all: ```bash # src/ -$ python3 manage.py runserver & \ - python3 manage.py document_consumer & \ - celery --app paperless worker -l DEBUG +uv run manage.py runserver & \ + uv run manage.py document_consumer & \ + uv run celery --app paperless worker -l DEBUG ``` You might need the front end to test your back end code. @@ -140,17 +139,17 @@ To build the front end once use this command: ```bash # src-ui/ -$ pnpm install -$ ng build --configuration production +pnpm install +pnpm ng build --configuration production ``` ### Testing -- Run `pytest` in the `src/` directory to execute all tests. This also - generates a HTML coverage report. When running tests, `paperless.conf` - is loaded as well. However, the tests rely on the default - configuration. This is not ideal. But for now, make sure no settings - except for DEBUG are overridden when testing. +- Run `pytest` in the `src/` directory to execute all tests. This also + generates a HTML coverage report. When running tests, `paperless.conf` + is loaded as well. However, the tests rely on the default + configuration. This is not ideal. But for now, make sure no settings + except for DEBUG are overridden when testing. !!! note @@ -175,7 +174,7 @@ To add a new development package `uv add --dev ` ## Front end development -The front end is built using AngularJS. In order to get started, you need Node.js (version 14.15+) and +The front end is built using AngularJS. In order to get started, you need Node.js (version 24+) and `pnpm`. !!! note @@ -199,7 +198,7 @@ The front end is built using AngularJS. In order to get started, you need Node.j 4. You can launch a development server by running: ```bash - ng serve + pnpm ng serve ``` This will automatically update whenever you save. However, in-place @@ -217,21 +216,21 @@ commit. See [above](#code-formatting-with-pre-commit-hooks) for installation ins command such as ```bash -$ git ls-files -- '*.ts' | xargs pre-commit run prettier --files +git ls-files -- '*.ts' | xargs uv run prek run prettier --files ``` Front end testing uses Jest and Playwright. Unit tests and e2e tests, respectively, can be run non-interactively with: ```bash -$ ng test -$ npx playwright test +pnpm ng test +pnpm playwright test ``` Playwright also includes a UI which can be run with: ```bash -$ npx playwright test --ui +pnpm playwright test --ui ``` ### Building the frontend @@ -239,7 +238,7 @@ $ npx playwright test --ui In order to build the front end and serve it as part of Django, execute: ```bash -$ ng build --configuration production +pnpm ng build --configuration production ``` This will build the front end and put it in a location from which the @@ -254,14 +253,14 @@ these parts have to be translated separately. ### Front end localization -- The AngularJS front end does localization according to the [Angular - documentation](https://angular.io/guide/i18n). -- The source language of the project is "en_US". -- The source strings end up in the file `src-ui/messages.xlf`. -- The translated strings need to be placed in the - `src-ui/src/locale/` folder. -- In order to extract added or changed strings from the source files, - call `ng extract-i18n`. +- The AngularJS front end does localization according to the [Angular + documentation](https://angular.io/guide/i18n). +- The source language of the project is "en_US". +- The source strings end up in the file `src-ui/messages.xlf`. +- The translated strings need to be placed in the + `src-ui/src/locale/` folder. +- In order to extract added or changed strings from the source files, + call `ng extract-i18n`. Adding new languages requires adding the translated files in the `src-ui/src/locale/` folder and adjusting a couple files. @@ -307,18 +306,18 @@ A majority of the strings that appear in the back end appear only when the admin is used. However, some of these are still shown on the front end (such as error messages). -- The django application does localization according to the [Django - documentation](https://docs.djangoproject.com/en/3.1/topics/i18n/translation/). -- The source language of the project is "en_US". -- Localization files end up in the folder `src/locale/`. -- In order to extract strings from the application, call - `python3 manage.py makemessages -l en_US`. This is important after - making changes to translatable strings. -- The message files need to be compiled for them to show up in the - application. Call `python3 manage.py compilemessages` to do this. - The generated files don't get committed into git, since these are - derived artifacts. The build pipeline takes care of executing this - command. +- The django application does localization according to the [Django + documentation](https://docs.djangoproject.com/en/3.1/topics/i18n/translation/). +- The source language of the project is "en_US". +- Localization files end up in the folder `src/locale/`. +- In order to extract strings from the application, call + `uv run manage.py makemessages -l en_US`. This is important after + making changes to translatable strings. +- The message files need to be compiled for them to show up in the + application. Call `uv run manage.py compilemessages` to do this. + The generated files don't get committed into git, since these are + derived artifacts. The build pipeline takes care of executing this + command. Adding new languages requires adding the translated files in the `src/locale/`-folder and adjusting the file @@ -338,13 +337,13 @@ LANGUAGES = [ ## Building the documentation -The documentation is built using material-mkdocs, see their [documentation](https://squidfunk.github.io/mkdocs-material/reference/). +The documentation is built using Zensical, see their [documentation](https://zensical.org/docs/). If you want to build the documentation locally, this is how you do it: 1. Build the documentation ```bash - $ uv run mkdocs build --config-file mkdocs.yml + $ uv run zensical build ``` _alternatively..._ @@ -355,10 +354,10 @@ If you want to build the documentation locally, this is how you do it: something. ```bash - $ uv run mkdocs serve + $ uv run zensical serve ``` -## Building the Docker image +## Building the Docker image {#docker_build} The docker image is primarily built by the GitHub actions workflow, but it can be faster when developing to build and tag an image locally. @@ -381,10 +380,10 @@ base code. Paperless-ngx uses parsers to add documents. A parser is responsible for: -- Retrieving the content from the original -- Creating a thumbnail -- _optional:_ Retrieving a created date from the original -- _optional:_ Creating an archived document from the original +- Retrieving the content from the original +- Creating a thumbnail +- _optional:_ Retrieving a created date from the original +- _optional:_ Creating an archived document from the original Custom parsers can be added to Paperless-ngx to support more file types. In order to do that, you need to write the parser itself and announce its @@ -442,17 +441,17 @@ def myparser_consumer_declaration(sender, **kwargs): } ``` -- `parser` is a reference to a class that extends `DocumentParser`. -- `weight` is used whenever two or more parsers are able to parse a - file: The parser with the higher weight wins. This can be used to - override the parsers provided by Paperless-ngx. -- `mime_types` is a dictionary. The keys are the mime types your - parser supports and the value is the default file extension that - Paperless-ngx should use when storing files and serving them for - download. We could guess that from the file extensions, but some - mime types have many extensions associated with them and the Python - methods responsible for guessing the extension do not always return - the same value. +- `parser` is a reference to a class that extends `DocumentParser`. +- `weight` is used whenever two or more parsers are able to parse a + file: The parser with the higher weight wins. This can be used to + override the parsers provided by Paperless-ngx. +- `mime_types` is a dictionary. The keys are the mime types your + parser supports and the value is the default file extension that + Paperless-ngx should use when storing files and serving them for + download. We could guess that from the file extensions, but some + mime types have many extensions associated with them and the Python + methods responsible for guessing the extension do not always return + the same value. ## Using Visual Studio Code devcontainer @@ -471,9 +470,8 @@ To get started: 2. VS Code will prompt you with "Reopen in container". Do so and wait for the environment to start. 3. In case your host operating system is Windows: - - - The Source Control view in Visual Studio Code might show: "The detected Git repository is potentially unsafe as the folder is owned by someone other than the current user." Use "Manage Unsafe Repositories" to fix this. - - Git might have detecteded modifications for all files, because Windows is using CRLF line endings. Run `git checkout .` in the containers terminal to fix this issue. + - The Source Control view in Visual Studio Code might show: "The detected Git repository is potentially unsafe as the folder is owned by someone other than the current user." Use "Manage Unsafe Repositories" to fix this. + - Git might have detecteded modifications for all files, because Windows is using CRLF line endings. Run `git checkout .` in the containers terminal to fix this issue. 4. Initialize the project by running the task **Project Setup: Run all Init Tasks**. This will initialize the database tables and create a superuser. Then you can compile the front end @@ -481,3 +479,147 @@ To get started: 5. The project is ready for debugging, start either run the fullstack debug or individual debug processes. Yo spin up the project without debugging run the task **Project Start: Run all Services** + +## Developing Date Parser Plugins + +Paperless-ngx uses a plugin system for date parsing, allowing you to extend or replace the default date parsing behavior. Plugins are discovered using [Python entry points](https://setuptools.pypa.io/en/latest/userguide/entry_point.html). + +### Creating a Date Parser Plugin + +To create a custom date parser plugin, you need to: + +1. Create a class that inherits from `DateParserPluginBase` +2. Implement the required abstract method +3. Register your plugin via an entry point + +#### 1. Implementing the Parser Class + +Your parser must extend `documents.plugins.date_parsing.DateParserPluginBase` and implement the `parse` method: + +```python +from collections.abc import Iterator +import datetime + +from documents.plugins.date_parsing import DateParserPluginBase + + +class MyDateParserPlugin(DateParserPluginBase): + """ + Custom date parser implementation. + """ + + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + """ + Parse dates from the document's filename and content. + + Args: + filename: The original filename of the document + content: The extracted text content of the document + + Yields: + datetime.datetime: Valid datetime objects found in the document + """ + # Your parsing logic here + # Use self.config to access configuration settings + + # Example: parse dates from filename first + if self.config.filename_date_order: + # Your filename parsing logic + yield some_datetime + + # Then parse dates from content + # Your content parsing logic + yield another_datetime +``` + +#### 2. Configuration and Helper Methods + +Your parser instance is initialized with a `DateParserConfig` object accessible via `self.config`. This provides: + +- `languages: list[str]` - List of language codes for date parsing +- `timezone_str: str` - Timezone string for date localization +- `ignore_dates: set[datetime.date]` - Dates that should be filtered out +- `reference_time: datetime.datetime` - Current time for filtering future dates +- `filename_date_order: str | None` - Date order preference for filenames (e.g., "DMY", "MDY") +- `content_date_order: str` - Date order preference for content + +The base class provides two helper methods you can use: + +```python +def _parse_string( + self, + date_string: str, + date_order: str, +) -> datetime.datetime | None: + """ + Parse a single date string using dateparser with configured settings. + """ + +def _filter_date( + self, + date: datetime.datetime | None, +) -> datetime.datetime | None: + """ + Validate a parsed datetime against configured rules. + Filters out dates before 1900, future dates, and ignored dates. + """ +``` + +#### 3. Resource Management (Optional) + +If your plugin needs to acquire or release resources (database connections, API clients, etc.), override the context manager methods. Paperless-ngx will always use plugins as context managers, ensuring resources can be released even in the event of errors. + +#### 4. Registering Your Plugin + +Register your plugin using a setuptools entry point in your package's `pyproject.toml`: + +```toml +[project.entry-points."paperless_ngx.date_parsers"] +my_parser = "my_package.parsers:MyDateParserPlugin" +``` + +The entry point name (e.g., `"my_parser"`) is used for sorting when multiple plugins are found. Paperless-ngx will use the first plugin alphabetically by name if multiple plugins are discovered. + +### Plugin Discovery + +Paperless-ngx automatically discovers and loads date parser plugins at runtime. The discovery process: + +1. Queries the `paperless_ngx.date_parsers` entry point group +2. Validates that each plugin is a subclass of `DateParserPluginBase` +3. Sorts valid plugins alphabetically by entry point name +4. Uses the first valid plugin, or falls back to the default `RegexDateParserPlugin` if none are found + +If multiple plugins are installed, a warning is logged indicating which plugin was selected. + +### Example: Simple Date Parser + +Here's a minimal example that only looks for ISO 8601 dates: + +```python +import datetime +import re +from collections.abc import Iterator + +from documents.plugins.date_parsing.base import DateParserPluginBase + + +class ISODateParserPlugin(DateParserPluginBase): + """ + Parser that only matches ISO 8601 formatted dates (YYYY-MM-DD). + """ + + ISO_REGEX = re.compile(r"\b(\d{4}-\d{2}-\d{2})\b") + + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + # Combine filename and content for searching + text = f"{filename} {content}" + + for match in self.ISO_REGEX.finditer(text): + date_string = match.group(1) + # Use helper method to parse with configured timezone + date = self._parse_string(date_string, "YMD") + # Use helper method to validate the date + filtered_date = self._filter_date(date) + if filtered_date is not None: + yield filtered_date +``` diff --git a/docs/faq.md b/docs/faq.md index 7db8d9dd75..2ef67222be 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,3 +1,7 @@ +--- +title: FAQs +--- + # Frequently Asked Questions ## _What's the general plan for Paperless-ngx?_ @@ -40,31 +44,33 @@ system. On Linux, chances are high that this location is You can always drag those files out of that folder to use them elsewhere. Here are a couple notes about that. -- Paperless-ngx never modifies your original documents. It keeps - checksums of all documents and uses a scheduled sanity checker to - check that they remain the same. -- By default, paperless uses the internal ID of each document as its - filename. This might not be very convenient for export. However, you - can adjust the way files are stored in paperless by - [configuring the filename format](advanced_usage.md#file-name-handling). -- [The exporter](administration.md#exporter) is - another easy way to get your files out of paperless with reasonable - file names. +- Paperless-ngx never modifies your original documents. It keeps + checksums of all documents and uses a scheduled sanity checker to + check that they remain the same. +- By default, paperless uses the internal ID of each document as its + filename. This might not be very convenient for export. However, you + can adjust the way files are stored in paperless by + [configuring the filename format](advanced_usage.md#file-name-handling). +- [The exporter](administration.md#exporter) is + another easy way to get your files out of paperless with reasonable + file names. ## _What file types does paperless-ngx support?_ **A:** Currently, the following files are supported: -- PDF documents, PNG images, JPEG images, TIFF images, GIF images and - WebP images are processed with OCR and converted into PDF documents. -- Plain text documents are supported as well and are added verbatim to - paperless. -- With the optional Tika integration enabled (see [Tika configuration](https://docs.paperless-ngx.com/configuration#tika)), - Paperless also supports various Office documents (.docx, .doc, odt, - .ppt, .pptx, .odp, .xls, .xlsx, .ods). - -Paperless-ngx determines the type of a file by inspecting its content. -The file extensions do not matter. +- PDF documents, PNG images, JPEG images, TIFF images, GIF images and + WebP images are processed with OCR and converted into PDF documents. +- Plain text documents are supported as well and are added verbatim to + paperless. +- With the optional Tika integration enabled (see [Tika configuration](https://docs.paperless-ngx.com/configuration#tika)), + Paperless also supports various Office documents (.docx, .doc, odt, + .ppt, .pptx, .odp, .xls, .xlsx, .ods). + +Paperless-ngx determines the type of a file by inspecting its content +rather than its file extensions. However, files processed via the +consumption directory will be rejected if they have a file extension that +not supported by any of the available parsers. ## _Will paperless-ngx run on Raspberry Pi?_ diff --git a/docs/index.md b/docs/index.md index c1c06eb2b9..ce09a1f83f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,7 @@ +--- +title: Home +--- +
![image](assets/logo_full_black.svg#only-light){.index-logo} ![image](assets/logo_full_white.svg#only-dark){.index-logo} @@ -24,34 +28,36 @@ physical documents into a searchable online archive so you can keep, well, _less ## Features -- **Organize and index** your scanned documents with tags, correspondents, types, and more. -- _Your_ data is stored locally on _your_ server and is never transmitted or shared in any way. -- Performs **OCR** on your documents, adding searchable and selectable text, even to documents scanned with only images. -- Utilizes the open-source Tesseract engine to recognize more than 100 languages. -- Documents are saved as PDF/A format which is designed for long term storage, alongside the unaltered originals. -- Uses machine-learning to automatically add tags, correspondents and document types to your documents. -- Supports PDF documents, images, plain text files, Office documents (Word, Excel, PowerPoint, and LibreOffice equivalents)[^1] and more. -- Paperless stores your documents plain on disk. Filenames and folders are managed by paperless and their format can be configured freely with different configurations assigned to different documents. -- **Beautiful, modern web application** that features: - - Customizable dashboard with statistics. - - Filtering by tags, correspondents, types, and more. - - Bulk editing of tags, correspondents, types and more. - - Drag-and-drop uploading of documents throughout the app. - - Customizable views can be saved and displayed on the dashboard and / or sidebar. - - Support for custom fields of various data types. - - Shareable public links with optional expiration. -- **Full text search** helps you find what you need: - - Auto completion suggests relevant words from your documents. - - Results are sorted by relevance to your search query. - - Highlighting shows you which parts of the document matched the query. - - Searching for similar documents ("More like this") -- **Email processing**[^1]: import documents from your email accounts: - - Configure multiple accounts and rules for each account. - - After processing, paperless can perform actions on the messages such as marking as read, deleting and more. -- A built-in robust **multi-user permissions** system that supports 'global' permissions as well as per document or object. -- A powerful workflow system that gives you even more control. -- **Optimized** for multi core systems: Paperless-ngx consumes multiple documents in parallel. -- The integrated sanity checker makes sure that your document archive is in good health. +- **Organize and index** your scanned documents with tags, correspondents, types, and more. +- _Your_ data is stored locally on _your_ server and is never transmitted or shared in any way, unless you explicitly choose to do so. +- Performs **OCR** on your documents, adding searchable and selectable text, even to documents scanned with only images. + - Utilizes the open-source Tesseract engine to recognize more than 100 languages. + - _New!_ Supports remote OCR with Azure AI (opt-in). +- Documents are saved as PDF/A format which is designed for long term storage, alongside the unaltered originals. +- Uses machine-learning to automatically add tags, correspondents and document types to your documents. +- **New**: Paperless-ngx can now leverage AI (Large Language Models or LLMs) for document suggestions. This is an optional feature that can be enabled (and is disabled by default). +- Supports PDF documents, images, plain text files, Office documents (Word, Excel, PowerPoint, and LibreOffice equivalents)[^1] and more. +- Paperless stores your documents plain on disk. Filenames and folders are managed by paperless and their format can be configured freely with different configurations assigned to different documents. +- **Beautiful, modern web application** that features: + - Customizable dashboard with statistics. + - Filtering by tags, correspondents, types, and more. + - Bulk editing of tags, correspondents, types and more. + - Drag-and-drop uploading of documents throughout the app. + - Customizable views can be saved and displayed on the dashboard and / or sidebar. + - Support for custom fields of various data types. + - Shareable public links with optional expiration. +- **Full text search** helps you find what you need: + - Auto completion suggests relevant words from your documents. + - Results are sorted by relevance to your search query. + - Highlighting shows you which parts of the document matched the query. + - Searching for similar documents ("More like this") +- **Email processing**[^1]: import documents from your email accounts: + - Configure multiple accounts and rules for each account. + - After processing, paperless can perform actions on the messages such as marking as read, deleting and more. +- A built-in robust **multi-user permissions** system that supports 'global' permissions as well as per document or object. +- A powerful workflow system that gives you even more control. +- **Optimized** for multi core systems: Paperless-ngx consumes multiple documents in parallel. +- The integrated sanity checker makes sure that your document archive is in good health. [^1]: Office document and email consumption support is optional and provided by Apache Tika (see [configuration](https://docs.paperless-ngx.com/configuration/#tika)) diff --git a/docs/migration-v3.md b/docs/migration-v3.md new file mode 100644 index 0000000000..4c728a6a44 --- /dev/null +++ b/docs/migration-v3.md @@ -0,0 +1,132 @@ +# v3 Migration Guide + +## Consumer Settings Changes + +The v3 consumer command uses a [different library](https://watchfiles.helpmanual.io/) to unify +the watching for new files in the consume directory. For the user, this removes several configuration options related to delays and retries +and replaces with a single unified setting. It also adjusts how the consumer ignore filtering happens, replaced `fnmatch` with `regex` and +separating the directory ignore from the file ignore. + +### Summary + +| Old Setting | New Setting | Notes | +| ------------------------------ | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| `CONSUMER_POLLING` | [`CONSUMER_POLLING_INTERVAL`](configuration.md#PAPERLESS_CONSUMER_POLLING_INTERVAL) | Renamed for clarity | +| `CONSUMER_INOTIFY_DELAY` | [`CONSUMER_STABILITY_DELAY`](configuration.md#PAPERLESS_CONSUMER_STABILITY_DELAY) | Unified for all modes | +| `CONSUMER_POLLING_DELAY` | _Removed_ | Use `CONSUMER_STABILITY_DELAY` | +| `CONSUMER_POLLING_RETRY_COUNT` | _Removed_ | Automatic with stability tracking | +| `CONSUMER_IGNORE_PATTERNS` | [`CONSUMER_IGNORE_PATTERNS`](configuration.md#PAPERLESS_CONSUMER_IGNORE_PATTERNS) | **Now regex, not fnmatch**; user patterns are added to (not replacing) default ones | +| _New_ | [`CONSUMER_IGNORE_DIRS`](configuration.md#PAPERLESS_CONSUMER_IGNORE_DIRS) | Additional directories to ignore; user entries are added to (not replacing) defaults | + +## Encryption Support + +Document and thumbnail encryption is no longer supported. This was previously deprecated in [paperless-ng 0.9.3](https://github.com/paperless-ngx/paperless-ngx/blob/dev/docs/changelog.md#paperless-ng-093) + +Users must decrypt their document using the `decrypt_documents` command before upgrading. + +## Barcode Scanner Changes + +Support for [pyzbar](https://github.com/NaturalHistoryMuseum/pyzbar) has been removed. The underlying libzbar library has +seen no updates in 16 years and is largely unmaintained, and the pyzbar Python wrapper last saw a release in March 2022. In +practice, pyzbar struggled with barcode detection reliability, particularly on skewed, low-contrast, or partially +obscured barcodes. [zxing-cpp](https://github.com/zxing-cpp/zxing-cpp) is actively maintained, significantly more +reliable at finding barcodes, and now ships pre-built wheels for both x86_64 and arm64, removing the need to build the library. + +The `CONSUMER_BARCODE_SCANNER` setting has been removed. zxing-cpp is now the only backend. + +### Summary + +| Old Setting | New Setting | Notes | +| -------------------------- | ----------- | --------------------------------- | +| `CONSUMER_BARCODE_SCANNER` | _Removed_ | zxing-cpp is now the only backend | + +### Action Required + +- If you were already using `CONSUMER_BARCODE_SCANNER=ZXING`, simply remove the setting. +- If you had `CONSUMER_BARCODE_SCANNER=PYZBAR` or were using the default, no functional changes are needed beyond + removing the setting. zxing-cpp supports all the same barcode formats and you should see improved detection + reliability. +- The `libzbar0` / `libzbar-dev` system packages are no longer required and can be removed from any custom Docker + images or host installations. + +## Database Engine + +`PAPERLESS_DBENGINE` is now required to use PostgreSQL or MariaDB. Previously, the +engine was inferred from the presence of `PAPERLESS_DBHOST`, with `PAPERLESS_DBENGINE` +only needed to select MariaDB over PostgreSQL. + +SQLite users require no changes, though they may explicitly set their engine if desired. + +#### Action Required + +PostgreSQL and MariaDB users must add `PAPERLESS_DBENGINE` to their environment: + +```yaml +# v2 (PostgreSQL inferred from PAPERLESS_DBHOST) +PAPERLESS_DBHOST: postgres + +# v3 (engine must be explicit) +PAPERLESS_DBENGINE: postgresql +PAPERLESS_DBHOST: postgres +``` + +See [`PAPERLESS_DBENGINE`](configuration.md#PAPERLESS_DBENGINE) for accepted values. + +## Database Advanced Options + +The individual SSL, timeout, and pooling variables have been removed in favor of a +single [`PAPERLESS_DB_OPTIONS`](configuration.md#PAPERLESS_DB_OPTIONS) string. This +consolidates a growing set of engine-specific variables into one place, and allows +any option supported by the underlying database driver to be set without requiring a +dedicated environment variable for each. + +The removed variables and their replacements are: + +| Removed Variable | Replacement in `PAPERLESS_DB_OPTIONS` | +| ------------------------- | ---------------------------------------------------------------------------- | +| `PAPERLESS_DBSSLMODE` | `sslmode=` (PostgreSQL) or `ssl_mode=` (MariaDB) | +| `PAPERLESS_DBSSLROOTCERT` | `sslrootcert=` (PostgreSQL) or `ssl.ca=` (MariaDB) | +| `PAPERLESS_DBSSLCERT` | `sslcert=` (PostgreSQL) or `ssl.cert=` (MariaDB) | +| `PAPERLESS_DBSSLKEY` | `sslkey=` (PostgreSQL) or `ssl.key=` (MariaDB) | +| `PAPERLESS_DB_POOLSIZE` | `pool.max_size=` (PostgreSQL only) | +| `PAPERLESS_DB_TIMEOUT` | `timeout=` (SQLite) or `connect_timeout=` (PostgreSQL/MariaDB) | + +The deprecated variables will continue to function for now but will be removed in a +future release. A deprecation warning is logged at startup for each deprecated variable +that is still set. + +#### Action Required + +Users with any of the deprecated variables set should migrate to `PAPERLESS_DB_OPTIONS`. +Multiple options are combined in a single value: + +```bash +PAPERLESS_DB_OPTIONS="sslmode=require;sslrootcert=/certs/ca.pem;pool.max_size=10" +``` + +## OpenID Connect Token Endpoint Authentication + +Some existing OpenID Connect setups may require an explicit token endpoint authentication method after upgrading to v3. + +#### Action Required + +If OIDC login fails at the callback with an `invalid_client` error, add `token_auth_method` to the provider `settings` in +[`PAPERLESS_SOCIALACCOUNT_PROVIDERS`](configuration.md#PAPERLESS_SOCIALACCOUNT_PROVIDERS). + +For example: + +```json +{ + "openid_connect": { + "APPS": [ + { + ... + "settings": { + "server_url": "https://login.example.com", + "token_auth_method": "client_secret_basic" + } + } + ] + } +} +``` diff --git a/docs/setup.md b/docs/setup.md index f239e54297..3b84fd729d 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -1,52 +1,77 @@ -## Installation +--- +title: Setup +--- -You can go multiple routes to setup and run Paperless: +# Installation -- [Use the script to setup a Docker install](#docker_script) -- [Use the Docker compose templates](#docker) -- [Build the Docker image yourself](#docker_build) -- [Install Paperless-ngx directly on your system manually ("bare metal")](#bare_metal) -- A user-maintained list of commercial hosting providers can be found [in the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Related-Projects) +!!! tip "Quick Start" -The Docker routes are quick & easy. These are the recommended routes. -This configures all the stuff from the above automatically so that it -just works and uses sensible defaults for all configuration options. -Here you find a cheat-sheet for docker beginners: [CLI -Basics](https://www.sehn.tech/refs/devops-with-docker/) + If you just want Paperless-ngx running quickly, use our installation script: + ```shell-session + bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)" + ``` + _If piping into a shell directly from the internet makes you nervous, inspect [the script](https://github.com/paperless-ngx/paperless-ngx/blob/main/install-paperless-ngx.sh) first!_ -The bare metal route is complicated to setup but makes it easier should -you want to contribute some code back. You need to configure and run the -above mentioned components yourself. +## Overview -### Use the Installation Script {#docker_script} +Choose the installation route that best fits your setup: -Paperless provides an interactive installation script to setup a Docker Compose -installation. The script asks for a couple configuration options, and will then create the -necessary configuration files, pull the docker image, start Paperless-ngx and create your superuser -account. The script essentially automatically performs the steps described in [Docker setup](#docker). +| Route | Best for | Effort | +| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------ | +| [Installation script](#docker_script) | Fastest first-time setup with guided prompts (recommended for most users) | Low | +| [Docker Compose templates](#docker) | Manual control over compose files and settings | Medium | +| [Bare metal](#bare_metal) | Advanced setups, packaging, and development-adjacent workflows | High | +| [Hosted providers (wiki)](https://github.com/paperless-ngx/paperless-ngx/wiki/Related-Projects#hosting-providers) | Managed hosting options maintained by the community — check details carefully | Varies | -1. Make sure that Docker and Docker Compose are [installed](https://docs.docker.com/engine/install/){:target="\_blank"}. +For most users, Docker is the best option. It is faster to set up, +easier to maintain, and ships with sensible defaults. -2. Download and run the installation script: +The bare-metal route gives you more control, but it requires manual +installation and operation of all components. It is usually best suited +for advanced users and contributors. - ```shell-session - bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)" - ``` +!!! info - !!! note + Because [superuser](usage.md#superusers) accounts have full access to all objects and documents, you may want to create a separate user account for daily use, + or "downgrade" your superuser account to a normal user account after setup. + +## Installation Script {#docker_script} + +Paperless-ngx provides an interactive script for Docker Compose setups. +It asks a few configuration questions, then creates the required files, +pulls the image, starts the containers, and creates your [superuser](usage.md#superusers) +account. In short, it automates the [Docker Compose setup](#docker) described below. + +#### Prerequisites + +- Docker and Docker Compose must be [installed](https://docs.docker.com/engine/install/){:target="\_blank"}. +- macOS users will need [GNU sed](https://formulae.brew.sh/formula/gnu-sed) with support for running as `sed` as well as [wget](https://formulae.brew.sh/formula/wget). + +#### Run the installation script + +```shell-session +bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)" +``` + +#### After installation + +Paperless-ngx should be available at `http://127.0.0.1:8000` (or similar, +depending on your configuration) and you will be able to login with the +credentials you provided during the installation script. + +## Docker Compose Install {#docker} - macOS users will need to install [gnu-sed](https://formulae.brew.sh/formula/gnu-sed) with support - for running as `sed` as well as [wget](https://formulae.brew.sh/formula/wget). +#### Prerequisites -### Use Docker Compose {#docker} +- Docker and Docker Compose must be [installed](https://docs.docker.com/engine/install/){:target="\_blank"}. -1. Make sure that Docker and Docker Compose are [installed](https://docs.docker.com/engine/install/){:target="\_blank"}. +#### Installation -2. Go to the [/docker/compose directory on the project +1. Go to the [/docker/compose directory on the project page](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose){:target="\_blank"} - and download one of the `docker-compose.*.yml` files, depending on which database backend - you want to use. Place the files in a local directory and rename it `docker-compose.yml`. Download the - `docker-compose.env` file and the `.env` file as well in the same directory. + and download one `docker-compose.*.yml` file for your preferred + database backend. Save it in a local directory as `docker-compose.yml`. + Also download `docker-compose.env` and `.env` into that same directory. If you want to enable optional support for Office and other documents, download a file with `-tika` in the file name. @@ -56,15 +81,16 @@ account. The script essentially automatically performs the steps described in [D For new installations, it is recommended to use PostgreSQL as the database backend. -3. Modify `docker-compose.yml` as needed. For example, you may want to change the paths to the - consumption, media etc. directories to use 'bind mounts'. +2. Modify `docker-compose.yml` as needed. For example, you may want to + change the paths for `consume`, `media`, and other directories to + use bind mounts. Find the line that specifies where to mount the directory, e.g.: ```yaml - ./consume:/usr/src/paperless/consume ``` - Replace the part _before_ the colon with a local directory of your choice: + Replace the part _before_ the colon with your local directory: ```yaml - /home/jonaswinkler/paperless-inbox:/usr/src/paperless/consume @@ -75,41 +101,18 @@ account. The script essentially automatically performs the steps described in [D ```yaml ports: - - 8010:8000 + - 8010:8000 ``` - **Rootless** - - !!! warning - - It is currently not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. - - If you want to run Paperless as a rootless container, you will need - to do the following in your `docker-compose.yml`: - - - set the `user` running the container to map to the `paperless` - user in the container. This value (`user_id` below), should be - the same id that `USERMAP_UID` and `USERMAP_GID` are set to in - the next step. See `USERMAP_UID` and `USERMAP_GID` - [here](configuration.md#docker). - - Your entry for Paperless should contain something like: - - > ``` - > webserver: - > image: ghcr.io/paperless-ngx/paperless-ngx:latest - > user: - > ``` - -4. Modify `docker-compose.env` with any configuration options you'd like. +3. Modify `docker-compose.env` with any configuration options you need. See the [configuration documentation](configuration.md) for all options. You may also need to set `USERMAP_UID` and `USERMAP_GID` to - the uid and gid of your user on the host system. Use `id -u` and - `id -g` to get these. This ensures that both the container and the host - user have write access to the consumption directory. If your UID - and GID on the host system is 1000 (the default for the first normal - user on most systems), it will work out of the box without any + the UID and GID of your user on the host system. Use `id -u` and + `id -g` to get these values. This ensures both the container and the + host user can write to the consumption directory. If your UID and + GID are `1000` (the default for the first normal user on many + systems), this usually works out of the box without modifications. Run `id "username"` to check. !!! note @@ -118,115 +121,88 @@ account. The script essentially automatically performs the steps described in [D appending `_FILE` to configuration values. For example [`PAPERLESS_DBUSER`](configuration.md#PAPERLESS_DBUSER) can be set using `PAPERLESS_DBUSER_FILE=/var/run/secrets/password.txt`. - !!! warning +4. Run `docker compose pull`. This pulls the image from the GitHub container registry + by default, but you can pull from Docker Hub by changing the `image` + line to `image: paperlessngx/paperless-ngx:latest`. - Some file systems such as NFS network shares don't support file - system notifications with `inotify`. When storing the consumption - directory on such a file system, paperless will not pick up new - files with the default configuration. You will need to use - [`PAPERLESS_CONSUMER_POLLING`](configuration.md#PAPERLESS_CONSUMER_POLLING), which will disable inotify. See - [here](configuration.md#polling). +5. Run `docker compose up -d`. This will create and start the necessary containers. -5. Run `docker compose pull`. This will pull the image from the GitHub container registry - by default but you can change the image to pull from Docker Hub by changing the `image` - line to `image: paperlessngx/paperless-ngx:latest`. +#### After installation -6. Run `docker compose up -d`. This will create and start the necessary containers. +Your Paperless-ngx instance should now be accessible at +`http://127.0.0.1:8000` (or similar, depending on your configuration). +When you first access the web interface, you will be prompted to create +a [superuser](usage.md#superusers) account. -7. Congratulations! Your Paperless-ngx instance should now be accessible at `http://127.0.0.1:8000` - (or similar, depending on your configuration). When you first access the web interface, you will be - prompted to create a superuser account. +#### Optional Advanced Compose Configurations {#advanced_compose data-toc-label="Advanced Compose Configurations"} -### Build the Docker image yourself {#docker_build} +**Rootless** -1. Clone the entire repository of paperless: +!!! warning - ```shell-session - git clone https://github.com/paperless-ngx/paperless-ngx - ``` + It is not possible to run the container rootless if additional languages are specified via `PAPERLESS_OCR_LANGUAGES`. - The main branch always reflects the latest stable version. +If you want to run Paperless as a rootless container, set `user:` in `docker-compose.yml` to the UID and GID of your host user (use `id -u` and `id -g` to find these values). The container process starts directly as that user with no internal privilege remapping: -2. Copy one of the `docker/compose/docker-compose.*.yml` to - `docker-compose.yml` in the root folder, depending on which database - backend you want to use. Copy `docker-compose.env` into the project - root as well. +```yaml +webserver: + image: ghcr.io/paperless-ngx/paperless-ngx:latest + user: '1000:1000' +``` -3. In the `docker-compose.yml` file, find the line that instructs - Docker Compose to pull the paperless image from Docker Hub: +Do not combine this with `USERMAP_UID` or `USERMAP_GID`, which are intended for the non-rootless case described in step 3. - ```yaml - webserver: - image: ghcr.io/paperless-ngx/paperless-ngx:latest - ``` +**File systems without inotify support (e.g. NFS)** - and replace it with a line that instructs Docker Compose to build - the image from the current working directory instead: +Some file systems, such as NFS network shares, don't support file system +notifications with `inotify`. When the consumption directory is on such a +file system, Paperless-ngx will not pick up new files with the default +configuration. Use [`PAPERLESS_CONSUMER_POLLING`](configuration.md#PAPERLESS_CONSUMER_POLLING) +to enable polling and disable inotify. See [here](configuration.md#polling). - ```yaml - webserver: - build: - context: . - ``` +## Bare Metal Install {#bare_metal} -4. Follow the [Docker setup](#docker) above except when asked to run - `docker compose pull` to pull the image, run +#### Prerequisites - ```shell-session - docker compose build - ``` +- Paperless runs on Linux only, Windows is not supported. +- Python 3.11, 3.12, 3.13, or 3.14 is required. As a policy, Paperless-ngx aims to support at least the three most recent Python versions and drops support for versions as they reach end-of-life. Newer versions may work, but some dependencies may not be fully compatible. + +#### Installation - instead to build the image. - -### Bare Metal Route {#bare_metal} - -Paperless runs on linux only. The following procedure has been tested on -a minimal installation of Debian/Buster, which is the current stable -release at the time of writing. Windows is not and will never be -supported. - -Paperless requires Python 3. At this time, 3.10 - 3.12 are tested versions. -Newer versions may work, but some dependencies may not fully support newer versions. -Support for older Python versions may be dropped as they reach end of life or as newer versions -are released, dependency support is confirmed, etc. - -1. Install dependencies. Paperless requires the following packages. - - - `python3` - - `python3-pip` - - `python3-dev` - - `default-libmysqlclient-dev` for MariaDB - - `pkg-config` for mysqlclient (python dependency) - - `fonts-liberation` for generating thumbnails for plain text - files - - `imagemagick` >= 6 for PDF conversion - - `gnupg` for handling encrypted documents - - `libpq-dev` for PostgreSQL - - `libmagic-dev` for mime type detection - - `mariadb-client` for MariaDB compile time - - `libzbar0` for barcode detection - - `poppler-utils` for barcode detection +1. Install dependencies. Paperless requires the following packages: + - `python3` + - `python3-pip` + - `python3-dev` + - `default-libmysqlclient-dev` for MariaDB + - `pkg-config` for mysqlclient (python dependency) + - `fonts-liberation` for generating thumbnails for plain text + files + - `imagemagick` >= 6 for PDF conversion + - `gnupg` for handling encrypted documents + - `libpq-dev` for PostgreSQL + - `libmagic-dev` for mime type detection + - `mariadb-client` for MariaDB compile time + - `poppler-utils` for barcode detection Use this list for your preferred package management: ``` - python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev default-libmysqlclient-dev pkg-config libmagic-dev libzbar0 poppler-utils + python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev default-libmysqlclient-dev pkg-config libmagic-dev poppler-utils ``` These dependencies are required for OCRmyPDF, which is used for text recognition. - - - `unpaper` - - `ghostscript` - - `icc-profiles-free` - - `qpdf` - - `liblept5` - - `libxml2` - - `pngquant` (suggested for certain PDF image optimizations) - - `zlib1g` - - `tesseract-ocr` >= 4.0.0 for OCR - - `tesseract-ocr` language packs (`tesseract-ocr-eng`, - `tesseract-ocr-deu`, etc) + - `unpaper` + - `ghostscript` + - `icc-profiles-free` + - `qpdf` + - `liblept5` + - `libxml2` + - `pngquant` (suggested for certain PDF image optimizations) + - `zlib1g` + - `tesseract-ocr` >= 4.0.0 for OCR + - `tesseract-ocr` language packs (`tesseract-ocr-eng`, + `tesseract-ocr-deu`, etc) Use this list for your preferred package management: @@ -235,16 +211,14 @@ are released, dependency support is confirmed, etc. ``` On Raspberry Pi, these libraries are required as well: - - - `libatlas-base-dev` - - `libxslt1-dev` - - `mime-support` + - `libatlas-base-dev` + - `libxslt1-dev` + - `mime-support` You will also need these for installing some of the python dependencies: - - - `build-essential` - - `python3-setuptools` - - `python3-wheel` + - `build-essential` + - `python3-setuptools` + - `python3-wheel` Use this list for your preferred package management: @@ -254,8 +228,8 @@ are released, dependency support is confirmed, etc. 2. Install `redis` >= 6.0 and configure it to start automatically. -3. Optional. Install `postgresql` and configure a database, user and - password for paperless. If you do not wish to use PostgreSQL, +3. Optional: Install `postgresql` and configure a database, user, and + password for Paperless-ngx. If you do not wish to use PostgreSQL, MariaDB and SQLite are available as well. !!! note @@ -264,79 +238,74 @@ are released, dependency support is confirmed, etc. extension](https://code.djangoproject.com/wiki/JSON1Extension) is enabled. This is usually the case, but not always. -4. Create a system user with a new home folder under which you wish - to run paperless. +4. Create a system user with a new home folder in which you want + to run Paperless-ngx. ```shell-session adduser paperless --system --home /opt/paperless --group ``` -5. Get the release archive from - for example with +5. Download a release archive from + . For example: ```shell-session - curl -O -L https://github.com/paperless-ngx/paperless-ngx/releases/download/v1.10.2/paperless-ngx-v1.10.2.tar.xz + curl -O -L https://github.com/paperless-ngx/paperless-ngx/releases/download/vX.Y.Z/paperless-ngx-vX.Y.Z.tar.xz ``` Extract the archive with ```shell-session - tar -xf paperless-ngx-v1.10.2.tar.xz + tar -xf paperless-ngx-vX.Y.Z.tar.xz ``` - and copy the contents to the - home folder of the user you created before (`/opt/paperless`). + and copy the contents to the home directory of the user you created + earlier (`/opt/paperless`). - Optional: If you cloned the git repo, you will have to - compile the frontend yourself, see [here](development.md#front-end-development) + Optional: If you cloned the Git repository, you will need to + compile the frontend yourself. See [here](development.md#front-end-development) and use the `build` step, not `serve`. -6. Configure paperless. See [configuration](configuration.md) for details. +6. Configure Paperless-ngx. See [configuration](configuration.md) for details. Edit the included `paperless.conf` and adjust the settings to your - needs. Required settings for getting - paperless running are: - - - [`PAPERLESS_REDIS`](configuration.md#PAPERLESS_REDIS) should point to your redis server, such as - . - - [`PAPERLESS_DBENGINE`](configuration.md#PAPERLESS_DBENGINE) optional, and should be one of `postgres`, - `mariadb`, or `sqlite` - - [`PAPERLESS_DBHOST`](configuration.md#PAPERLESS_DBHOST) should be the hostname on which your - PostgreSQL server is running. Do not configure this to use - SQLite instead. Also configure port, database name, user and - password as necessary. - - [`PAPERLESS_CONSUMPTION_DIR`](configuration.md#PAPERLESS_CONSUMPTION_DIR) should point to a folder which - paperless should watch for documents. You might want to have - this somewhere else. Likewise, [`PAPERLESS_DATA_DIR`](configuration.md#PAPERLESS_DATA_DIR) and - [`PAPERLESS_MEDIA_ROOT`](configuration.md#PAPERLESS_MEDIA_ROOT) define where paperless stores its data. - If you like, you can point both to the same directory. - - [`PAPERLESS_SECRET_KEY`](configuration.md#PAPERLESS_SECRET_KEY) should be a random sequence of - characters. It's used for authentication. Failure to do so - allows third parties to forge authentication credentials. - - [`PAPERLESS_URL`](configuration.md#PAPERLESS_URL) if you are behind a reverse proxy. This should - point to your domain. Please see - [configuration](configuration.md) for more - information. - - Many more adjustments can be made to paperless, especially the OCR - part. The following options are recommended for everyone: - - - Set [`PAPERLESS_OCR_LANGUAGE`](configuration.md#PAPERLESS_OCR_LANGUAGE) to the language most of your - documents are written in. - - Set [`PAPERLESS_TIME_ZONE`](configuration.md#PAPERLESS_TIME_ZONE) to your local time zone. + needs. Required settings for getting Paperless-ngx running are: + - [`PAPERLESS_REDIS`](configuration.md#PAPERLESS_REDIS) should point to your Redis server, such as + `redis://localhost:6379`. + - [`PAPERLESS_DBENGINE`](configuration.md#PAPERLESS_DBENGINE) is optional, and should be one of `postgres`, + `mariadb`, or `sqlite` + - [`PAPERLESS_DBHOST`](configuration.md#PAPERLESS_DBHOST) should be the hostname on which your + PostgreSQL server is running. Do not configure this to use + SQLite instead. Also configure port, database name, user and + password as necessary. + - [`PAPERLESS_CONSUMPTION_DIR`](configuration.md#PAPERLESS_CONSUMPTION_DIR) should point to the folder + that Paperless-ngx should watch for incoming documents. + Likewise, [`PAPERLESS_DATA_DIR`](configuration.md#PAPERLESS_DATA_DIR) and + [`PAPERLESS_MEDIA_ROOT`](configuration.md#PAPERLESS_MEDIA_ROOT) define where Paperless-ngx stores its data. + If needed, these can point to the same directory. + - [`PAPERLESS_SECRET_KEY`](configuration.md#PAPERLESS_SECRET_KEY) should be a random sequence of + characters. It's used for authentication. Failure to do so + allows third parties to forge authentication credentials. + - Set [`PAPERLESS_URL`](configuration.md#PAPERLESS_URL) if you are behind a reverse proxy. This should + point to your domain. Please see + [configuration](configuration.md) for more + information. + + You can make many more adjustments, especially for OCR. + The following options are recommended for most users: + - Set [`PAPERLESS_OCR_LANGUAGE`](configuration.md#PAPERLESS_OCR_LANGUAGE) to the language most of your + documents are written in. + - Set [`PAPERLESS_TIME_ZONE`](configuration.md#PAPERLESS_TIME_ZONE) to your local time zone. !!! warning - Ensure your Redis instance [is secured](https://redis.io/docs/getting-started/#securing-redis). - -7. Create the following directories if they are missing: + Ensure your Redis instance [is secured](https://redis.io/docs/latest/operate/oss_and_stack/management/security/). - - `/opt/paperless/media` - - `/opt/paperless/data` - - `/opt/paperless/consume` +7. Create the following directories if they do not already exist: + - `/opt/paperless/media` + - `/opt/paperless/data` + - `/opt/paperless/consume` - Adjust as necessary if you configured different folders. - Ensure that the paperless user has write permissions for every one - of these folders with + Adjust these paths if you configured different folders. + Then verify that the `paperless` user has write permissions: ```shell-session ls -l -d /opt/paperless/media @@ -350,45 +319,44 @@ are released, dependency support is confirmed, etc. sudo chown paperless:paperless /opt/paperless/consume ``` -8. Install python requirements from the `requirements.txt` file. +8. Install Python dependencies from `requirements.txt`. ```shell-session sudo -Hu paperless pip3 install -r requirements.txt ``` - This will install all python dependencies in the home directory of + This will install all Python dependencies in the home directory of the new paperless user. !!! tip - It is up to you if you wish to use a virtual environment or not for the Python - dependencies. This is an alternative to the above and may require adjusting - the example scripts to utilize the virtual environment paths + You can use a virtual environment if you prefer. If you do, + you may need to adjust the example scripts for your virtual + environment paths. !!! tip If you use modern Python tooling, such as `uv`, installation will not include - dependencies for Postgres or Mariadb. You can select those extras with `--extra ` - or all with `--all-extras` + dependencies for PostgreSQL or MariaDB. You can select those + extras with `--extra `, or install all extras with + `--all-extras`. -9. Go to `/opt/paperless/src`, and execute the following command: +9. Go to `/opt/paperless/src` and execute the following command: ```bash # This creates the database schema. sudo -Hu paperless python3 manage.py migrate ``` - When you first access the web interface you will be prompted to create a superuser account. - -10. Optional: Test that paperless is working by executing +10. Optional: Test that Paperless-ngx is working by running ```bash # Manually starts the webserver sudo -Hu paperless python3 manage.py runserver ``` - and pointing your browser to http://localhost:8000 if - accessing from the same devices on which paperless is installed. + Then point your browser to `http://localhost:8000` if + accessing from the same device on which Paperless-ngx is installed. If accessing from another machine, set up systemd services. You may need to set `PAPERLESS_DEBUG=true` in order for the development server to work normally in your browser. @@ -396,23 +364,23 @@ are released, dependency support is confirmed, etc. !!! warning This is a development server which should not be used in production. - It is not audited for security and performance is inferior to - production ready web servers. + It is not audited for security, and performance is inferior to + production-ready web servers. !!! tip This will not start the consumer. Paperless does this in a separate process. -11. Setup systemd services to run paperless automatically. You may use +11. Set up systemd services to run Paperless-ngx automatically. You may use the service definition files included in the `scripts` folder as a starting point. - Paperless needs the `webserver` script to run the webserver, the - `consumer` script to watch the input folder, `taskqueue` for the - background workers used to handle things like document consumption - and the `scheduler` script to run tasks such as email checking at - certain times . + Paperless needs: + - The `webserver` script to run the webserver. + - The `consumer` script to watch the input folder. + - The `taskqueue` script for background workers (document consumption, etc.). + - The `scheduler` script for periodic tasks such as email checking. !!! note @@ -421,9 +389,9 @@ are released, dependency support is confirmed, etc. `Require=paperless-webserver.socket` in the `webserver` script and configure `granian` to listen on port 80 (set `GRANIAN_PORT`). - These services rely on redis and optionally the database server, but + These services rely on Redis and optionally the database server, but don't need to be started in any particular order. The example files - depend on redis being started. If you use a database server, you + depend on Redis being started. If you use a database server, you should add additional dependencies. !!! note @@ -433,18 +401,15 @@ are released, dependency support is confirmed, etc. !!! warning - If celery won't start (check with + If Celery won't start, check `sudo systemctl status paperless-task-queue.service` for - paperless-task-queue.service and paperless-scheduler.service - ) you need to change the path in the files. Example: + `paperless-task-queue.service` and `paperless-scheduler.service`. + You may need to change the path in the files. Example: `ExecStart=/opt/paperless/.local/bin/celery --app paperless worker --loglevel INFO` -12. Optional: Install a samba server and make the consumption folder - available as a network share. - -13. Configure ImageMagick to allow processing of PDF documents. Most +12. Configure ImageMagick to allow processing of PDF documents. Most distributions have this disabled by default, since PDF documents can - contain malware. If you don't do this, paperless will fall back to + contain malware. If you don't do this, Paperless-ngx will fall back to Ghostscript for certain steps such as thumbnail generation. Edit `/etc/ImageMagick-6/policy.xml` and adjust @@ -459,32 +424,38 @@ are released, dependency support is confirmed, etc. ``` -14. Optional: Install the - [jbig2enc](https://ocrmypdf.readthedocs.io/en/latest/jbig2.html) - encoder. This will reduce the size of generated PDF documents. - You'll most likely need to compile this by yourself, because this - software has been patented until around 2017 and binary packages are - not available for most distributions. +**Optional: Install the [jbig2enc](https://ocrmypdf.readthedocs.io/en/latest/jbig2.html) encoder.** +This will reduce the size of generated PDF documents. You'll most likely need to compile this yourself, because this +software has been patented until around 2017 and binary packages are not available for most distributions. -15. Optional: If using the NLTK machine learning processing (see - [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) for details), - download the NLTK data for the Snowball - Stemmer, Stopwords and Punkt tokenizer to `/usr/share/nltk_data`. Refer to the [NLTK - instructions](https://www.nltk.org/data.html) for details on how to - download the data. +**Optional: download the NLTK data** +If using the NLTK machine-learning processing (see [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) for details), +download the NLTK data for the Snowball Stemmer, Stopwords and Punkt tokenizer to `/usr/share/nltk_data`. Refer to the [NLTK +instructions](https://www.nltk.org/data.html) for details on how to download the data. -# Migrating to Paperless-ngx +#### After installation -Migration is possible both from Paperless-ng or directly from the -'original' Paperless. +Your Paperless-ngx instance should now be accessible at `http://localhost:8000` (or similar, depending on your configuration). +When you first access the web interface you will be prompted to create a [superuser](usage.md#superusers) account. -## Migrating from Paperless-ng +## Build the Docker image yourself {#docker_build data-toc-label="Building the Docker image"} -Paperless-ngx is meant to be a drop-in replacement for Paperless-ng and -thus upgrading should be trivial for most users, especially when using -docker. However, as with any major change, it is recommended to take a +Building the Docker image yourself is typically used for development, but it can also be used for production +if you want to customize the image. See [Building the Docker image](development.md#docker_build) in the +development documentation. + +## Migrating to Paperless-ngx + +You can migrate to Paperless-ngx from Paperless-ng or from the original +Paperless project. + +

Migrating from Paperless-ng

+ +Paperless-ngx is meant to be a drop-in replacement for Paperless-ng, and +upgrading should be trivial for most users, especially when using +Docker. However, as with any major change, it is recommended to take a full backup first. Once you are ready, simply change the docker image to -point to the new source. E.g. if using Docker Compose, edit +point to the new source. For example, if using Docker Compose, edit `docker-compose.yml` and change: ``` @@ -497,66 +468,64 @@ to image: ghcr.io/paperless-ngx/paperless-ngx:latest ``` -and then run `docker compose up -d` which will pull the new image -recreate the container. That's it! +and then run `docker compose up -d`, which will pull the new image and +recreate the container. That's it. Users who installed with the bare-metal route should also update their Git clone to point to `https://github.com/paperless-ngx/paperless-ngx`, -e.g. using the command +for example using: `git remote set-url origin https://github.com/paperless-ngx/paperless-ngx` and then pull the latest version. -## Migrating from Paperless +

Migrating from Paperless

-At its core, paperless-ngx is still paperless and fully compatible. +At its core, Paperless-ngx is still Paperless and fully compatible. However, some things have changed under the hood, so you need to adapt -your setup depending on how you installed paperless. - -This setup describes how to update an existing paperless Docker -installation. The important things to keep in mind are as follows: - -- Read the [changelog](changelog.md) and - take note of breaking changes. -- You should decide if you want to stick with SQLite or want to - migrate your database to PostgreSQL. See [documentation](#sqlite_to_psql) - for details on - how to move your data from SQLite to PostgreSQL. Both work fine with - paperless. However, if you already have a database server running - for other services, you might as well use it for paperless as well. -- The task scheduler of paperless, which is used to execute periodic - tasks such as email checking and maintenance, requires a - [redis](https://redis.io/) message broker instance. The - Docker Compose route takes care of that. -- The layout of the folder structure for your documents and data - remains the same, so you can just plug your old docker volumes into - paperless-ngx and expect it to find everything where it should be. - -Migration to paperless-ngx is then performed in a few simple steps: - -1. Stop paperless. +your setup depending on how you installed Paperless. + +This section describes how to update an existing Paperless Docker +installation. Keep these points in mind: + +- Read the [changelog](changelog.md) and + take note of breaking changes. +- Decide whether to stay on SQLite or migrate to PostgreSQL. + Both work fine with Paperless-ngx. + However, if you already have a database server running + for other services, you might as well use it for Paperless as well. +- The task scheduler of Paperless, which is used to execute periodic + tasks such as email checking and maintenance, requires a + [Redis](https://redis.io/) message broker instance. The + Docker Compose route takes care of that. +- The layout of the folder structure for your documents and data + remains the same, so you can plug your old Docker volumes into + paperless-ngx and expect it to find everything where it should be. + +Migration to Paperless-ngx is then performed in a few simple steps: + +1. Stop Paperless. ```bash cd /path/to/current/paperless docker compose down ``` -2. Do a backup for two purposes: If something goes wrong, you still - have your data. Second, if you don't like paperless-ngx, you can - switch back to paperless. +2. Create a backup for two reasons: if something goes wrong, you still + have your data; and if you don't like paperless-ngx, you can + switch back to Paperless. -3. Download the latest release of paperless-ngx. You can either go with +3. Download the latest release of Paperless-ngx. You can either use the Docker Compose files from [here](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose) or clone the repository to build the image yourself (see - [above](#docker_build)). You can - either replace your current paperless folder or put paperless-ngx in + [development docs](development.md#docker_build)). You can either replace your current paperless + folder or put Paperless-ngx in a different location. !!! warning Paperless-ngx includes a `.env` file. This will set the project name - for docker compose to `paperless`, which will also define the name - of the volumes by paperless-ngx. However, if you experience that + for Docker Compose to `paperless`, which will also define the + volume names created by Paperless-ngx. However, if you notice that paperless-ngx is not using your old paperless volumes, verify the names of your volumes with @@ -572,10 +541,10 @@ Migration to paperless-ngx is then performed in a few simple steps: after you migrated your existing SQLite database. 5. Adjust `docker-compose.yml` and `docker-compose.env` to your needs. - See [Docker setup](#docker) details on - which edits are advised. + See [Docker setup](#docker) for details on + which edits are recommended. -6. [Update paperless.](administration.md#updating) +6. Follow the update procedure in [Update paperless](administration.md#updating). 7. In order to find your existing documents with the new search feature, you need to invoke a one-time operation that will create @@ -586,139 +555,97 @@ Migration to paperless-ngx is then performed in a few simple steps: ``` This will migrate your database and create the search index. After - that, paperless will take care of maintaining the index by itself. + that, Paperless-ngx will maintain the index automatically. -8. Start paperless-ngx. +8. Start Paperless-ngx. ```bash docker compose up -d ``` - This will run paperless in the background and automatically start it + This will run Paperless-ngx in the background and automatically start it on system boot. -9. Paperless installed a permanent redirect to `admin/` in your +9. Paperless may have installed a permanent redirect to `admin/` in your browser. This redirect is still in place and prevents access to the - new UI. Clear your browsing cache in order to fix this. + new UI. Clear your browser cache to fix this. 10. Optionally, follow the instructions below to migrate your existing data to PostgreSQL. -## Migrating from LinuxServer.io Docker Image +

Migrating from LinuxServer.io Docker Image

-As with any upgrades and large changes, it is highly recommended to +As with any upgrade or large change, it is highly recommended to create a backup before starting. This assumes the image was running using Docker Compose, but the instructions are translatable to Docker commands as well. -1. Stop and remove the paperless container -2. If using an external database, stop the container -3. Update Redis configuration - +1. Stop and remove the Paperless container. +2. If using an external database, stop that container. +3. Update Redis configuration. 1. If `REDIS_URL` is already set, change it to [`PAPERLESS_REDIS`](configuration.md#PAPERLESS_REDIS) and continue to step 4. - 1. Otherwise, in the `docker-compose.yml` add a new service for - Redis, following [the example compose + 1. Otherwise, add a new Redis service in `docker-compose.yml`, + following [the example compose files](https://github.com/paperless-ngx/paperless-ngx/tree/main/docker/compose) 1. Set the environment variable [`PAPERLESS_REDIS`](configuration.md#PAPERLESS_REDIS) so it points to - the new Redis container + the new Redis container. -4. Update user mapping +4. Update user mapping. + 1. If set, change the environment variable `PUID` to `USERMAP_UID`. - 1. If set, change the environment variable `PUID` to `USERMAP_UID` + 1. If set, change the environment variable `PGID` to `USERMAP_GID`. - 1. If set, change the environment variable `PGID` to `USERMAP_GID` - -5. Update configuration paths - - 1. Set the environment variable [`PAPERLESS_DATA_DIR`](configuration.md#PAPERLESS_DATA_DIR) to `/config` - -6. Update media paths +5. Update configuration paths. + 1. Set the environment variable [`PAPERLESS_DATA_DIR`](configuration.md#PAPERLESS_DATA_DIR) to `/config`. +6. Update media paths. 1. Set the environment variable [`PAPERLESS_MEDIA_ROOT`](configuration.md#PAPERLESS_MEDIA_ROOT) to - `/data/media` - -7. Update timezone + `/data/media`. +7. Update timezone. 1. Set the environment variable [`PAPERLESS_TIME_ZONE`](configuration.md#PAPERLESS_TIME_ZONE) to the same - value as `TZ` + value as `TZ`. -8. Modify the `image:` to point to +8. Modify `image:` to point to `ghcr.io/paperless-ngx/paperless-ngx:latest` or a specific version if preferred. 9. Start the containers as before, using `docker compose`. -## Moving data from SQLite to PostgreSQL or MySQL/MariaDB {#sqlite_to_psql} - -The best way to migrate between database types is to perform an [export](administration.md#exporter) and then -[import](administration.md#importer) into a clean installation of Paperless-ngx. - -## Moving back to Paperless - -Lets say you migrated to Paperless-ngx and used it for a while, but -decided that you don't like it and want to move back (If you do, send -me a mail about what part you didn't like!), you can totally do that -with a few simple steps. - -Paperless-ngx modified the database schema slightly, however, these -changes can be reverted while keeping your current data, so that your -current data will be compatible with original Paperless. Thumbnails -were also changed from PNG to WEBP format and will need to be -re-generated. - -Execute this: - -```shell-session -$ cd /path/to/paperless -$ docker compose run --rm webserver migrate documents 0023 -``` - -Or without docker: - -```shell-session -$ cd /path/to/paperless/src -$ python3 manage.py migrate documents 0023 -``` - -After regenerating thumbnails, you'll need to clear your cookies -(Paperless-ngx comes with updated dependencies that do cookie-processing -differently) and probably your cache as well. - -# Considerations for less powerful devices {#less-powerful-devices} - -Paperless runs on Raspberry Pi. However, some things are rather slow on -the Pi and configuring some options in paperless can help improve -performance immensely: - -- Stick with SQLite to save some resources. See [troubleshooting](troubleshooting.md#log-reports-creating-paperlesstask-failed) - if you encounter issues with SQLite locking. -- If you do not need the filesystem-based consumer, consider disabling it - entirely by setting [`PAPERLESS_CONSUMER_DISABLE`](configuration.md#PAPERLESS_CONSUMER_DISABLE) to `true`. -- Consider setting [`PAPERLESS_OCR_PAGES`](configuration.md#PAPERLESS_OCR_PAGES) to 1, so that paperless will - only OCR the first page of your documents. In most cases, this page - contains enough information to be able to find it. -- [`PAPERLESS_TASK_WORKERS`](configuration.md#PAPERLESS_TASK_WORKERS) and [`PAPERLESS_THREADS_PER_WORKER`](configuration.md#PAPERLESS_THREADS_PER_WORKER) are - configured to use all cores. The Raspberry Pi models 3 and up have 4 - cores, meaning that paperless will use 2 workers and 2 threads per - worker. This may result in sluggish response times during - consumption, so you might want to lower these settings (example: 2 - workers and 1 thread to always have some computing power left for - other tasks). -- Keep [`PAPERLESS_OCR_MODE`](configuration.md#PAPERLESS_OCR_MODE) at its default value `skip` and consider - OCR'ing your documents before feeding them into paperless. Some - scanners are able to do this! -- Set [`PAPERLESS_OCR_SKIP_ARCHIVE_FILE`](configuration.md#PAPERLESS_OCR_SKIP_ARCHIVE_FILE) to `with_text` to skip archive - file generation for already ocr'ed documents, or `always` to skip it - for all documents. -- If you want to perform OCR on the device, consider using - `PAPERLESS_OCR_CLEAN=none`. This will speed up OCR times and use - less memory at the expense of slightly worse OCR results. -- If using docker, consider setting [`PAPERLESS_WEBSERVER_WORKERS`](configuration.md#PAPERLESS_WEBSERVER_WORKERS) to 1. This will save some memory. -- Consider setting [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) to false, to disable the - more advanced language processing, which can take more memory and - processing time. +## Running Paperless-ngx on less powerful devices {#less-powerful-devices data-toc-label="Less Powerful Devices"} + +Paperless runs on Raspberry Pi. Some tasks can be slow on lower-powered +hardware, but a few settings can improve performance: + +- Stick with SQLite to save some resources. See [troubleshooting](troubleshooting.md#log-reports-creating-paperlesstask-failed) + if you encounter issues with SQLite locking. +- If you do not need the filesystem-based consumer, consider disabling it + entirely by setting [`PAPERLESS_CONSUMER_DISABLE`](configuration.md#PAPERLESS_CONSUMER_DISABLE) to `true`. +- Consider setting [`PAPERLESS_OCR_PAGES`](configuration.md#PAPERLESS_OCR_PAGES) to 1, so that Paperless + OCRs only the first page of your documents. In most cases, this page + contains enough information to be able to find it. +- [`PAPERLESS_TASK_WORKERS`](configuration.md#PAPERLESS_TASK_WORKERS) and [`PAPERLESS_THREADS_PER_WORKER`](configuration.md#PAPERLESS_THREADS_PER_WORKER) are + configured to use all cores. The Raspberry Pi models 3 and up have 4 + cores, meaning that Paperless will use 2 workers and 2 threads per + worker. This may result in sluggish response times during + consumption, so you might want to lower these settings (example: 2 + workers and 1 thread to always have some computing power left for + other tasks). +- Keep [`PAPERLESS_OCR_MODE`](configuration.md#PAPERLESS_OCR_MODE) at its default value `skip` and consider + OCRing your documents before feeding them into Paperless. Some + scanners are able to do this! +- Set [`PAPERLESS_OCR_SKIP_ARCHIVE_FILE`](configuration.md#PAPERLESS_OCR_SKIP_ARCHIVE_FILE) to `with_text` to skip archive + file generation for already OCRed documents, or `always` to skip it + for all documents. +- If you want to perform OCR on the device, consider using + `PAPERLESS_OCR_CLEAN=none`. This will speed up OCR times and use + less memory at the expense of slightly worse OCR results. +- If using Docker, consider setting [`PAPERLESS_WEBSERVER_WORKERS`](configuration.md#PAPERLESS_WEBSERVER_WORKERS) to 1. This will save some memory. +- Consider setting [`PAPERLESS_ENABLE_NLTK`](configuration.md#PAPERLESS_ENABLE_NLTK) to false, to disable the + more advanced language processing, which can take more memory and + processing time. For details, refer to [configuration](configuration.md). @@ -727,17 +654,19 @@ For details, refer to [configuration](configuration.md). Updating the [automatic matching algorithm](advanced_usage.md#automatic-matching) takes quite a bit of time. However, the update mechanism checks if your data has changed before doing the heavy lifting. If you - experience the algorithm taking too much cpu time, consider changing the + experience the algorithm taking too much CPU time, consider changing the schedule in the admin interface to daily. You can also manually invoke the task by changing the date and time of the next run to today/now. The actual matching of the algorithm is fast and works on Raspberry Pi as well as on any other device. -# Using nginx as a reverse proxy {#nginx} +## Additional considerations + +**Using a reverse proxy with Paperless-ngx** -Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx) for user-maintained documentation of using nginx with Paperless-ngx. +Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-a-Reverse-Proxy-with-Paperless-ngx#nginx) for user-maintained documentation on using nginx with Paperless-ngx. -# Enhancing security {#security} +**Enhancing security** -Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-Security-Tools-with-Paperless-ngx) for user-maintained documentation of how to configure security tools like Fail2ban with Paperless-ngx. +Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Using-Security-Tools-with-Paperless-ngx) for user-maintained documentation on configuring security tools like Fail2ban with Paperless-ngx. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index e207518754..47a10bf416 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -4,27 +4,27 @@ Check for the following issues: -- Ensure that the directory you're putting your documents in is the - folder paperless is watching. With docker, this setting is performed - in the `docker-compose.yml` file. Without Docker, look at the - `CONSUMPTION_DIR` setting. Don't adjust this setting if you're - using docker. +- Ensure that the directory you're putting your documents in is the + folder paperless is watching. With docker, this setting is performed + in the `docker-compose.yml` file. Without Docker, look at the + `CONSUMPTION_DIR` setting. Don't adjust this setting if you're + using docker. -- Ensure that redis is up and running. Paperless does its task - processing asynchronously, and for documents to arrive at the task - processor, it needs redis to run. +- Ensure that redis is up and running. Paperless does its task + processing asynchronously, and for documents to arrive at the task + processor, it needs redis to run. -- Ensure that the task processor is running. Docker does this - automatically. Manually invoke the task processor by executing +- Ensure that the task processor is running. Docker does this + automatically. Manually invoke the task processor by executing - ```shell-session - celery --app paperless worker - ``` + ```shell-session + celery --app paperless worker + ``` -- Look at the output of paperless and inspect it for any errors. +- Look at the output of paperless and inspect it for any errors. -- Go to the admin interface, and check if there are failed tasks. If - so, the tasks will contain an error message. +- Go to the admin interface, and check if there are failed tasks. If + so, the tasks will contain an error message. ## Consumer warns `OCR for XX failed` @@ -46,9 +46,9 @@ run: If you notice that the consumer will only pickup files in the consumption directory at startup, but won't find any other files added later, you will need to enable filesystem polling with the configuration -option [`PAPERLESS_CONSUMER_POLLING`](configuration.md#PAPERLESS_CONSUMER_POLLING). +option [`PAPERLESS_CONSUMER_POLLING_INTERVAL`](configuration.md#PAPERLESS_CONSUMER_POLLING_INTERVAL). -This will disable listening to filesystem changes with inotify and +This will disable automatic listening for filesystem changes and paperless will manually check the consumption directory for changes instead. @@ -78,12 +78,12 @@ Ensure that `chown` is possible on these directories. This indicates that the Auto matching algorithm found no documents to learn from. This may have two reasons: -- You don't use the Auto matching algorithm: The error can be safely - ignored in this case. -- You are using the Auto matching algorithm: The classifier explicitly - excludes documents with Inbox tags. Verify that there are documents - in your archive without inbox tags. The algorithm will only learn - from documents not in your inbox. +- You don't use the Auto matching algorithm: The error can be safely + ignored in this case. +- You are using the Auto matching algorithm: The classifier explicitly + excludes documents with Inbox tags. Verify that there are documents + in your archive without inbox tags. The algorithm will only learn + from documents not in your inbox. ## UserWarning in sklearn on every single document @@ -127,10 +127,10 @@ change in the `docker-compose.yml` file: # The gotenberg chromium route is used to convert .eml files. We do not # want to allow external content like tracking pixels or even javascript. command: - - 'gotenberg' - - '--chromium-disable-javascript=true' - - '--chromium-allow-list=file:///tmp/.*' - - '--api-timeout=60s' + - 'gotenberg' + - '--chromium-disable-javascript=true' + - '--chromium-allow-list=file:///tmp/.*' + - '--api-timeout=60s' ``` ## Permission denied errors in the consumption directory @@ -234,47 +234,9 @@ FileNotFoundError: [Errno 2] No such file or directory: '/tmp/ocrmypdf.io.yhk3zb This probably indicates paperless tried to consume the same file twice. This can happen for a number of reasons, depending on how documents are -placed into the consume folder. If paperless is using inotify (the -default) to check for documents, try adjusting the -[inotify configuration](configuration.md#inotify). If polling is enabled, try adjusting the -[polling configuration](configuration.md#polling). - -## Consumer fails waiting for file to remain unmodified. - -You might find messages like these in your log files: - -``` -[ERROR] [paperless.management.consumer] Timeout while waiting on file /usr/src/paperless/src/../consume/SCN_0001.pdf to remain unmodified. -``` - -This indicates paperless timed out while waiting for the file to be -completely written to the consume folder. Adjusting -[polling configuration](configuration.md#polling) values should resolve the issue. - -!!! note - - The user will need to manually move the file out of the consume folder - and back in, for the initial failing file to be consumed. - -## Consumer fails reporting "OS reports file as busy still". - -You might find messages like these in your log files: - -``` -[WARNING] [paperless.management.consumer] Not consuming file /usr/src/paperless/src/../consume/SCN_0001.pdf: OS reports file as busy still -``` - -This indicates paperless was unable to open the file, as the OS reported -the file as still being in use. To prevent a crash, paperless did not -try to consume the file. If paperless is using inotify (the default) to -check for documents, try adjusting the -[inotify configuration](configuration.md#inotify). If polling is enabled, try adjusting the -[polling configuration](configuration.md#polling). - -!!! note - - The user will need to manually move the file out of the consume folder - and back in, for the initial failing file to be consumed. +placed into the consume folder, such as how a scanner may modify a file multiple times as it scans. +Try adjusting the +[file stability delay](configuration.md#PAPERLESS_CONSUMER_STABILITY_DELAY) to a larger value. ## Log reports "Creating PaperlessTask failed". diff --git a/docs/usage.md b/docs/usage.md index d902f6814f..6da6c4d77c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,4 +1,8 @@ -# Usage Overview +--- +title: Basic Usage +--- + +# Usage Paperless-ngx is an application that manages your personal documents. With the (optional) help of a document scanner (see [the scanners wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Scanner-&-Software-Recommendations)), Paperless-ngx transforms your unwieldy @@ -10,42 +14,42 @@ for finding and managing your documents. Paperless essentially consists of two different parts for managing your documents: -- The _consumer_ watches a specified folder and adds all documents in - that folder to paperless. -- The _web server_ (web UI) provides a UI that you use to manage and - search documents. +- The _consumer_ watches a specified folder and adds all documents in + that folder to paperless. +- The _web server_ (web UI) provides a UI that you use to manage and + search documents. Each document has data fields that you can assign to them: -- A _Document_ is a piece of paper that sometimes contains valuable - information. -- The _correspondent_ of a document is the person, institution or - company that a document either originates from, or is sent to. -- A _tag_ is a label that you can assign to documents. Think of labels - as more powerful folders: Multiple documents can be grouped together - with a single tag, however, a single document can also have multiple - tags. This is not possible with folders. The reason folders are not - implemented in paperless is simply that tags are much more versatile - than folders. -- A _document type_ is used to demarcate the type of a document such - as letter, bank statement, invoice, contract, etc. It is used to - identify what a document is about. -- The document _storage path_ is the location where the document files - are stored. See [Storage Paths](advanced_usage.md#storage-paths) for - more information. -- The _date added_ of a document is the date the document was scanned - into paperless. You cannot and should not change this date. -- The _date created_ of a document is the date the document was - initially issued. This can be the date you bought a product, the - date you signed a contract, or the date a letter was sent to you. -- The _archive serial number_ (short: ASN) of a document is the - identifier of the document in your physical document binders. See - [recommended workflow](#usage-recommended-workflow) below. -- The _content_ of a document is the text that was OCR'ed from the - document. This text is fed into the search engine and is used for - matching tags, correspondents and document types. -- Paperless-ngx also supports _custom fields_ which can be used to - store additional metadata about a document. +- A _Document_ is a piece of paper that sometimes contains valuable + information. +- The _correspondent_ of a document is the person, institution or + company that a document either originates from, or is sent to. +- A _tag_ is a label that you can assign to documents. Think of labels + as more powerful folders: Multiple documents can be grouped together + with a single tag, however, a single document can also have multiple + tags. This is not possible with folders. The reason folders are not + implemented in paperless is simply that tags are much more versatile + than folders. +- A _document type_ is used to demarcate the type of a document such + as letter, bank statement, invoice, contract, etc. It is used to + identify what a document is about. +- The document _storage path_ is the location where the document files + are stored. See [Storage Paths](advanced_usage.md#storage-paths) for + more information. +- The _date added_ of a document is the date the document was scanned + into paperless. You cannot and should not change this date. +- The _date created_ of a document is the date the document was + initially issued. This can be the date you bought a product, the + date you signed a contract, or the date a letter was sent to you. +- The _archive serial number_ (short: ASN) of a document is the + identifier of the document in your physical document binders. See + [recommended workflow](#usage-recommended-workflow) below. +- The _content_ of a document is the text that was OCR'ed from the + document. This text is fed into the search engine and is used for + matching tags, correspondents and document types. +- Paperless-ngx also supports _custom fields_ which can be used to + store additional metadata about a document. ## The Web UI @@ -85,6 +89,17 @@ You can view the document, edit its metadata, assign tags, correspondents, document types, and custom fields. You can also view the document history, download the document or share it via a share link. +### Document File Versions + +Think of versions as **file history** for a document. + +- Versions track the underlying file and extracted text content (OCR/text). +- Metadata such as tags, correspondent, document type, storage path and custom fields stay on the "root" document. +- Version files follow normal filename formatting (including storage paths) and add a `_vN` suffix (for example `_v1`, `_v2`). +- By default, search and document content use the latest version. +- In document detail, selecting a version switches the preview, file metadata and content (and download etc buttons) to that version. +- Deleting a non-root version keeps metadata and falls back to the latest remaining version. + ### Management Lists Paperless-ngx includes management lists for tags, correspondents, document types @@ -203,21 +218,20 @@ patterns can include wildcards and multiple patterns separated by a comma. The actions all ensure that the same mail is not consumed twice by different means. These are as follows: -- **Delete:** Immediately deletes mail that paperless has consumed - documents from. Use with caution. -- **Mark as read:** Mark consumed mail as read. Paperless will not - consume documents from already read mails. If you read a mail before - paperless sees it, it will be ignored. -- **Flag:** Sets the 'important' flag on mails with consumed - documents. Paperless will not consume flagged mails. -- **Move to folder:** Moves consumed mails out of the way so that - paperless won't consume them again. -- **Add custom Tag:** Adds a custom tag to mails with consumed - documents (the IMAP standard calls these "keywords"). Paperless - will not consume mails already tagged. Not all mail servers support - this feature! - - - **Apple Mail support:** Apple Mail clients allow differently colored tags. For this to work use `apple:` (e.g. _apple:green_) as a custom tag. Available colors are _red_, _orange_, _yellow_, _blue_, _green_, _violet_ and _grey_. +- **Delete:** Immediately deletes mail that paperless has consumed + documents from. Use with caution. +- **Mark as read:** Mark consumed mail as read. Paperless will not + consume documents from already read mails. If you read a mail before + paperless sees it, it will be ignored. +- **Flag:** Sets the 'important' flag on mails with consumed + documents. Paperless will not consume flagged mails. +- **Move to folder:** Moves consumed mails out of the way so that + paperless won't consume them again. +- **Add custom Tag:** Adds a custom tag to mails with consumed + documents (the IMAP standard calls these "keywords"). Paperless + will not consume mails already tagged. Not all mail servers support + this feature! + - **Apple Mail support:** Apple Mail clients allow differently colored tags. For this to work use `apple:` (e.g. _apple:green_) as a custom tag. Available colors are _red_, _orange_, _yellow_, _blue_, _green_, _violet_ and _grey_. !!! warning @@ -278,6 +292,28 @@ Once setup, navigating to the email settings page in Paperless-ngx will allow yo You can also submit a document using the REST API, see [POSTing documents](api.md#file-uploads) for details. +## Document Suggestions + +Paperless-ngx can suggest tags, correspondents, document types and storage paths for documents based on the content of the document. This is done using a (non-LLM) machine learning model that is trained on the documents in your database. The suggestions are shown in the document detail page and can be accepted or rejected by the user. + +## AI Features + +Paperless-ngx includes several features that use AI to enhance the document management experience. These features are optional and can be enabled or disabled in the settings. If you are using the AI features, you may want to also enable the "LLM index" feature, which supports Retrieval-Augmented Generation (RAG) designed to improve the quality of AI responses. The LLM index feature is not enabled by default and requires additional configuration. + +!!! warning + + Remember that Paperless-ngx will send document content to the AI provider you have configured, so consider the privacy implications of using these features, especially if using a remote model (e.g. OpenAI), instead of the default local model. + +The AI features work by creating an embedding of the text content and metadata of documents, which is then used for various tasks such as similarity search and question answering. This uses the FAISS vector store. + +### AI-Enhanced Suggestions + +If enabled, Paperless-ngx can use an AI LLM model to suggest document titles, dates, tags, correspondents and document types for documents. This feature will always be "opt-in" and does not disable the existing classifier-based suggestion system. Currently, both remote (via the OpenAI API) and local (via Ollama) models are supported, see [configuration](configuration.md#ai) for details. + +### Document Chat + +Paperless-ngx can use an AI LLM model to answer questions about a document or across multiple documents. Again, this feature works best when RAG is enabled. The chat feature is available in the upper app toolbar and will switch between chatting across multiple documents or a single document based on the current view. + ## Sharing documents from Paperless-ngx Paperless-ngx supports sharing documents with other users by assigning them [permissions](#object-permissions) @@ -286,12 +322,14 @@ or using [email](#workflow-action-email) or [webhook](#workflow-action-webhook) ### Share Links -"Share links" are shareable public links to files and can be created and managed under the 'Send' button on the document detail screen. +"Share links" are public links to files (or an archive of files) and can be created and managed under the 'Send' button on the document detail screen or from the bulk editor. -- Share links do not require a user to login and thus link directly to a file. -- Links are unique and are of the form `{paperless-url}/share/{randomly-generated-slug}`. -- Links can optionally have an expiration time set. -- After a link expires or is deleted users will be redirected to the regular paperless-ngx login. +- Share links do not require a user to login and thus link directly to a file or bundled download. +- Links are unique and are of the form `{paperless-url}/share/{randomly-generated-slug}`. +- Links can optionally have an expiration time set. +- After a link expires or is deleted users will be redirected to the regular paperless-ngx login. +- From the document detail screen you can create a share link for that single document. +- From the bulk editor you can create a **share link bundle** for any selection. Paperless-ngx prepares a ZIP archive in the background and exposes a single share link. You can revisit the "Manage share link bundles" dialog to monitor progress, retry failed bundles, or delete links. !!! tip @@ -344,6 +382,11 @@ permissions can be granted to limit access to certain parts of the UI (and corre Superusers can access all parts of the front and backend application as well as any and all objects. Superuser status can only be granted by another superuser. +!!! tip + + Because superuser accounts can see all objects and documents, you may want to use a regular account for day-to-day use. Additional superuser accounts can + be created via [cli](administration.md#create-superuser) or granted superuser status from an existing superuser account. + #### Admin Status Admin status (Django 'staff status') grants access to viewing the paperless logs and the system status dialog @@ -443,6 +486,10 @@ flowchart TD 'Updated' trigger(s)"} + scheduled{"Documents + matching + trigger(s)"} + A[New Document] --> consumption consumption --> |Yes| C[Workflow Actions Run] consumption --> |No| D @@ -455,31 +502,36 @@ flowchart TD updated --> |Yes| J[Workflow Actions Run] updated --> |No| K J --> K[Document Saved] + L[Scheduled Task Check
hourly at :05] --> M[Get All Scheduled Triggers] + M --> scheduled + scheduled --> |Yes| N[Workflow Actions Run] + scheduled --> |No| O[Document Saved] + N --> O ``` #### Filters {#workflow-trigger-filters} Workflows allow you to filter by: -- Source, e.g. documents uploaded via consume folder, API (& the web UI) and mail fetch -- File name, including wildcards e.g. \*.pdf will apply to all pdfs. -- File path, including wildcards. Note that enabling `PAPERLESS_CONSUMER_RECURSIVE` would allow, for - example, automatically assigning documents to different owners based on the upload directory. -- Mail rule. Choosing this option will force 'mail fetch' to be the workflow source. -- Content matching (`Added`, `Updated` and `Scheduled` triggers only). Filter document content using the matching settings. +- Source, e.g. documents uploaded via consume folder, API (& the web UI) and mail fetch +- File name, including wildcards e.g. \*.pdf will apply to all pdfs. +- File path, including wildcards. Note that enabling `PAPERLESS_CONSUMER_RECURSIVE` would allow, for + example, automatically assigning documents to different owners based on the upload directory. +- Mail rule. Choosing this option will force 'mail fetch' to be the workflow source. +- Content matching (`Added`, `Updated` and `Scheduled` triggers only). Filter document content using the matching settings. There are also 'advanced' filters available for `Added`, `Updated` and `Scheduled` triggers: -- Any Tags: Filter for documents with any of the specified tags. -- All Tags: Filter for documents with all of the specified tags. -- No Tags: Filter for documents with none of the specified tags. -- Document type: Filter documents with this document type. -- Not Document types: Filter documents without any of these document types. -- Correspondent: Filter documents with this correspondent. -- Not Correspondents: Filter documents without any of these correspondents. -- Storage path: Filter documents with this storage path. -- Not Storage paths: Filter documents without any of these storage paths. -- Custom field query: Filter documents with a custom field query (the same as used for the document list filters). +- Any Tags: Filter for documents with any of the specified tags. +- All Tags: Filter for documents with all of the specified tags. +- No Tags: Filter for documents with none of the specified tags. +- Document type: Filter documents with this document type. +- Not Document types: Filter documents without any of these document types. +- Correspondent: Filter documents with this correspondent. +- Not Correspondents: Filter documents without any of these correspondents. +- Storage path: Filter documents with this storage path. +- Not Storage paths: Filter documents without any of these storage paths. +- Custom field query: Filter documents with a custom field query (the same as used for the document list filters). ### Workflow Actions @@ -491,80 +543,94 @@ The following workflow action types are available: "Assignment" actions can assign: -- Title, see [workflow placeholders](usage.md#workflow-placeholders) below -- Tags, correspondent, document type and storage path -- Document owner -- View and / or edit permissions to users or groups -- Custom fields. Note that no value for the field will be set +- Title, see [workflow placeholders](usage.md#workflow-placeholders) below +- Tags, correspondent, document type and storage path +- Document owner +- View and / or edit permissions to users or groups +- Custom fields. Note that no value for the field will be set ##### Removal {#workflow-action-removal} "Removal" actions can remove either all of or specific sets of the following: -- Tags, correspondents, document types or storage paths -- Document owner -- View and / or edit permissions -- Custom fields +- Tags, correspondents, document types or storage paths +- Document owner +- View and / or edit permissions +- Custom fields ##### Email {#workflow-action-email} "Email" actions can send documents via email. This action requires a mail server to be [configured](configuration.md#email-sending). You can specify: -- The recipient email address(es) separated by commas -- The subject and body of the email, which can include placeholders, see [placeholders](usage.md#workflow-placeholders) below -- Whether to include the document as an attachment +- The recipient email address(es) separated by commas +- The subject and body of the email, which can include placeholders, see [placeholders](usage.md#workflow-placeholders) below +- Whether to include the document as an attachment ##### Webhook {#workflow-action-webhook} "Webhook" actions send a POST request to a specified URL. You can specify: -- The URL to send the request to -- The request body as text or as key-value pairs, which can include placeholders, see [placeholders](usage.md#workflow-placeholders) below. -- Encoding for the request body, either JSON or form data -- The request headers as key-value pairs +- The URL to send the request to +- The request body as text or as key-value pairs, which can include placeholders, see [placeholders](usage.md#workflow-placeholders) below. +- Encoding for the request body, either JSON or form data +- The request headers as key-value pairs For security reasons, webhooks can be limited to specific ports and disallowed from connecting to local URLs. See the relevant [configuration settings](configuration.md#workflow-webhooks) to change this behavior. If you are allowing non-admins to create workflows, you may want to adjust these settings to prevent abuse. +##### Move to Trash {#workflow-action-move-to-trash} + +"Move to Trash" actions move the document to the trash. The document can be restored +from the trash until the trash is emptied (after the configured delay or manually). + +The "Move to Trash" action will always be executed at the end of the workflow run, +regardless of its position in the action list. After a "Move to Trash" action is executed +no other workflow will be executed on the document. + +If a "Move to Trash" action is executed in a consume pipeline, the consumption +will be aborted and the file will be deleted. + #### Workflow placeholders -Titles can be assigned by workflows using [Jinja templates](https://jinja.palletsprojects.com/en/3.1.x/templates/). -This allows for complex logic to be used to generate the title, including [logical structures](https://jinja.palletsprojects.com/en/3.1.x/templates/#list-of-control-structures) +Titles and webhook payloads can be generated by workflows using [Jinja templates](https://jinja.palletsprojects.com/en/3.1.x/templates/). +This allows for complex logic to be used, including [logical structures](https://jinja.palletsprojects.com/en/3.1.x/templates/#list-of-control-structures) and [filters](https://jinja.palletsprojects.com/en/3.1.x/templates/#id11). The template is provided as a string. -Using Jinja2 Templates is also useful for [Date localization](advanced_usage.md#Date-Localization) in the title. +Using Jinja2 Templates is also useful for [Date localization](advanced_usage.md#date-localization) in the title. The available inputs differ depending on the type of workflow trigger. This is because at the time of consumption (when the text is to be set), no automatic tags etc. have been applied. You can use the following placeholders in the template with any trigger type: -- `{{correspondent}}`: assigned correspondent name -- `{{document_type}}`: assigned document type name -- `{{owner_username}}`: assigned owner username -- `{{added}}`: added datetime -- `{{added_year}}`: added year -- `{{added_year_short}}`: added year -- `{{added_month}}`: added month -- `{{added_month_name}}`: added month name -- `{{added_month_name_short}}`: added month short name -- `{{added_day}}`: added day -- `{{added_time}}`: added time in HH:MM format -- `{{original_filename}}`: original file name without extension -- `{{filename}}`: current file name without extension +- `{{correspondent}}`: assigned correspondent name +- `{{document_type}}`: assigned document type name +- `{{owner_username}}`: assigned owner username +- `{{added}}`: added datetime +- `{{added_year}}`: added year +- `{{added_year_short}}`: added year +- `{{added_month}}`: added month +- `{{added_month_name}}`: added month name +- `{{added_month_name_short}}`: added month short name +- `{{added_day}}`: added day +- `{{added_time}}`: added time in HH:MM format +- `{{original_filename}}`: original file name without extension +- `{{filename}}`: current file name without extension (for "added" workflows this may not be final yet, you can use `{{original_filename}}`) +- `{{doc_title}}`: current document title (cannot be used in title assignment) The following placeholders are only available for "added" or "updated" triggers -- `{{created}}`: created datetime -- `{{created_year}}`: created year -- `{{created_year_short}}`: created year -- `{{created_month}}`: created month -- `{{created_month_name}}`: created month name -- `{created_month_name_short}}`: created month short name -- `{{created_day}}`: created day -- `{{created_time}}`: created time in HH:MM format -- `{{doc_url}}`: URL to the document in the web UI. Requires the `PAPERLESS_URL` setting to be set. +- `{{created}}`: created datetime +- `{{created_year}}`: created year +- `{{created_year_short}}`: created year +- `{{created_month}}`: created month +- `{{created_month_name}}`: created month name +- `{{created_month_name_short}}`: created month short name +- `{{created_day}}`: created day +- `{{created_time}}`: created time in HH:MM format +- `{{doc_url}}`: URL to the document in the web UI. Requires the `PAPERLESS_URL` setting to be set. +- `{{doc_id}}`: Document ID ##### Examples @@ -609,26 +675,26 @@ Multiple fields may be attached to a document but the same field name cannot be The following custom field types are supported: -- `Text`: any text -- `Boolean`: true / false (check / unchecked) field -- `Date`: date -- `URL`: a valid url -- `Integer`: integer number e.g. 12 -- `Number`: float number e.g. 12.3456 -- `Monetary`: [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes) and a number with exactly two decimals, e.g. USD12.30 -- `Document Link`: reference(s) to other document(s) displayed as links, automatically creates a symmetrical link in reverse -- `Select`: a pre-defined list of strings from which the user can choose +- `Text`: any text +- `Boolean`: true / false (check / unchecked) field +- `Date`: date +- `URL`: a valid url +- `Integer`: integer number e.g. 12 +- `Number`: float number e.g. 12.3456 +- `Monetary`: [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes) and a number with exactly two decimals, e.g. USD12.30 +- `Document Link`: reference(s) to other document(s) displayed as links, automatically creates a symmetrical link in reverse +- `Select`: a pre-defined list of strings from which the user can choose ## PDF Actions Paperless-ngx supports basic editing operations for PDFs (these operations currently cannot be performed on non-PDF files). When viewing an individual document you can open the 'PDF Editor' to use a simple UI for re-arranging, rotating, deleting pages and splitting documents. -- Merging documents: available when selecting multiple documents for 'bulk editing'. -- Rotating documents: available when selecting multiple documents for 'bulk editing' and via the pdf editor on an individual document's details page. -- Splitting documents: via the pdf editor on an individual document's details page. -- Deleting pages: via the pdf editor on an individual document's details page. -- Re-arranging pages: via the pdf editor on an individual document's details page. +- Merging documents: available when selecting multiple documents for 'bulk editing'. +- Rotating documents: available when selecting multiple documents for 'bulk editing' and via the pdf editor on an individual document's details page. +- Splitting documents: via the pdf editor on an individual document's details page. +- Deleting pages: via the pdf editor on an individual document's details page. +- Re-arranging pages: via the pdf editor on an individual document's details page. !!! important @@ -706,18 +772,18 @@ the system. Here are a couple examples of tags and types that you could use in your collection. -- An `inbox` tag for newly added documents that you haven't manually - edited yet. -- A tag `car` for everything car related (repairs, registration, - insurance, etc) -- A tag `todo` for documents that you still need to do something with, - such as reply, or perform some task online. -- A tag `bank account x` for all bank statement related to that - account. -- A tag `mail` for anything that you added to paperless via its mail - processing capabilities. -- A tag `missing_metadata` when you still need to add some metadata to - a document, but can't or don't want to do this right now. +- An `inbox` tag for newly added documents that you haven't manually + edited yet. +- A tag `car` for everything car related (repairs, registration, + insurance, etc) +- A tag `todo` for documents that you still need to do something with, + such as reply, or perform some task online. +- A tag `bank account x` for all bank statement related to that + account. +- A tag `mail` for anything that you added to paperless via its mail + processing capabilities. +- A tag `missing_metadata` when you still need to add some metadata to + a document, but can't or don't want to do this right now. ## Searching {#basic-usage_searching} @@ -806,8 +872,8 @@ The following diagram shows how easy it is to manage your documents. ### Preparations in paperless -- Create an inbox tag that gets assigned to all new documents. -- Create a TODO tag. +- Create an inbox tag that gets assigned to all new documents. +- Create a TODO tag. ### Processing of the physical documents @@ -881,78 +947,92 @@ Some documents require attention and require you to act on the document. You may take two different approaches to handle these documents based on how regularly you intend to scan documents and use paperless. -- If you scan and process your documents in paperless regularly, - assign a TODO tag to all scanned documents that you need to process. - Create a saved view on the dashboard that shows all documents with - this tag. -- If you do not scan documents regularly and use paperless solely for - archiving, create a physical todo box next to your physical inbox - and put documents you need to process in the TODO box. When you - performed the task associated with the document, move it to the - inbox. +- If you scan and process your documents in paperless regularly, + assign a TODO tag to all scanned documents that you need to process. + Create a saved view on the dashboard that shows all documents with + this tag. +- If you do not scan documents regularly and use paperless solely for + archiving, create a physical todo box next to your physical inbox + and put documents you need to process in the TODO box. When you + performed the task associated with the document, move it to the + inbox. + +## Remote OCR + +!!! important + + This feature is disabled by default and will always remain strictly "opt-in". + +Paperless-ngx supports performing OCR on documents using remote services. At the moment, this is limited to +[Microsoft's Azure "Document Intelligence" service](https://azure.microsoft.com/en-us/products/ai-services/ai-document-intelligence). +This is of course a paid service (with a free tier) which requires an Azure account and subscription. Azure AI is not affiliated with +Paperless-ngx in any way. When enabled, Paperless-ngx will automatically send appropriate documents to Azure for OCR processing, bypassing +the local OCR engine. See the [configuration](configuration.md#PAPERLESS_REMOTE_OCR_ENGINE) options for more details. + +Additionally, when using a commercial service with this feature, consider both potential costs as well as any associated file size +or page limitations (e.g. with a free tier). ## Architecture Paperless-ngx consists of the following components: -- **The webserver:** This serves the administration pages, the API, - and the new frontend. This is the main tool you'll be using to interact - with paperless. You may start the webserver directly with - - ```shell-session - cd /path/to/paperless/src/ - granian --interface asginl --ws "paperless.asgi:application" - ``` - - or by any other means such as Apache `mod_wsgi`. - -- **The consumer:** This is what watches your consumption folder for - documents. However, the consumer itself does not really consume your - documents. Now it notifies a task processor that a new file is ready - for consumption. I suppose it should be named differently. This was - also used to check your emails, but that's now done elsewhere as - well. - - Start the consumer with the management command `document_consumer`: - - ```shell-session - cd /path/to/paperless/src/ - python3 manage.py document_consumer - ``` - -- **The task processor:** Paperless relies on [Celery - Distributed - Task Queue](https://docs.celeryq.dev/en/stable/index.html) for doing - most of the heavy lifting. This is a task queue that accepts tasks - from multiple sources and processes these in parallel. It also comes - with a scheduler that executes certain commands periodically. - - This task processor is responsible for: - - - Consuming documents. When the consumer finds new documents, it - notifies the task processor to start a consumption task. - - The task processor also performs the consumption of any - documents you upload through the web interface. - - Consuming emails. It periodically checks your configured - accounts for new emails and notifies the task processor to - consume the attachment of an email. - - Maintaining the search index and the automatic matching - algorithm. These are things that paperless needs to do from time - to time in order to operate properly. - - This allows paperless to process multiple documents from your - consumption folder in parallel! On a modern multi core system, this - makes the consumption process with full OCR blazingly fast. - - The task processor comes with a built-in admin interface that you - can use to check whenever any of the tasks fail and inspect the - errors (i.e., wrong email credentials, errors during consuming a - specific file, etc). - -- A [redis](https://redis.io/) message broker: This is a really - lightweight service that is responsible for getting the tasks from - the webserver and the consumer to the task scheduler. These run in a - different process (maybe even on different machines!), and - therefore, this is necessary. - -- Optional: A database server. Paperless supports PostgreSQL, MariaDB - and SQLite for storing its data. +- **The webserver:** This serves the administration pages, the API, + and the new frontend. This is the main tool you'll be using to interact + with paperless. You may start the webserver directly with + + ```shell-session + cd /path/to/paperless/src/ + granian --interface asginl --ws "paperless.asgi:application" + ``` + + or by any other means such as Apache `mod_wsgi`. + +- **The consumer:** This is what watches your consumption folder for + documents. However, the consumer itself does not really consume your + documents. Now it notifies a task processor that a new file is ready + for consumption. I suppose it should be named differently. This was + also used to check your emails, but that's now done elsewhere as + well. + + Start the consumer with the management command `document_consumer`: + + ```shell-session + cd /path/to/paperless/src/ + python3 manage.py document_consumer + ``` + +- **The task processor:** Paperless relies on [Celery - Distributed + Task Queue](https://docs.celeryq.dev/en/stable/index.html) for doing + most of the heavy lifting. This is a task queue that accepts tasks + from multiple sources and processes these in parallel. It also comes + with a scheduler that executes certain commands periodically. + + This task processor is responsible for: + - Consuming documents. When the consumer finds new documents, it + notifies the task processor to start a consumption task. + - The task processor also performs the consumption of any + documents you upload through the web interface. + - Consuming emails. It periodically checks your configured + accounts for new emails and notifies the task processor to + consume the attachment of an email. + - Maintaining the search index and the automatic matching + algorithm. These are things that paperless needs to do from time + to time in order to operate properly. + + This allows paperless to process multiple documents from your + consumption folder in parallel! On a modern multi core system, this + makes the consumption process with full OCR blazingly fast. + + The task processor comes with a built-in admin interface that you + can use to check whenever any of the tasks fail and inspect the + errors (i.e., wrong email credentials, errors during consuming a + specific file, etc). + +- A [redis](https://redis.io/) message broker: This is a really + lightweight service that is responsible for getting the tasks from + the webserver and the consumer to the task scheduler. These run in a + different process (maybe even on different machines!), and + therefore, this is necessary. + +- Optional: A database server. Paperless supports PostgreSQL, MariaDB + and SQLite for storing its data. diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 05826f25f6..0000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,86 +0,0 @@ -site_name: Paperless-ngx -theme: - name: material - logo: assets/logo.svg - font: - text: Roboto - code: Roboto Mono - palette: - # Palette toggle for automatic mode - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - # Palette toggle for light mode - - media: "(prefers-color-scheme: light)" - scheme: default - toggle: - icon: material/brightness-7 - name: Switch to dark mode - # Palette toggle for dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/brightness-4 - name: Switch to system preference - features: - - navigation.tabs - - navigation.top - - toc.integrate - - content.code.annotate - icon: - repo: fontawesome/brands/github - favicon: assets/favicon.png -repo_url: https://github.com/paperless-ngx/paperless-ngx -repo_name: paperless-ngx/paperless-ngx -edit_uri: blob/main/docs/ -extra_css: - - assets/extra.css -markdown_extensions: - - attr_list - - md_in_html - - def_list - - admonition - - tables - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.superfences - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.tilde - - footnotes - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg -strict: true -nav: - - index.md - - setup.md - - 'Basic Usage': usage.md - - configuration.md - - administration.md - - advanced_usage.md - - 'REST API': api.md - - development.md - - 'FAQs': faq.md - - troubleshooting.md - - changelog.md -copyright: Copyright © 2016 - 2023 Daniel Quinn, Jonas Winkler, and the Paperless-ngx team -extra: - social: - - icon: fontawesome/brands/github - link: https://github.com/paperless-ngx/paperless-ngx - - icon: fontawesome/brands/docker - link: https://hub.docker.com/r/paperlessngx/paperless-ngx - - icon: material/chat - link: https://matrix.to/#/#paperless:matrix.org -plugins: - - search - - glightbox: - skip_classes: - - no-lightbox diff --git a/paperless-ngx.code-workspace b/paperless-ngx.code-workspace index 85f5a836b1..91020c66cc 100644 --- a/paperless-ngx.code-workspace +++ b/paperless-ngx.code-workspace @@ -33,6 +33,8 @@ "**/coverage.json": true }, "python.defaultInterpreterPath": ".venv/bin/python3", + "python.analysis.inlayHints.pytestParameters": true, + "python.testing.pytestEnabled": true, }, "extensions": { "recommendations": ["ms-python.python", "charliermarsh.ruff", "editorconfig.editorconfig"], diff --git a/paperless.conf.example b/paperless.conf.example index 1ba21f41d1..9974aeab6a 100644 --- a/paperless.conf.example +++ b/paperless.conf.example @@ -55,10 +55,10 @@ #PAPERLESS_TASK_WORKERS=1 #PAPERLESS_THREADS_PER_WORKER=1 #PAPERLESS_TIME_ZONE=UTC -#PAPERLESS_CONSUMER_POLLING=10 +#PAPERLESS_CONSUMER_POLLING_INTERVAL=10 #PAPERLESS_CONSUMER_DELETE_DUPLICATES=false #PAPERLESS_CONSUMER_RECURSIVE=false -#PAPERLESS_CONSUMER_IGNORE_PATTERNS=[".DS_STORE/*", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini"] +#PAPERLESS_CONSUMER_IGNORE_PATTERNS=[] # Defaults are built in; add filename regexes, e.g. ["^\\.DS_Store$", "^desktop\\.ini$"] #PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false #PAPERLESS_CONSUMER_ENABLE_BARCODES=false #PAPERLESS_CONSUMER_BARCODE_STRING=PATCHT @@ -66,6 +66,7 @@ #PAPERLESS_CONSUMER_BARCODE_DPI=300 #PAPERLESS_CONSUMER_ENABLE_TAG_BARCODE=false #PAPERLESS_CONSUMER_TAG_BARCODE_MAPPING={"TAG:(.*)": "\\g<1>"} +#PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT=false #PAPERLESS_CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED=false #PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_SUBDIR_NAME=double-sided #PAPERLESS_CONSUMER_COLLATE_DOUBLE_SIDED_TIFF_SUPPORT=false diff --git a/pyproject.toml b/pyproject.toml index 6be06907c7..43ad1e1cc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,11 @@ [project] name = "paperless-ngx" -version = "2.19.3" +version = "2.20.11" description = "A community-supported supercharged document management system: scan, index and archive all your physical documents" readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.11" classifiers = [ "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", @@ -16,74 +15,85 @@ classifiers = [ # This will allow testing to not install a webserver, mysql, etc dependencies = [ + "azure-ai-documentintelligence>=1.0.2", "babel>=2.17", - "bleach~=6.2.0", - "celery[redis]~=5.5.1", + "bleach~=6.3.0", + "celery[redis]~=5.6.2", "channels~=4.2", "channels-redis~=4.2", "concurrent-log-handler~=0.9.25", "dateparser~=1.2", # WARNING: django does not use semver. # Only patch versions are guaranteed to not introduce breaking changes. - "django~=5.2.5", - "django-allauth[mfa,socialaccount]~=65.4.0", - "django-auditlog~=3.2.1", - "django-cachalot~=2.8.0", + "django~=5.2.10", + "django-allauth[mfa,socialaccount]~=65.15.0", + "django-auditlog~=3.4.1", + "django-cachalot~=2.9.0", "django-celery-results~=2.6.0", "django-compression-middleware~=0.5.0", "django-cors-headers~=4.9.0", "django-extensions~=4.1", "django-filter~=25.1", - "django-guardian~=3.2.0", + "django-guardian~=3.3.0", "django-multiselectfield~=1.0.1", + "django-rich~=2.2.0", "django-soft-delete~=1.0.18", "django-treenode>=0.23.2", "djangorestframework~=3.16", "djangorestframework-guardian~=0.4.0", "drf-spectacular~=0.28", - "drf-spectacular-sidecar~=2025.9.1", + "drf-spectacular-sidecar~=2026.3.1", "drf-writable-nested~=0.7.1", - "filelock~=3.20.0", + "faiss-cpu>=1.10", + "filelock~=3.25.2", "flower~=2.0.1", - "gotenberg-client~=0.12.0", + "gotenberg-client~=0.13.1", "httpx-oauth~=0.16", + "ijson>=3.2", "imap-tools~=1.11.0", - "inotifyrecursive~=0.3", "jinja2~=3.1.5", "langdetect~=1.0.9", + "llama-index-core>=0.14.12", + "llama-index-embeddings-huggingface>=0.6.1", + "llama-index-embeddings-openai>=0.5.1", + "llama-index-llms-ollama>=0.9.1", + "llama-index-llms-openai>=0.6.13", + "llama-index-vector-stores-faiss>=0.5.2", "nltk~=3.9.1", - "ocrmypdf~=16.11.0", + "ocrmypdf~=17.3.0", + "openai>=1.76", "pathvalidate~=3.3.1", "pdf2image~=1.17.0", "python-dateutil~=2.9.0", - "python-dotenv~=1.1.0", + "python-dotenv~=1.2.1", "python-gnupg~=0.5.4", "python-ipware~=3.0.0", "python-magic~=0.4.27", - "pyzbar~=0.1.9", "rapidfuzz~=3.14.0", "redis[hiredis]~=5.2.1", - "scikit-learn~=1.7.0", + "regex>=2025.9.18", + "scikit-learn~=1.8.0", + "sentence-transformers>=4.1", "setproctitle~=1.3.4", "tika-client~=0.10.0", - "tqdm~=4.67.1", - "watchdog~=6.0", - "whitenoise~=6.9", + "torch~=2.10.0", + "watchfiles>=1.1.1", + "whitenoise~=6.11", "whoosh-reloaded>=2.7.5", - "zxing-cpp~=2.3.0", + "zxing-cpp~=3.0.0", ] optional-dependencies.mariadb = [ "mysqlclient~=2.2.7", ] optional-dependencies.postgres = [ - "psycopg[c,pool]==3.2.9", + "psycopg[c,pool]==3.3", # Direct dependency for proper resolution of the pre-built wheels - "psycopg-c==3.2.9", - "psycopg-pool==3.2.6", + "psycopg-c==3.3", + "psycopg-pool==3.3", ] optional-dependencies.webserver = [ - "granian[uvloop]~=2.5.1", + "granian[uvloop]~=2.7.0", ] [dependency-groups] @@ -95,29 +105,29 @@ dev = [ ] docs = [ - "mkdocs-glightbox~=0.5.1", - "mkdocs-material~=9.6.4", + "zensical>=0.0.21", ] testing = [ "daphne", "factory-boy~=3.3.1", + "faker~=40.8.0", "imagehash", - "pytest~=8.4.1", + "pytest~=9.0.0", "pytest-cov~=7.0.0", - "pytest-django~=4.11.1", - "pytest-env", + "pytest-django~=4.12.0", + "pytest-env~=1.5.0", "pytest-httpx", - "pytest-mock", - "pytest-rerunfailures", + "pytest-mock~=3.15.1", + #"pytest-randomly~=4.0.1", + "pytest-rerunfailures~=16.1", "pytest-sugar", - "pytest-xdist", + "pytest-xdist~=3.8.0", ] lint = [ - "pre-commit~=4.3.0", - "pre-commit-uv~=4.2.0", - "ruff~=0.14.0", + "prek~=0.3.0", + "ruff~=0.15.0", ] typing = [ @@ -126,8 +136,12 @@ typing = [ "django-stubs[compatible-mypy]", "djangorestframework-stubs[compatible-mypy]", "lxml-stubs", + "microsoft-python-type-stubs @ git+https://github.com/microsoft/python-type-stubs.git", "mypy", + "mypy-baseline", + "pyrefly", "types-bleach", + "types-channels", "types-colorama", "types-dateparser", "types-markdown", @@ -136,30 +150,34 @@ typing = [ "types-pytz", "types-redis", "types-setuptools", - "types-tqdm", ] [tool.uv] -required-version = ">=0.5.14" +required-version = ">=0.9.0" package = false environments = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", ] +[[tool.uv.index]] +name = "pytorch-cpu" +url = "https://download.pytorch.org/whl/cpu" +explicit = true + [tool.uv.sources] # Markers are chosen to select these almost exclusively when building the Docker image psycopg-c = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" }, - { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" }, + { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" }, + { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" }, ] -zxing-cpp = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl", marker = "sys_platform == 'linux' and platform_machine == 'x86_64' and python_version == '3.12'" }, - { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl", marker = "sys_platform == 'linux' and platform_machine == 'aarch64' and python_version == '3.12'" }, + +torch = [ + { index = "pytorch-cpu" }, ] [tool.ruff] -target-version = "py310" +target-version = "py311" line-length = 88 src = [ "src", @@ -237,14 +255,18 @@ lint.isort.force-single-line = true [tool.codespell] write-changes = true -ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober" +ignore-words-list = "criterias,afterall,valeu,ureue,equest,ure,assertIn,Oktober,commitish" skip = "src-ui/src/locale/*,src-ui/pnpm-lock.yaml,src-ui/e2e/*,src/paperless_mail/tests/samples/*,src/documents/tests/samples/*,*.po,*.json" -[tool.pytest.ini_options] -minversion = "8.0" -pythonpath = [ - "src", -] +[tool.pytest] +minversion = "9.0" +pythonpath = [ "src" ] + +strict_config = true +strict_markers = true +strict_parametrization_ids = true +strict_xfail = true + testpaths = [ "src/documents/tests/", "src/paperless/tests/", @@ -252,7 +274,10 @@ testpaths = [ "src/paperless_tesseract/tests/", "src/paperless_tika/tests", "src/paperless_text/tests/", + "src/paperless_remote/tests/", + "src/paperless_ai/tests", ] + addopts = [ "--pythonwarnings=all", "--cov", @@ -260,18 +285,39 @@ addopts = [ "--cov-report=xml", "--numprocesses=auto", "--maxprocesses=16", - "--quiet", + "--dist=loadscope", "--durations=50", + "--durations-min=0.5", "--junitxml=junit.xml", - "-o junit_family=legacy", + "-o", + "junit_family=legacy", ] + norecursedirs = [ "src/locale/", ".venv/", "src-ui/" ] DJANGO_SETTINGS_MODULE = "paperless.settings" +markers = [ + "live: Integration tests requiring external services (Gotenberg, Tika, nginx, etc)", + "nginx: Tests that make HTTP requests to the local nginx service", + "gotenberg: Tests requiring Gotenberg service", + "tika: Tests requiring Tika service", + "greenmail: Tests requiring Greenmail service", + "date_parsing: Tests which cover date parsing from content or filename", + "management: Tests which cover management commands/functionality", +] + [tool.pytest_env] PAPERLESS_DISABLE_DBHANDLER = "true" PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache" +PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer" + +[tool.coverage.report] +exclude_also = [ + "if settings.AUDIT_LOG_ENABLED:", + "if AUDIT_LOG_ENABLED:", + "if TYPE_CHECKING:", +] [tool.coverage.run] source = [ @@ -284,13 +330,6 @@ omit = [ "paperless/auth.py", ] -[tool.coverage.report] -exclude_also = [ - "if settings.AUDIT_LOG_ENABLED:", - "if AUDIT_LOG_ENABLED:", - "if TYPE_CHECKING:", -] - [tool.mypy] mypy_path = "src" plugins = [ @@ -304,5 +343,15 @@ disallow_untyped_defs = true warn_redundant_casts = true warn_unused_ignores = true +[tool.pyrefly] +search-path = [ "src" ] +baseline = ".pyrefly-baseline.json" +python-platform = "linux" + [tool.django-stubs] django_settings_module = "paperless.settings" + +[tool.mypy-baseline] +baseline_path = ".mypy-baseline.txt" +sort_baseline = true +ignore_categories = [ "note" ] diff --git a/scripts/post-consumption-example.sh b/scripts/post-consumption-example.sh index fbcd0b4cff..00517321ac 100755 --- a/scripts/post-consumption-example.sh +++ b/scripts/post-consumption-example.sh @@ -19,6 +19,4 @@ following additional information about it: * Correspondent: ${DOCUMENT_CORRESPONDENT} * Tags: ${DOCUMENT_TAGS} -It was consumed with the passphrase ${PASSPHRASE} - " diff --git a/src-ui/.eslintrc.json b/src-ui/.eslintrc.json deleted file mode 100644 index b8eaf6f855..0000000000 --- a/src-ui/.eslintrc.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "root": true, - "ignorePatterns": [ - "projects/**/*", - "/src/app/components/common/pdf-viewer/**" - ], - "overrides": [ - { - "files": [ - "*.ts" - ], - "parserOptions": { - "project": [ - "tsconfig.json" - ], - "createDefaultProgram": true - }, - "extends": [ - "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" - ], - "rules": { - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "pngx", - "style": "camelCase" - } - ], - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "pngx", - "style": "kebab-case" - } - ] - } - }, - { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], - "rules": {} - } - ] -} diff --git a/src-ui/angular.json b/src-ui/angular.json index b55e441f3f..9ed7488b66 100644 --- a/src-ui/angular.json +++ b/src-ui/angular.json @@ -31,6 +31,7 @@ "fi-FI": "src/locale/messages.fi_FI.xlf", "fr-FR": "src/locale/messages.fr_FR.xlf", "hu-HU": "src/locale/messages.hu_HU.xlf", + "id-ID": "src/locale/messages.id_ID.xlf", "it-IT": "src/locale/messages.it_IT.xlf", "ja-JP": "src/locale/messages.ja_JP.xlf", "lb-LU": "src/locale/messages.lb_LU.xlf", @@ -85,7 +86,6 @@ ], "scripts": [], "allowedCommonJsDependencies": [ - "ng2-pdf-viewer", "file-saver", "utif" ], @@ -155,16 +155,7 @@ "builder": "@angular-builders/jest:run", "options": { "tsConfig": "tsconfig.spec.json", - "assets": [ - "src/favicon.ico", - "src/apple-touch-icon.png", - "src/assets", - "src/manifest.webmanifest" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [] + "zoneless": false } }, "lint": { diff --git a/src-ui/e2e/dashboard/dashboard.spec.ts b/src-ui/e2e/dashboard/dashboard.spec.ts index 2ee8c1f357..801f431f38 100644 --- a/src-ui/e2e/dashboard/dashboard.spec.ts +++ b/src-ui/e2e/dashboard/dashboard.spec.ts @@ -52,11 +52,11 @@ test('dashboard saved view document links', async ({ page }) => { test('test slim sidebar', async ({ page }) => { await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' }) await page.goto('/dashboard') - await page.locator('#sidebarMenu').getByRole('button').click() + await page.locator('.sidebar-slim-toggler').click() await expect( page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard') ).toBeHidden() - await page.locator('#sidebarMenu').getByRole('button').click() + await page.locator('.sidebar-slim-toggler').click() await expect( page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard') ).toBeVisible() diff --git a/src-ui/e2e/dashboard/requests/api-dashboard1.har b/src-ui/e2e/dashboard/requests/api-dashboard1.har index a9c2380f24..07ff8ef9e5 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard1.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard1.har @@ -58,7 +58,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" + "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true,\"dashboard_views_visible_ids\":[7,4],\"sidebar_views_visible_ids\":[7,4,11]},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/dashboard/requests/api-dashboard2.har b/src-ui/e2e/dashboard/requests/api-dashboard2.har index eac0bb6eec..912fbf3082 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard2.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard2.har @@ -58,7 +58,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" + "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true,\"dashboard_views_visible_ids\":[7,4],\"sidebar_views_visible_ids\":[7,4,11]},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/dashboard/requests/api-dashboard3.har b/src-ui/e2e/dashboard/requests/api-dashboard3.har index cb1ce67b9f..6c441970ce 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard3.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard3.har @@ -58,7 +58,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" + "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true,\"dashboard_views_visible_ids\":[7,4],\"sidebar_views_visible_ids\":[7,4,11]},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/dashboard/requests/api-dashboard4.har b/src-ui/e2e/dashboard/requests/api-dashboard4.har index 3353ea4593..33bf46d6a5 100644 --- a/src-ui/e2e/dashboard/requests/api-dashboard4.har +++ b/src-ui/e2e/dashboard/requests/api-dashboard4.har @@ -58,7 +58,7 @@ "content": { "size": -1, "mimeType": "application/json", - "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" + "text": "{\"user\":{\"id\":2,\"username\":\"testuser\",\"is_superuser\":false,\"groups\":[]},\"settings\":{\"language\":\"\",\"bulk_edit\":{\"confirmation_dialogs\":true,\"apply_on_close\":false},\"documentListSize\":50,\"dark_mode\":{\"use_system\":false,\"enabled\":\"false\",\"thumb_inverted\":\"true\"},\"theme\":{\"color\":\"#9fbf2f\"},\"document_details\":{\"native_pdf_viewer\":false},\"date_display\":{\"date_locale\":\"\",\"date_format\":\"mediumDate\"},\"notifications\":{\"consumer_new_documents\":true,\"consumer_success\":true,\"consumer_failed\":true,\"consumer_suppress_on_dashboard\":true},\"comments_enabled\":true,\"slim_sidebar\":false,\"update_checking\":{\"enabled\":false,\"backend_setting\":\"default\"},\"saved_views\":{\"warn_on_unsaved_change\":true,\"dashboard_views_visible_ids\":[7,4],\"sidebar_views_visible_ids\":[7,4,11]},\"notes_enabled\":true,\"tour_complete\":true},\"permissions\":[\"delete_schedule\",\"view_note\",\"view_taskattributes\",\"delete_ormq\",\"add_ormq\",\"change_tag\",\"change_chordcounter\",\"delete_savedviewfilterrule\",\"delete_comment\",\"add_session\",\"add_mailrule\",\"add_tokenproxy\",\"delete_taskresult\",\"view_failure\",\"add_tag\",\"view_savedviewfilterrule\",\"view_paperlesstask\",\"change_mailaccount\",\"change_frontendsettings\",\"delete_group\",\"add_userobjectpermission\",\"add_failure\",\"delete_mailrule\",\"view_userobjectpermission\",\"change_schedule\",\"delete_note\",\"view_ormq\",\"add_note\",\"add_chordcounter\",\"delete_token\",\"change_failure\",\"add_savedviewfilterrule\",\"delete_user\",\"view_correspondent\",\"view_schedule\",\"change_tokenproxy\",\"view_user\",\"delete_task\",\"delete_correspondent\",\"delete_chordcounter\",\"delete_document\",\"view_taskresult\",\"change_document\",\"add_frontendsettings\",\"view_mailrule\",\"change_ormq\",\"delete_taskattributes\",\"view_logentry\",\"view_mailaccount\",\"view_log\",\"delete_success\",\"view_frontendsettings\",\"view_documenttype\",\"change_taskresult\",\"view_permission\",\"add_groupobjectpermission\",\"change_user\",\"view_document\",\"change_userobjectpermission\",\"add_user\",\"add_correspondent\",\"add_token\",\"add_mailaccount\",\"change_group\",\"add_group\",\"delete_processedmail\",\"delete_contenttype\",\"add_savedview\",\"view_chordcounter\",\"delete_tokenproxy\",\"change_groupresult\",\"delete_session\",\"view_savedview\",\"view_processedmail\",\"add_comment\",\"view_storagepath\",\"delete_documenttype\",\"add_processedmail\",\"view_group\",\"change_processedmail\",\"view_session\",\"delete_storagepath\",\"delete_paperlesstask\",\"add_groupresult\",\"delete_savedview\",\"delete_userobjectpermission\",\"view_tokenproxy\",\"add_task\",\"view_tag\",\"add_taskresult\",\"change_documenttype\",\"change_mailrule\",\"add_document\",\"change_comment\",\"view_task\",\"view_groupresult\",\"change_contenttype\",\"view_groupobjectpermission\",\"change_task\",\"add_log\",\"add_success\",\"change_savedview\",\"delete_frontendsettings\",\"view_success\",\"add_permission\",\"change_correspondent\",\"add_paperlesstask\",\"change_paperlesstask\",\"add_contenttype\",\"view_comment\",\"change_logentry\",\"delete_logentry\",\"delete_mailaccount\",\"change_session\",\"delete_groupresult\",\"add_logentry\",\"change_savedviewfilterrule\",\"change_success\",\"delete_tag\",\"add_taskattributes\",\"change_groupobjectpermission\",\"delete_failure\",\"add_uisettings\",\"view_token\",\"add_schedule\",\"delete_log\",\"delete_uisettings\",\"change_permission\",\"delete_groupobjectpermission\",\"change_token\",\"view_uisettings\",\"change_uisettings\",\"delete_permission\",\"add_storagepath\",\"change_storagepath\",\"view_contenttype\",\"change_note\",\"change_log\",\"change_taskattributes\",\"add_documenttype\"]}" }, "headersSize": -1, "bodySize": -1, diff --git a/src-ui/e2e/document-detail/document-detail.spec.ts b/src-ui/e2e/document-detail/document-detail.spec.ts index 8e09671880..ba10745ecf 100644 --- a/src-ui/e2e/document-detail/document-detail.spec.ts +++ b/src-ui/e2e/document-detail/document-detail.spec.ts @@ -72,7 +72,7 @@ test('should show a mobile preview', async ({ page }) => { await page.setViewportSize({ width: 400, height: 1000 }) await expect(page.getByRole('tab', { name: 'Preview' })).toBeVisible() await page.getByRole('tab', { name: 'Preview' }).click() - await page.waitForSelector('pdf-viewer') + await page.waitForSelector('pngx-pdf-viewer') }) test('should show a list of notes', async ({ page }) => { diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts index 0a7b54fcbd..9aa4d2fdcd 100644 --- a/src-ui/e2e/document-list/document-list.spec.ts +++ b/src-ui/e2e/document-list/document-list.spec.ts @@ -180,6 +180,9 @@ test('bulk edit', async ({ page }) => { await page.locator('pngx-document-card-small').nth(2).click() await page.getByRole('button', { name: 'Tags' }).click() + await page + .getByRole('textbox', { name: 'Filter tags' }) + .fill('TagWithPartial') await page.getByRole('menuitem', { name: 'TagWithPartial' }).click() await page.getByRole('button', { name: 'Apply' }).click() diff --git a/src-ui/e2e/permissions/global-permissions.spec.ts b/src-ui/e2e/permissions/global-permissions.spec.ts index e5bc98edf5..7021b6d9b0 100644 --- a/src-ui/e2e/permissions/global-permissions.spec.ts +++ b/src-ui/e2e/permissions/global-permissions.spec.ts @@ -33,9 +33,9 @@ test('should not allow user to view correspondents', async ({ page }) => { await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' }) await page.goto('/dashboard') await expect( - page.getByRole('link', { name: 'Correspondents' }) + page.getByRole('link', { name: 'Attributes' }) ).not.toBeAttached() - await page.goto('/correspondents') + await page.goto('/attributes/correspondents') await expect(page.locator('body')).toHaveText( /You don't have permissions to do that/i ) @@ -44,8 +44,10 @@ test('should not allow user to view correspondents', async ({ page }) => { test('should not allow user to view tags', async ({ page }) => { await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' }) await page.goto('/dashboard') - await expect(page.getByRole('link', { name: 'Tags' })).not.toBeAttached() - await page.goto('/tags') + await expect( + page.getByRole('link', { name: 'Attributes' }) + ).not.toBeAttached() + await page.goto('/attributes/tags') await expect(page.locator('body')).toHaveText( /You don't have permissions to do that/i ) @@ -55,9 +57,9 @@ test('should not allow user to view document types', async ({ page }) => { await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' }) await page.goto('/dashboard') await expect( - page.getByRole('link', { name: 'Document Types' }) + page.getByRole('link', { name: 'Attributes' }) ).not.toBeAttached() - await page.goto('/documenttypes') + await page.goto('/attributes/documenttypes') await expect(page.locator('body')).toHaveText( /You don't have permissions to do that/i ) @@ -67,9 +69,9 @@ test('should not allow user to view storage paths', async ({ page }) => { await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' }) await page.goto('/dashboard') await expect( - page.getByRole('link', { name: 'Storage Paths' }) + page.getByRole('link', { name: 'Attributes' }) ).not.toBeAttached() - await page.goto('/storagepaths') + await page.goto('/attributes/storagepaths') await expect(page.locator('body')).toHaveText( /You don't have permissions to do that/i ) diff --git a/src-ui/eslint.config.js b/src-ui/eslint.config.js new file mode 100644 index 0000000000..6ee2e4de86 --- /dev/null +++ b/src-ui/eslint.config.js @@ -0,0 +1,58 @@ +const angularEslintPlugin = require('@angular-eslint/eslint-plugin') +const angularTemplatePlugin = require('@angular-eslint/eslint-plugin-template') +const angularTemplateParser = require('@angular-eslint/template-parser') +const tsParser = require('@typescript-eslint/parser') + +module.exports = [ + { + ignores: ['projects/**/*', 'src/app/components/common/pdf-viewer/**'], + }, + { + files: ['**/*.ts'], + languageOptions: { + parser: tsParser, + parserOptions: { + project: ['tsconfig.json'], + createDefaultProgram: true, + ecmaVersion: 2020, + sourceType: 'module', + }, + }, + plugins: { + '@angular-eslint': angularEslintPlugin, + '@angular-eslint/template': angularTemplatePlugin, + }, + processor: '@angular-eslint/template/extract-inline-html', + rules: { + ...angularEslintPlugin.configs.recommended.rules, + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'pngx', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'pngx', + style: 'kebab-case', + }, + ], + }, + }, + { + files: ['**/*.html'], + languageOptions: { + parser: angularTemplateParser, + }, + plugins: { + '@angular-eslint/template': angularTemplatePlugin, + }, + rules: { + ...angularTemplatePlugin.configs.recommended.rules, + }, + }, +] diff --git a/src-ui/jest.config.js b/src-ui/jest.config.js index aab8eb0165..7b06016dd6 100644 --- a/src-ui/jest.config.js +++ b/src-ui/jest.config.js @@ -1,5 +1,23 @@ +const { createEsmPreset } = require('jest-preset-angular/presets') + +const esmPreset = createEsmPreset({ + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', +}) + module.exports = { - preset: 'jest-preset-angular', + ...esmPreset, + transform: { + ...esmPreset.transform, + '^.+\\.(ts|js|mjs|html|svg)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + useESM: true, + }, + ], + }, setupFilesAfterEnv: ['/setup-jest.ts'], testPathIgnorePatterns: [ '/node_modules/', @@ -8,10 +26,15 @@ module.exports = { 'abstract-paperless-service', ], transformIgnorePatterns: [ - `/node_modules/.pnpm/(?!.*\\.mjs$|lodash-es|@angular\\+common.*locales)`, + 'node_modules/(?!.*(\\.mjs$|tslib|lodash-es|@angular/common/locales/.*\\.js$))', ], moduleNameMapper: { + ...esmPreset.moduleNameMapper, '^src/(.*)': '/src/$1', + '^pdfjs-dist/legacy/build/pdf\\.mjs$': + '/src/test/mocks/pdfjs-legacy-build-pdf.ts', + '^pdfjs-dist/web/pdf_viewer\\.mjs$': + '/src/test/mocks/pdfjs-web-pdf_viewer.ts', }, workerIdleMemoryLimit: '512MB', reporters: [ diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 63360c9916..d2e12880f9 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -5,14 +5,14 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/alert/alert.ts 50 Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -20,239 +20,239 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts - 157,159 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts + 159,162 Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts - 198 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/carousel/carousel.ts + 202,203 + + + + Select month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + 91 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + 91 + + + + Select year + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + 91 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation-select.ts + 91 Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/datepicker/datepicker-navigation.ts 112 - - HH + + «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - Close + + « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - Select month - - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 - + + » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - «« + + »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - Hours + + First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - « + + Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - MM + + Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - » + + Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/pagination/pagination-config.ts + 20 - - Select year + + - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/progressbar/progressbar.ts + 41,42 + + + HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 - - Minutes + + Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 - - »» + + MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 - - First + + Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 - - - - Previous - - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 - - - - Next - - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 - - - - Last - - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts - 13 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/timepicker/timepicker-config.ts + 21 - - + + Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts - 41,42 + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@20.0.0_@angular+common@21.2.4_@angular+core@21.2.4_@angular+_a674c967733fd102e5fef61ea5e6b837/node_modules/src/toast/toast-config.ts + 54 Document was added to Paperless-ngx. src/app/app.component.ts - 95 + 90 src/app/app.component.ts - 104 + 99 Open document src/app/app.component.ts - 97 + 92 src/app/components/admin/trash/trash.component.ts @@ -279,29 +279,29 @@ Could not add : src/app/app.component.ts - 119 + 114 Document is being processed by Paperless-ngx. src/app/app.component.ts - 134 + 129 Dashboard src/app/app.component.ts - 141 + 136 src/app/components/app-frame/app-frame.component.html - 84 + 87 src/app/components/app-frame/app-frame.component.html - 86 + 89 src/app/components/dashboard/dashboard.component.html @@ -312,46 +312,62 @@ Documents src/app/app.component.ts - 152 + 147 + + + src/app/components/admin/settings/settings.component.html + 193 + + + src/app/components/admin/settings/settings.component.html + 197 src/app/components/app-frame/app-frame.component.html - 91 + 94 src/app/components/app-frame/app-frame.component.html - 93 + 96 + + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 85 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 36 src/app/components/document-list/document-list.component.ts - 192 + 211 - src/app/components/manage/custom-fields/custom-fields.component.html - 61 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 58 - src/app/components/manage/management-list/management-list.component.html - 133 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 151 - src/app/components/manage/management-list/management-list.component.html - 133 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 151 - src/app/components/manage/management-list/management-list.component.html - 133 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 151 - src/app/components/manage/management-list/management-list.component.html - 133 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 151 Settings src/app/app.component.ts - 164 + 159 src/app/components/admin/settings/settings.component.html @@ -359,89 +375,64 @@ src/app/components/app-frame/app-frame.component.html - 51 + 54 src/app/components/app-frame/app-frame.component.html - 255 + 273 src/app/components/app-frame/app-frame.component.html - 257 - - - - Prev - - src/app/app.component.ts - 170 - - - - Next - - src/app/app.component.ts - 171 - - - src/app/components/document-detail/document-detail.component.html - 113 - - - - End - - src/app/app.component.ts - 172 + 275 The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. src/app/app.component.ts - 178 + 168 Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. src/app/app.component.ts - 185 + 175 The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. src/app/app.component.ts - 190 + 180 The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. src/app/app.component.ts - 197 + 187 Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. src/app/app.component.ts - 203 + 193 - - Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + Attributes like tags, correspondents, document types, storage paths and custom fields can all be managed here. They can also be created from the document edit view. src/app/app.component.ts - 208 + 198 Manage e-mail accounts and rules for automatically importing documents. src/app/app.component.ts - 216 + 206 src/app/components/manage/mail/mail.component.html @@ -452,14 +443,14 @@ Workflows give you more control over the document pipeline. src/app/app.component.ts - 224 + 214 File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. src/app/app.component.ts - 232 + 222 src/app/components/admin/tasks/tasks.component.html @@ -470,28 +461,28 @@ Check out the settings for various tweaks to the web app. src/app/app.component.ts - 240 + 230 Thank you! 🙏 src/app/app.component.ts - 248 + 238 There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. src/app/app.component.ts - 250 + 240 Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! src/app/app.component.ts - 252 + 242 @@ -512,40 +503,119 @@ Read the documentation about this setting src/app/components/admin/config/config.component.html - 25 + 26 - - Enable + + Reset src/app/components/admin/config/config.component.html - 34 + 30 - src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + src/app/components/admin/config/config.component.html + 31 + + + src/app/components/admin/settings/settings.component.html + 136 - - Discard + + Enable src/app/components/admin/config/config.component.html - 53 + 39 - src/app/components/document-detail/document-detail.component.html - 374 + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 125 + + + + Cancel + + src/app/components/admin/config/config.component.html + 62 + + + src/app/components/admin/settings/settings.component.html + 399 + + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 47 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 25 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 51 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 80 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 30 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 56 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 115 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 31 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 182 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 81 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 21 + + + src/app/components/manage/saved-views/saved-views.component.html + 82 Save src/app/components/admin/config/config.component.html - 56 + 65 src/app/components/admin/settings/settings.component.html - 362 + 400 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -569,7 +639,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 76 + 81 src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html @@ -593,7 +663,7 @@ src/app/components/document-detail/document-detail.component.html - 367 + 445 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -601,53 +671,53 @@ src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html - 21 + 22 src/app/components/manage/saved-views/saved-views.component.html - 74 + 83 Error retrieving config src/app/components/admin/config/config.component.ts - 103 + 105 Invalid JSON src/app/components/admin/config/config.component.ts - 129 + 131 Configuration updated src/app/components/admin/config/config.component.ts - 173 + 175 An error occurred updating configuration src/app/components/admin/config/config.component.ts - 178 + 180 File successfully updated src/app/components/admin/config/config.component.ts - 200 + 202 An error occurred uploading file src/app/components/admin/config/config.component.ts - 205 + 207 @@ -658,11 +728,11 @@ src/app/components/app-frame/app-frame.component.html - 290 + 308 src/app/components/app-frame/app-frame.component.html - 293 + 311 @@ -680,11 +750,11 @@ src/app/components/document-list/document-list.component.html - 37 + 35 src/app/components/manage/saved-views/saved-views.component.html - 52 + 60 @@ -713,7 +783,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -739,9 +809,13 @@ src/app/components/common/input/document-link/document-link.component.html 58 + + src/app/components/common/page-header/page-header.component.html + 30 + src/app/components/common/permissions-dialog/permissions-dialog.component.html - 23 + 29 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html @@ -749,7 +823,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -761,57 +835,64 @@ src/app/components/document-detail/document-detail.component.html - 387 + 465 src/app/components/document-list/document-list.component.html - 134 + 128 - src/app/components/manage/custom-fields/custom-fields.component.html - 26 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 14 - src/app/components/manage/mail/mail.component.html - 40 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 52 - src/app/components/manage/mail/mail.component.html - 123 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 52 - src/app/components/manage/mail/mail.component.html - 192 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 52 - src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html - 16 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 52 - src/app/components/manage/management-list/management-list.component.html - 52 + src/app/components/manage/mail/mail.component.html + 40 - src/app/components/manage/management-list/management-list.component.html - 52 + src/app/components/manage/mail/mail.component.html + 123 - src/app/components/manage/management-list/management-list.component.html - 52 + src/app/components/manage/mail/mail.component.html + 192 - src/app/components/manage/management-list/management-list.component.html - 52 + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 16 src/app/components/manage/saved-views/saved-views.component.html - 68 + 77 src/app/components/manage/workflows/workflows.component.html 28 + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -907,92 +988,125 @@ 99,100 - - Items per page - - src/app/components/admin/settings/settings.component.html - 107 - - Sidebar src/app/components/admin/settings/settings.component.html - 123 + 107 Use 'slim' sidebar (icons only) src/app/components/admin/settings/settings.component.html - 127 + 111 Dark mode src/app/components/admin/settings/settings.component.html - 134 + 118 Use system settings src/app/components/admin/settings/settings.component.html - 137 + 121 Enable dark mode src/app/components/admin/settings/settings.component.html - 138 + 122 Invert thumbnails in dark mode src/app/components/admin/settings/settings.component.html - 139 + 123 Theme Color + + src/app/components/admin/settings/settings.component.html + 129 + + + + Global search + + src/app/components/admin/settings/settings.component.html + 142 + + + src/app/components/app-frame/global-search/global-search.component.ts + 122 + + + + Do not include advanced search results src/app/components/admin/settings/settings.component.html 145 - - Reset + + Full search links to src/app/components/admin/settings/settings.component.html - 152 + 151 + + + + Title and content search + + src/app/components/admin/settings/settings.component.html + 155 + + + + Advanced search + + src/app/components/admin/settings/settings.component.html + 156 + + + src/app/components/app-frame/global-search/global-search.component.html + 24 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 208 Update checking src/app/components/admin/settings/settings.component.html - 157 + 161 Enable update checking src/app/components/admin/settings/settings.component.html - 160 + 164 What's this? src/app/components/admin/settings/settings.component.html - 161 + 165 src/app/components/common/page-header/page-header.component.html - 9 + 18 src/app/components/common/permissions-select/permissions-select.component.html @@ -1007,29 +1121,29 @@ Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. src/app/components/admin/settings/settings.component.html - 165,167 + 169,171 No tracking data is collected by the app in any way. src/app/components/admin/settings/settings.component.html - 169 + 173 Saved Views src/app/components/admin/settings/settings.component.html - 175 + 179 src/app/components/app-frame/app-frame.component.html - 215 + 233 src/app/components/app-frame/app-frame.component.html - 217 + 235 src/app/components/manage/saved-views/saved-views.component.html @@ -1040,156 +1154,174 @@ Show warning when closing saved views with unsaved changes src/app/components/admin/settings/settings.component.html - 178 + 182 Show document counts in sidebar saved views src/app/components/admin/settings/settings.component.html - 179 + 183 - - Document editing + + Items per page src/app/components/admin/settings/settings.component.html - 185 + 200 - - Use PDF viewer provided by the browser + + Document editing src/app/components/admin/settings/settings.component.html - 189 + 212 + + + + Use PDF viewer provided by the browser + + src/app/components/admin/settings/settings.component.html + 215 This is usually faster for displaying large PDF documents, but it might not work on some browsers. src/app/components/admin/settings/settings.component.html - 189 + 215 Default zoom src/app/components/admin/settings/settings.component.html - 195 + 221 Fit width src/app/components/admin/settings/settings.component.html - 199 + 225 Fit page src/app/components/admin/settings/settings.component.html - 200 + 226 Only applies to the Paperless-ngx PDF viewer. src/app/components/admin/settings/settings.component.html - 202 + 228 Automatically remove inbox tag(s) on save src/app/components/admin/settings/settings.component.html - 208 + 234 Show document thumbnail during loading src/app/components/admin/settings/settings.component.html - 214 + 240 - - Global search + + Built-in fields to show: src/app/components/admin/settings/settings.component.html - 218 + 246 + + + Uncheck fields to hide them on the document details page. - src/app/components/app-frame/global-search/global-search.component.ts - 122 + src/app/components/admin/settings/settings.component.html + 258 - - Do not include advanced search results + + Bulk editing src/app/components/admin/settings/settings.component.html - 221 + 264 - - Full search links to + + Show confirmation dialogs src/app/components/admin/settings/settings.component.html - 227 + 267 - - Title and content search + + Apply on close src/app/components/admin/settings/settings.component.html - 231 + 268 - - Advanced search + + PDF Editor src/app/components/admin/settings/settings.component.html - 232 + 272 - src/app/components/app-frame/global-search/global-search.component.html - 24 + src/app/components/document-detail/document-detail.component.html + 82 - src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + src/app/components/document-detail/document-detail.component.ts + 1758 - - Bulk editing + + Default editing mode src/app/components/admin/settings/settings.component.html - 237 + 275 - - Show confirmation dialogs + + Create new document(s) src/app/components/admin/settings/settings.component.html - 240 + 279 + + + src/app/components/common/pdf-editor/pdf-editor.component.html + 82 - - Apply on close + + Add document version src/app/components/admin/settings/settings.component.html - 241 + 280 + + + src/app/components/common/pdf-editor/pdf-editor.component.html + 87 Notes src/app/components/admin/settings/settings.component.html - 245 + 285 src/app/components/document-list/document-list.component.html - 242 + 236 src/app/data/document.ts @@ -1204,14 +1336,14 @@ Enable notes src/app/components/admin/settings/settings.component.html - 248 + 288 Permissions src/app/components/admin/settings/settings.component.html - 259 + 297 src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html @@ -1227,7 +1359,7 @@ src/app/components/document-detail/document-detail.component.html - 343 + 390 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -1237,6 +1369,10 @@ src/app/components/document-list/filter-editor/filter-editor.component.html 101 + + src/app/components/manage/document-attributes/document-attributes.component.html + 44 + src/app/components/manage/mail/mail.component.html 66 @@ -1253,49 +1389,33 @@ src/app/components/manage/mail/mail.component.html 166 - - src/app/components/manage/management-list/management-list.component.html - 7 - - - src/app/components/manage/management-list/management-list.component.html - 7 - - - src/app/components/manage/management-list/management-list.component.html - 7 - - - src/app/components/manage/management-list/management-list.component.html - 7 - Default Permissions src/app/components/admin/settings/settings.component.html - 262 + 300 Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. src/app/components/admin/settings/settings.component.html - 266,268 + 304,306 Default Owner src/app/components/admin/settings/settings.component.html - 273 + 311 Objects without an owner can be viewed and edited by all users src/app/components/admin/settings/settings.component.html - 277 + 315 src/app/components/common/input/permissions/permissions-form/permissions-form.component.html @@ -1306,18 +1426,18 @@ Default View Permissions src/app/components/admin/settings/settings.component.html - 282 + 320 Users: src/app/components/admin/settings/settings.component.html - 287 + 325 src/app/components/admin/settings/settings.component.html - 314 + 352 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1348,11 +1468,11 @@ Groups: src/app/components/admin/settings/settings.component.html - 297 + 335 src/app/components/admin/settings/settings.component.html - 324 + 362 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1383,14 +1503,14 @@ Default Edit Permissions src/app/components/admin/settings/settings.component.html - 309 + 347 Edit permissions also grant viewing permissions src/app/components/admin/settings/settings.component.html - 333 + 371 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -1409,7 +1529,7 @@ Notifications src/app/components/admin/settings/settings.component.html - 341 + 379 src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html @@ -1420,181 +1540,257 @@ Document processing src/app/components/admin/settings/settings.component.html - 344 + 382 Show notifications when new documents are detected src/app/components/admin/settings/settings.component.html - 348 + 386 Show notifications when document processing completes successfully src/app/components/admin/settings/settings.component.html - 349 + 387 Show notifications when document processing fails src/app/components/admin/settings/settings.component.html - 350 + 388 Suppress notifications on dashboard src/app/components/admin/settings/settings.component.html - 351 + 389 This will suppress all messages about document processing status on the dashboard. src/app/components/admin/settings/settings.component.html - 351 + 389 - - Cancel + + Use system language - src/app/components/admin/settings/settings.component.html - 361 + src/app/components/admin/settings/settings.component.ts + 79 + + + Use date format of display language - src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + src/app/components/admin/settings/settings.component.ts + 82 + + + Archive serial number - src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html - 25 + src/app/components/admin/settings/settings.component.ts + 96 - src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html - 51 + src/app/components/document-detail/document-detail.component.html + 165 + + + + Correspondent + + src/app/components/admin/settings/settings.component.ts + 98 - src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html - 27 + src/app/components/document-detail/document-detail.component.html + 170 - src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + src/app/components/document-list/bulk-editor/bulk-editor.component.html 19 - src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html - 39 + src/app/components/document-list/document-list.component.html + 205 - src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 75 + src/app/components/document-list/filter-editor/filter-editor.component.html + 50 - src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html - 76 + src/app/data/document.ts + 46 - src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html - 30 + src/app/data/document.ts + 89 + + + Document type - src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html - 56 + src/app/components/admin/settings/settings.component.ts + 99 - src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html - 115 + src/app/components/document-detail/document-detail.component.html + 174 - src/app/components/common/permissions-dialog/permissions-dialog.component.html - 25 + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 33 - src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + src/app/components/document-list/document-list.component.html + 245 - src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html - 81 + src/app/components/document-list/filter-editor/filter-editor.component.html + 61 - src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html - 20 + src/app/data/document.ts + 50 - src/app/components/manage/saved-views/saved-views.component.html - 73 + src/app/data/document.ts + 91 - - Use system language + + Storage path src/app/components/admin/settings/settings.component.ts - 78 + 100 - - - Use date format of display language - src/app/components/admin/settings/settings.component.ts - 81 + src/app/components/document-detail/document-detail.component.html + 178 - - - Error retrieving users - src/app/components/admin/settings/settings.component.ts - 226 + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 47 - src/app/components/admin/users-groups/users-groups.component.ts - 75 + src/app/components/document-list/document-list.component.html + 254 - - - Error retrieving groups - src/app/components/admin/settings/settings.component.ts - 245 + src/app/components/document-list/filter-editor/filter-editor.component.html + 72 - src/app/components/admin/users-groups/users-groups.component.ts - 89 + src/app/data/document.ts + 54 - - Settings were saved successfully. + + Tags src/app/components/admin/settings/settings.component.ts - 548 + 101 + + + src/app/components/app-frame/app-frame.component.html + 204 + + + src/app/components/common/input/tags/tags.component.ts + 80 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 94 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 5 + + + src/app/components/document-list/document-list.component.html + 218 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 39 + + + src/app/components/manage/document-attributes/document-attributes.component.ts + 89 + + + src/app/data/document.ts + 42 + + + + Error retrieving users + + src/app/components/admin/settings/settings.component.ts + 252 + + + src/app/components/admin/users-groups/users-groups.component.ts + 75 + + + + Error retrieving groups + + src/app/components/admin/settings/settings.component.ts + 271 + + + src/app/components/admin/users-groups/users-groups.component.ts + 89 + + + + Settings were saved successfully. + + src/app/components/admin/settings/settings.component.ts + 588 Settings were saved successfully. Reload is required to apply some changes. src/app/components/admin/settings/settings.component.ts - 552 + 592 Reload now src/app/components/admin/settings/settings.component.ts - 553 + 593 An error occurred while saving settings. src/app/components/admin/settings/settings.component.ts - 563 + 603 src/app/components/app-frame/app-frame.component.ts - 180 + 156 + + + src/app/components/app-frame/app-frame.component.ts + 230 + + + src/app/components/app-frame/app-frame.component.ts + 255 @@ -1605,11 +1801,11 @@ src/app/components/app-frame/app-frame.component.html - 278 + 296 src/app/components/app-frame/app-frame.component.html - 280 + 298 @@ -1624,23 +1820,7 @@ src/app/components/document-list/document-list.component.html - 153 - - - src/app/components/manage/management-list/management-list.component.html - 4 - - - src/app/components/manage/management-list/management-list.component.html - 4 - - - src/app/components/manage/management-list/management-list.component.html - 4 - - - src/app/components/manage/management-list/management-list.component.html - 4 + 147 @@ -1713,48 +1893,48 @@ 8 - src/app/components/manage/custom-fields/custom-fields.component.html - 17 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 5 - src/app/components/manage/mail/mail.component.html - 30 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 5 - src/app/components/manage/mail/mail.component.html - 111 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 5 - src/app/components/manage/management-list/management-list.component.html - 21 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 5 - src/app/components/manage/management-list/management-list.component.html - 21 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 5 - src/app/components/manage/management-list/management-list.component.html - 21 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 38 - src/app/components/manage/management-list/management-list.component.html - 21 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 38 - src/app/components/manage/management-list/management-list.component.html + src/app/components/manage/document-attributes/management-list/management-list.component.html 38 - src/app/components/manage/management-list/management-list.component.html + src/app/components/manage/document-attributes/management-list/management-list.component.html 38 - src/app/components/manage/management-list/management-list.component.html - 38 + src/app/components/manage/mail/mail.component.html + 30 - src/app/components/manage/management-list/management-list.component.html - 38 + src/app/components/manage/mail/mail.component.html + 111 src/app/components/manage/workflows/workflows.component.html @@ -1769,15 +1949,19 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.html - 8 + 7 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 94 + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 32 + src/app/components/document-list/document-list.component.html - 269 + 263 src/app/data/document.ts @@ -1824,45 +2008,49 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 67 + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 38 + src/app/components/document-detail/document-detail.component.html - 50 + 66 src/app/components/document-list/bulk-editor/bulk-editor.component.html - 87 + 86 - src/app/components/manage/custom-fields/custom-fields.component.html - 19 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 7 - src/app/components/manage/mail/mail.component.html - 33 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 44 - src/app/components/manage/mail/mail.component.html - 116 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 44 - src/app/components/manage/management-list/management-list.component.html + src/app/components/manage/document-attributes/management-list/management-list.component.html 44 - src/app/components/manage/management-list/management-list.component.html + src/app/components/manage/document-attributes/management-list/management-list.component.html 44 - src/app/components/manage/management-list/management-list.component.html - 44 + src/app/components/manage/mail/mail.component.html + 33 - src/app/components/manage/management-list/management-list.component.html - 44 + src/app/components/manage/mail/mail.component.html + 116 src/app/components/manage/saved-views/saved-views.component.html - 28 + 29 src/app/components/manage/workflows/workflows.component.html @@ -1876,64 +2064,79 @@ 97 + + Duplicate(s) detected + + src/app/components/admin/tasks/tasks.component.html + 103 + + Dismiss src/app/components/admin/tasks/tasks.component.html - 110 + 116 src/app/components/admin/tasks/tasks.component.ts 155 + + src/app/components/document-detail/document-detail.component.ts + 637 + + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 50 + Open Document src/app/components/admin/tasks/tasks.component.html - 115 + 121 {VAR_PLURAL, plural, =1 {One task} other { total tasks}} src/app/components/admin/tasks/tasks.component.html - 134 + 140  ( selected) src/app/components/admin/tasks/tasks.component.html - 136 + 142 Failed src/app/components/admin/tasks/tasks.component.html - 148,150 + 154,156 Complete src/app/components/admin/tasks/tasks.component.html - 156,158 + 162,164 Started src/app/components/admin/tasks/tasks.component.html - 164,166 + 170,172 Queued src/app/components/admin/tasks/tasks.component.html - 172,174 + 178,180 @@ -2021,11 +2224,11 @@ src/app/components/app-frame/app-frame.component.html - 238 + 256 src/app/components/app-frame/app-frame.component.html - 241 + 259 @@ -2149,87 +2352,75 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.html - 145 - - - src/app/components/manage/custom-fields/custom-fields.component.html - 43 - - - src/app/components/manage/custom-fields/custom-fields.component.html - 55 - - - src/app/components/manage/mail/mail.component.html - 67 + 164 - src/app/components/manage/mail/mail.component.html - 81 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 31 - src/app/components/manage/mail/mail.component.html - 155 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 49 - src/app/components/manage/mail/mail.component.html - 169 + src/app/components/manage/document-attributes/document-attributes.component.html + 48 - src/app/components/manage/management-list/management-list.component.html - 10 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 121 - src/app/components/manage/management-list/management-list.component.html - 10 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 121 - src/app/components/manage/management-list/management-list.component.html - 10 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 121 - src/app/components/manage/management-list/management-list.component.html - 10 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 121 - src/app/components/manage/management-list/management-list.component.html - 115 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 140 - src/app/components/manage/management-list/management-list.component.html - 115 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 140 - src/app/components/manage/management-list/management-list.component.html - 115 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 140 - src/app/components/manage/management-list/management-list.component.html - 115 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 140 - src/app/components/manage/management-list/management-list.component.html - 127 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 265 - src/app/components/manage/management-list/management-list.component.html - 127 + src/app/components/manage/mail/mail.component.html + 67 - src/app/components/manage/management-list/management-list.component.html - 127 + src/app/components/manage/mail/mail.component.html + 81 - src/app/components/manage/management-list/management-list.component.html - 127 + src/app/components/manage/mail/mail.component.html + 155 - src/app/components/manage/management-list/management-list.component.ts - 243 + src/app/components/manage/mail/mail.component.html + 169 src/app/components/manage/saved-views/saved-views.component.html - 30 + 37 src/app/components/manage/workflows/workflows.component.html @@ -2258,12 +2449,12 @@ 110 - src/app/components/manage/management-list/management-list.component.ts - 239 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 261 - src/app/components/manage/management-list/management-list.component.ts - 362 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 422 @@ -2292,20 +2483,20 @@ 198 - src/app/components/manage/custom-fields/custom-fields.component.ts + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts 104 - src/app/components/manage/mail/mail.component.ts - 192 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 424 src/app/components/manage/mail/mail.component.ts - 293 + 201 - src/app/components/manage/management-list/management-list.component.ts - 364 + src/app/components/manage/mail/mail.component.ts + 302 src/app/components/manage/workflows/workflows.component.ts @@ -2390,11 +2581,11 @@ src/app/components/app-frame/app-frame.component.html - 269 + 287 src/app/components/app-frame/app-frame.component.html - 271 + 289 @@ -2412,7 +2603,7 @@ src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 76 + 75 @@ -2471,60 +2662,60 @@ 53 - src/app/components/manage/custom-fields/custom-fields.component.html - 42 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 30 - src/app/components/manage/custom-fields/custom-fields.component.html - 52 + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 46 - src/app/components/manage/mail/mail.component.html - 65 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 120 - src/app/components/manage/mail/mail.component.html - 75 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 120 - src/app/components/manage/mail/mail.component.html - 153 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 120 - src/app/components/manage/mail/mail.component.html - 163 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 120 - src/app/components/manage/management-list/management-list.component.html - 114 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 137 - src/app/components/manage/management-list/management-list.component.html - 114 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 137 - src/app/components/manage/management-list/management-list.component.html - 114 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 137 - src/app/components/manage/management-list/management-list.component.html - 114 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 137 - src/app/components/manage/management-list/management-list.component.html - 124 + src/app/components/manage/mail/mail.component.html + 65 - src/app/components/manage/management-list/management-list.component.html - 124 + src/app/components/manage/mail/mail.component.html + 75 - src/app/components/manage/management-list/management-list.component.html - 124 + src/app/components/manage/mail/mail.component.html + 153 - src/app/components/manage/management-list/management-list.component.html - 124 + src/app/components/manage/mail/mail.component.html + 163 src/app/components/manage/workflows/workflows.component.html @@ -2557,7 +2748,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 @@ -2600,39 +2791,39 @@ src/app/components/document-detail/document-detail.component.ts - 1028 + 1379 src/app/components/document-detail/document-detail.component.ts - 1393 + 1759 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 798 + 833 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 831 + 871 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 850 + 894 - src/app/components/manage/custom-fields/custom-fields.component.ts + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts 106 - src/app/components/manage/mail/mail.component.ts - 194 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 426 src/app/components/manage/mail/mail.component.ts - 295 + 203 - src/app/components/manage/management-list/management-list.component.ts - 366 + src/app/components/manage/mail/mail.component.ts + 304 src/app/components/manage/workflows/workflows.component.ts @@ -2706,182 +2897,154 @@ Logged in as src/app/components/app-frame/app-frame.component.html - 43 + 46 My Profile src/app/components/app-frame/app-frame.component.html - 47 + 50 Logout src/app/components/app-frame/app-frame.component.html - 54 + 57 Documentation src/app/components/app-frame/app-frame.component.html - 59 + 62 src/app/components/app-frame/app-frame.component.html - 299 + 317 src/app/components/app-frame/app-frame.component.html - 302 + 320 Saved views src/app/components/app-frame/app-frame.component.html - 101 + 104 src/app/components/app-frame/app-frame.component.html - 106 + 134 Open documents src/app/components/app-frame/app-frame.component.html - 141 + 143 Close all src/app/components/app-frame/app-frame.component.html - 161 + 163 src/app/components/app-frame/app-frame.component.html - 163 + 165 Manage src/app/components/app-frame/app-frame.component.html - 172 + 174 - - Correspondents + + Attributes src/app/components/app-frame/app-frame.component.html - 178 + 181 src/app/components/app-frame/app-frame.component.html - 180 - - - src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 107 + 183 - - Tags - - src/app/components/app-frame/app-frame.component.html - 185 - + + Correspondents src/app/components/app-frame/app-frame.component.html - 188 - - - src/app/components/common/input/tags/tags.component.ts - 80 + 209 src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 94 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 5 - - - src/app/components/document-list/document-list.component.html - 224 - - - src/app/components/document-list/filter-editor/filter-editor.component.html - 39 + 107 - src/app/data/document.ts - 42 + src/app/components/manage/document-attributes/document-attributes.component.ts + 99 - - Document Types - - src/app/components/app-frame/app-frame.component.html - 194 - + + Document types src/app/components/app-frame/app-frame.component.html - 196 + 214 - src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 120 + src/app/components/manage/document-attributes/document-attributes.component.ts + 109 - - Storage Paths - - src/app/components/app-frame/app-frame.component.html - 201 - + + Storage paths src/app/components/app-frame/app-frame.component.html - 203 + 219 - src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 133 + src/app/components/manage/document-attributes/document-attributes.component.ts + 119 - - Custom Fields + + Custom fields src/app/components/app-frame/app-frame.component.html - 208 + 224 - src/app/components/app-frame/app-frame.component.html - 210 + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 61 - src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html - 4 + src/app/components/document-list/filter-editor/filter-editor.component.html + 84 - src/app/components/manage/custom-fields/custom-fields.component.html - 2 + src/app/components/document-list/filter-editor/filter-editor.component.ts + 203 + + + src/app/components/manage/document-attributes/document-attributes.component.ts + 129 Workflows src/app/components/app-frame/app-frame.component.html - 224 + 242 src/app/components/app-frame/app-frame.component.html - 226 + 244 src/app/components/manage/workflows/workflows.component.html @@ -2892,92 +3055,92 @@ Mail src/app/components/app-frame/app-frame.component.html - 231 + 249 src/app/components/app-frame/app-frame.component.html - 234 + 252 Administration src/app/components/app-frame/app-frame.component.html - 249 + 267 Configuration src/app/components/app-frame/app-frame.component.html - 262 + 280 src/app/components/app-frame/app-frame.component.html - 264 + 282 GitHub src/app/components/app-frame/app-frame.component.html - 309 + 327 is available. src/app/components/app-frame/app-frame.component.html - 318,319 + 336,337 Click to view. src/app/components/app-frame/app-frame.component.html - 319 + 337 Paperless-ngx can automatically check for updates src/app/components/app-frame/app-frame.component.html - 323 + 341 How does this work? src/app/components/app-frame/app-frame.component.html - 330,332 + 348,350 Update available src/app/components/app-frame/app-frame.component.html - 343 + 361 Sidebar views updated src/app/components/app-frame/app-frame.component.ts - 264 + 343 Error updating sidebar views src/app/components/app-frame/app-frame.component.ts - 267 + 346 An error occurred while saving update checking settings. src/app/components/app-frame/app-frame.component.ts - 288 + 367 @@ -2995,19 +3158,19 @@ Open src/app/components/app-frame/global-search/global-search.component.html - 53 + 52 src/app/components/app-frame/global-search/global-search.component.html - 56 + 54 src/app/components/app-frame/global-search/global-search.component.html - 59 + 56 src/app/components/app-frame/global-search/global-search.component.html - 76 + 70 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -3022,14 +3185,14 @@ Filter documents src/app/components/app-frame/global-search/global-search.component.html - 62 + 58 Download src/app/components/app-frame/global-search/global-search.component.html - 73 + 68 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -3037,11 +3200,11 @@ src/app/components/document-detail/document-detail.component.html - 34 + 44 src/app/components/document-list/bulk-editor/bulk-editor.component.html - 117 + 136 src/app/components/document-list/document-card-large/document-card-large.component.html @@ -3056,91 +3219,91 @@ No results src/app/components/app-frame/global-search/global-search.component.html - 87 + 81 Documents src/app/components/app-frame/global-search/global-search.component.html - 90 + 84 Saved Views src/app/components/app-frame/global-search/global-search.component.html - 96 + 90 Tags src/app/components/app-frame/global-search/global-search.component.html - 103 + 97 Correspondents src/app/components/app-frame/global-search/global-search.component.html - 110 + 104 Document types src/app/components/app-frame/global-search/global-search.component.html - 117 + 111 Storage paths src/app/components/app-frame/global-search/global-search.component.html - 124 + 118 Users src/app/components/app-frame/global-search/global-search.component.html - 131 + 125 Groups src/app/components/app-frame/global-search/global-search.component.html - 138 + 132 Custom fields src/app/components/app-frame/global-search/global-search.component.html - 145 + 139 Mail accounts src/app/components/app-frame/global-search/global-search.component.html - 152 + 146 Mail rules src/app/components/app-frame/global-search/global-search.component.html - 159 + 153 Workflows src/app/components/app-frame/global-search/global-search.component.html - 166 + 160 @@ -3179,6 +3342,20 @@ 20 + + Ask a question about this document... + + src/app/components/chat/chat/chat.component.ts + 37 + + + + Ask a question about a document... + + src/app/components/chat/chat/chat.component.ts + 38 + + Clear @@ -3201,46 +3378,46 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html - 26 + 32 src/app/components/document-detail/document-detail.component.ts - 981 + 1332 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 441 + 470 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 481 + 510 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 519 + 548 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 557 + 586 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 619 + 648 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 752 + 781 @@ -3250,89 +3427,164 @@ 9 + + {VAR_PLURAL, plural, =1 {One page} other { pages}} + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 25 + + Use metadata from: src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 22 + 34 Regenerate all metadata src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 24 + 36 Try to include archive version in merge for non-PDF files src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 32 + 44 Delete original documents after successful merge src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 36 + 48 Note that only PDFs will be included. src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 39 - - - - Note that only PDFs will be rotated. - - src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html - 25 + 51 - - View + + Replace current document - src/app/components/common/custom-field-display/custom-field-display.component.html + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.html 22 + + + Create new document - src/app/components/common/input/permissions/permissions-form/permissions-form.component.html - 34 + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.html + 35 + + + Copy metadata - src/app/components/common/permissions-select/permissions-select.component.html - 20 + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.html + 43,44 + + + Delete original - src/app/components/document-list/document-card-large/document-card-large.component.html - 75 + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.html + 48 - - Search fields + + Remove password protection - src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html - 10 + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.ts + 18 - - - Create new field - src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html - 21 + src/app/components/document-detail/document-detail.component.ts + 1812 - - Saved field "". + + Create an unprotected copy or replace the existing file. + + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.ts + 22 + + + src/app/components/document-detail/document-detail.component.ts + 1813 + + + + Start + + src/app/components/common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component.ts + 25 + + + src/app/components/document-detail/document-detail.component.ts + 1814 + + + + Note that only PDFs will be rotated. + + src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html + 25 + + + + View + + src/app/components/common/custom-field-display/custom-field-display.component.html + 22 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 34 + + + src/app/components/common/permissions-select/permissions-select.component.html + 20 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 75 + + + + Custom Fields + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 3 + + + + Search fields + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 9 + + + + Create new field + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 20 + + + + Saved field "". src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts 130 - src/app/components/manage/custom-fields/custom-fields.component.ts + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts 85 @@ -3343,7 +3595,7 @@ 139 - src/app/components/manage/custom-fields/custom-fields.component.ts + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts 94 @@ -3351,27 +3603,27 @@ Today src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 47 + 46 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 52 + 51 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 76 + 75 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 128 + 127 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 152 + 151 src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 113 src/app/components/common/input/date/date.component.html @@ -3382,31 +3634,35 @@ Close src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 48 + 47 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 53 + 52 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 77 + 76 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 129 + 128 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 153 + 152 src/app/components/common/input/date/date.component.html 22 + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 155 + src/app/components/document-detail/document-detail.component.html - 107 + 118 src/app/guards/dirty-saved-view.guard.ts @@ -3417,67 +3673,67 @@ True src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 55 + 54 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 95 + 94 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 101 + 100 False src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 56 + 55 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 96 + 95 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 102 + 101 Search docs... src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 70 + 69 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 118 + 117 Any src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 150 + 149 src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 17 + 16 All src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 152 + 151 src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 15 + 14 src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 16 + 15 src/app/components/common/permissions-select/permissions-select.component.html @@ -3489,79 +3745,72 @@ src/app/components/document-list/document-list.component.html - 30 + 29 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 37 Not src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 155 + 154 Add query src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 174 + 173 Add expression src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 177 + 176 Relative dates src/app/components/common/dates-dropdown/dates-dropdown.component.html - 25 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 101 - - - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 + 24 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 + 100 From src/app/components/common/dates-dropdown/dates-dropdown.component.html - 44 + 43 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 120 + 119 To src/app/components/common/dates-dropdown/dates-dropdown.component.html - 68 + 67 src/app/components/common/dates-dropdown/dates-dropdown.component.html - 144 + 143 Added src/app/components/common/dates-dropdown/dates-dropdown.component.html - 84 + 83 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts @@ -3569,7 +3818,7 @@ src/app/components/document-list/document-list.component.html - 278 + 272 src/app/data/document.ts @@ -3580,59 +3829,94 @@ 93 + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 168 + + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 107 Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 118 src/app/pipes/custom-date.pipe.ts 29 + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 123 + + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 137 + + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 143 + + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 157 + + Matching algorithm @@ -3930,18 +4214,11 @@ 113 - - Order - - src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 19 - - Enabled src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 22 + 19 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -3956,155 +4233,176 @@ 41 + + Order + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 24 + + + + Stop further processing + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + + + Stop processing further rules if this rule queues any document(s). + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + Paperless will only process mails that match all of the criteria specified below. src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 27 + 32 Folder src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 29 + 34 Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 29 + 34 Maximum age (days) src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 30 + 35 Filter from src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 33 + 38 Filter to src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 34 + 39 Filter subject src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 35 + 40 Filter body src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 36 + 41 Consumption scope src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 42 + 47 See docs for .eml processing requirements src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 42 + 47 Attachment type src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 43 + 48 PDF layout src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 44 + 49 Include only files matching src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 47 + 52 Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 47 + 52 src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 48 + 53 Exclude files matching src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 48 + 53 Action src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 54 + 59 Only performed if the mail is processed. src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 54 + 59 Action parameter src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 56 + 61 Assign title from src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 58 + 63 Assign owner from rule src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 59 + 64 Assign document type src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 63 + 68 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -4115,14 +4413,14 @@ Assign correspondent from src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 64 + 69 Assign correspondent src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 66 + 71 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -4133,7 +4431,7 @@ Error src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html - 73 + 78 src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html @@ -4155,6 +4453,10 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 264 + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 302 + src/app/components/common/toast/toast.component.html 30 @@ -4329,8 +4631,8 @@ 13 - src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts + 48 @@ -4348,7 +4650,7 @@ src/app/components/document-detail/document-detail.component.html - 309 + 356 @@ -4404,8 +4706,8 @@ 13 - src/app/components/manage/tag-list/tag-list.component.ts - 51 + src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts + 49 @@ -4459,11 +4761,11 @@ src/app/components/document-detail/document-detail.component.html - 92 + 103 src/app/components/document-list/bulk-editor/bulk-editor.component.html - 101 + 121 @@ -4535,7 +4837,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 @@ -4751,8 +5053,8 @@ 164 - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 @@ -5048,6 +5350,34 @@ 429 + + One password per line. The workflow will try them in order until one succeeds. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 436,438 + + + + Passwords + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 441 + + + + Passwords are stored in plain text. Use with caution. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 445 + + + + The document will be moved to the trash at the end of the workflow run. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 454 + + Consume Folder @@ -5143,88 +5473,131 @@ 140 + + Password removal + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 144 + + + + Move to trash + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 148 + + + src/app/components/document-detail/document-detail.component.ts + 1336 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 785 + + Has any of these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 203 + 217 Has all of these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 210 + 224 Does not have these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 217 + 231 + + + + Has any of these correspondents + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 238 Has correspondent src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 224 + 246 Does not have correspondents src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 232 + 254 Has document type src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 240 + 262 + + + + Has any of these document types + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 270 Does not have document types src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 248 + 278 Has storage path src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 256 + 286 + + + + Has any of these storage paths + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 294 Does not have storage paths src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 264 + 302 Matches custom field query src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 272 + 310 Create new workflow src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 474 + 539 Edit workflow src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts - 478 + 543 @@ -5305,62 +5678,50 @@ Include src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 25 + 24 Exclude src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 27 + 26 Create src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 58 + 56 src/app/components/common/share-links-dialog/share-links-dialog.component.html 65 - src/app/components/manage/management-list/management-list.component.html - 13 - - - src/app/components/manage/management-list/management-list.component.html - 13 - - - src/app/components/manage/management-list/management-list.component.html - 13 - - - src/app/components/manage/management-list/management-list.component.html - 13 + src/app/components/manage/document-attributes/document-attributes.component.html + 52 Apply src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 64 + 62 Click again to exclude items. src/app/components/common/filterable-dropdown/filterable-dropdown.component.html - 77 + 75 Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 99 Filter drop down element to filter for documents with no correspondent/type/tag assigned @@ -5368,7 +5729,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 823 @@ -5534,7 +5895,7 @@ Show password src/app/components/common/input/password/password.component.html - 6 + 12 @@ -5617,11 +5978,37 @@ 55 + + Suggestion: + + src/app/components/common/input/text/text.component.html + 20 + + + + Copied! + + src/app/components/common/page-header/page-header.component.html + 8 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 54 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 162 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 39 + + Read more src/app/components/common/page-header/page-header.component.html - 15 + 24 src/app/components/common/permissions-select/permissions-select.component.html @@ -5702,20 +6089,6 @@ 70 - - Create new document(s) - - src/app/components/common/pdf-editor/pdf-editor.component.html - 82 - - - - Update existing document - - src/app/components/common/pdf-editor/pdf-editor.component.html - 87 - - Copy metadata @@ -5748,56 +6121,56 @@ Edit permissions for src/app/components/common/permissions-dialog/permissions-dialog.component.ts - 46 + 49 Existing owner, user and group permissions will be merged with these settings. src/app/components/common/permissions-dialog/permissions-dialog.component.ts - 87 + 90 Any and all existing owner, user and group permissions will be replaced. src/app/components/common/permissions-dialog/permissions-dialog.component.ts - 88 + 91 My documents src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 26 + 25 Shared with me src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 36 + 35 Shared by me src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 46 + 45 Unowned src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 56 + 55 Hide unowned src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html - 86 + 85 @@ -5843,7 +6216,7 @@ Open preview src/app/components/common/preview-popup/preview-popup.component.ts - 52 + 54 @@ -5886,7 +6259,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -5894,7 +6267,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html - 284 + 321 src/app/components/manage/mail/mail.component.html @@ -5920,21 +6293,6 @@ 47 - - Copied! - - src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 54 - - - src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 - - - src/app/components/common/share-links-dialog/share-links-dialog.component.html - 39 - - Warning: changing the token cannot be undone @@ -5988,226 +6346,529 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 159 Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 - - - - No existing links - - src/app/components/common/share-links-dialog/share-links-dialog.component.html - 8,10 + 326 - - Share + + Selected documents: - src/app/components/common/share-links-dialog/share-links-dialog.component.html - 32 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 10 - - Share archive version + + + more… - src/app/components/common/share-links-dialog/share-links-dialog.component.html - 48 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 22 Expires + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 31 + + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 87 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 35 + src/app/components/common/share-links-dialog/share-links-dialog.component.html 52 - - 1 day + + Share archive version (if available) - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 25 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 47 + + + Share link bundle requested - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 102 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 54 - - 7 days + + You can copy the share link below or open the manager to monitor progress. The link will start working once the bundle is ready. - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 26 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 55,57 - - 30 days + + Status - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 27 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 60 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 33 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 58 + + + src/app/components/common/toast/toast.component.html + 28 + + + src/app/components/manage/mail/mail.component.html + 114 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 35 + + + src/app/components/manage/workflows/workflows.component.html + 19 + + + + Slug + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 64 + + + + Link + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 66 + + + + Copy link + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 81 Never - src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 28 + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 93 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 101 + + + src/app/data/share-link.ts + 17 + + + + File version + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 96 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 37 + + + + Size + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 99 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 34 + + + + A zip file containing the selected documents will be created for this share link bundle. This process happens in the background and may take some time, especially for large bundles. + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 109 + + + + Manage share link bundles + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html + 113 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 116 + + + + Create share link bundle + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.ts + 61 + + + + Create link + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.ts + 62 + + + + Share link copied to clipboard. + + src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.ts + 96 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 112 + + + + Loading share link bundles… + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 10 + + + + Status updates every few seconds while bundles are being prepared. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 21 + + + + No share link bundles currently exist. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 25 + + + + Built: + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 48 + + + + View error details + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 62 + + + + Copy share link + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 113 + + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 122 + + + + Retry + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 132 + + + + Delete share link bundle + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html + 141 + + + + Share link bundles + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 42 + + + + Failed to load share link bundles. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 66 + + + + Error retrieving share link bundles. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 68 + + + + Share link bundle deleted. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 121 + + + + Error deleting share link bundle. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 127 + + + + Share link bundle rebuild requested. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 139 + + + + Error requesting rebuild. + + src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts + 144 + + + + No existing links + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 8,10 + + + + Share + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 32 + + + + Share archive version + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 48 Share Links src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 32 + 31 src/app/components/document-detail/document-detail.component.html - 88 + 99 Error retrieving links src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 83 + 82 + + + + 1 day + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 101 + + + src/app/data/share-link.ts + 14 days src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 102 + 101 Error deleting link src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 131 + 130 Error creating link src/app/components/common/share-links-dialog/share-links-dialog.component.ts - 159 + 158 + + + + Suggest + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 8 + + + + Show suggestions + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 17 + + + + No novel suggestions + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 24 + + + + + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 30 + + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 36 + + + src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html + 42 @@ -6266,29 +6927,6 @@ 52 - - Status - - src/app/components/common/system-status-dialog/system-status-dialog.component.html - 58 - - - src/app/components/common/toast/toast.component.html - 28 - - - src/app/components/manage/mail/mail.component.html - 114 - - - src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html - 35 - - - src/app/components/manage/workflows/workflows.component.html - 19 - - Migration Status @@ -6366,8 +7004,12 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 245 - - + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 293 + + + Last Updated src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -6401,6 +7043,10 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 252 + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 300 + WebSocket Connection @@ -6416,6 +7062,13 @@ 261 + + AI Index + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 270 + + Copy Raw Error @@ -6477,7 +7130,7 @@ src/app/components/document-list/document-list.component.html - 323 + 317 @@ -6492,7 +7145,7 @@ src/app/components/document-list/document-list.component.html - 363 + 357 @@ -6507,7 +7160,7 @@ src/app/components/document-list/document-list.component.html - 370 + 364 @@ -6525,7 +7178,7 @@ src/app/components/document-list/document-list.component.html - 391 + 385 @@ -6536,7 +7189,7 @@ src/app/components/document-list/document-list.component.html - 391 + 385 @@ -6595,6 +7248,20 @@ 43 + + Document Types + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 120 + + + + Storage Paths + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 133 + + Other @@ -6653,7 +7320,7 @@ src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 386 + 415 this string is used to separate processing, failed and added on the file upload widget @@ -6707,7 +7374,11 @@ src/app/components/document-list/document-list.component.html - 27 + 26 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 34 @@ -6735,83 +7406,105 @@ Download original src/app/components/document-detail/document-detail.component.html - 41 + 51 + + + + Use formatted filename + + src/app/components/document-detail/document-detail.component.html + 57 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 155 Reprocess src/app/components/document-detail/document-detail.component.html - 54 + 70 src/app/components/document-list/bulk-editor/bulk-editor.component.html - 91 + 90 Print src/app/components/document-detail/document-detail.component.html - 58 + 74 More like this src/app/components/document-detail/document-detail.component.html - 62 + 78 src/app/components/document-list/document-card-large/document-card-large.component.html 69 - - PDF Editor + + Remove Password src/app/components/document-detail/document-detail.component.html - 66 - - - src/app/components/document-detail/document-detail.component.ts - 1392 + 87 Send src/app/components/document-detail/document-detail.component.html - 84 + 95 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 108 Previous src/app/components/document-detail/document-detail.component.html - 110 + 121 + + + + Next + + src/app/components/document-detail/document-detail.component.html + 124 + + + src/main.ts + 411 Details src/app/components/document-detail/document-detail.component.html - 123 + 160 Title src/app/components/document-detail/document-detail.component.html - 126 + 163 src/app/components/document-list/document-list.component.html - 221 + 215 src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -6822,120 +7515,36 @@ 90 - - Archive serial number - - src/app/components/document-detail/document-detail.component.html - 127 - - Date created src/app/components/document-detail/document-detail.component.html - 128 - - - - Correspondent - - src/app/components/document-detail/document-detail.component.html - 130 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 19 - - - src/app/components/document-list/document-list.component.html - 211 - - - src/app/components/document-list/filter-editor/filter-editor.component.html - 50 - - - src/app/data/document.ts - 46 - - - src/app/data/document.ts - 89 - - - - Document type - - src/app/components/document-detail/document-detail.component.html - 132 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 33 - - - src/app/components/document-list/document-list.component.html - 251 - - - src/app/components/document-list/filter-editor/filter-editor.component.html - 61 - - - src/app/data/document.ts - 50 - - - src/app/data/document.ts - 91 - - - - Storage path - - src/app/components/document-detail/document-detail.component.html - 134 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 47 - - - src/app/components/document-list/document-list.component.html - 260 - - - src/app/components/document-list/filter-editor/filter-editor.component.html - 72 - - - src/app/data/document.ts - 54 + 167 Default src/app/components/document-detail/document-detail.component.html - 135 + 179 src/app/components/manage/saved-views/saved-views.component.html - 52 + 60 Content src/app/components/document-detail/document-detail.component.html - 239 + 286 Metadata src/app/components/document-detail/document-detail.component.html - 248 + 295 src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts @@ -6946,175 +7555,228 @@ Date modified src/app/components/document-detail/document-detail.component.html - 255 + 302 Date added src/app/components/document-detail/document-detail.component.html - 259 + 306 Media filename src/app/components/document-detail/document-detail.component.html - 263 + 310 Original filename src/app/components/document-detail/document-detail.component.html - 267 + 314 Original MD5 checksum src/app/components/document-detail/document-detail.component.html - 271 + 318 Original file size src/app/components/document-detail/document-detail.component.html - 275 + 322 Original mime type src/app/components/document-detail/document-detail.component.html - 279 + 326 Archive MD5 checksum src/app/components/document-detail/document-detail.component.html - 284 + 331 Archive file size src/app/components/document-detail/document-detail.component.html - 290 + 337 Original document metadata src/app/components/document-detail/document-detail.component.html - 299 + 346 Archived document metadata src/app/components/document-detail/document-detail.component.html - 302 + 349 Notes src/app/components/document-detail/document-detail.component.html - 321,324 + 368,371 History src/app/components/document-detail/document-detail.component.html - 332 + 379 + + + + Duplicates + + src/app/components/document-detail/document-detail.component.html + 401,405 + + + + Duplicate documents detected: + + src/app/components/document-detail/document-detail.component.html + 407 + + + + In trash + + src/app/components/document-detail/document-detail.component.html + 418 Save & next src/app/components/document-detail/document-detail.component.html - 369 + 447 Save & close src/app/components/document-detail/document-detail.component.html - 372 + 450 + + + + Discard + + src/app/components/document-detail/document-detail.component.html + 452 Document loading... src/app/components/document-detail/document-detail.component.html - 382 + 460 Enter Password src/app/components/document-detail/document-detail.component.html - 436 + 512 + + + + Error retrieving metadata + + src/app/components/document-detail/document-detail.component.ts + 411 An error occurred loading content: src/app/components/document-detail/document-detail.component.ts - 416,418 + 512,514 + + + src/app/components/document-detail/document-detail.component.ts + 959,961 - - Document changes detected + + Document was updated src/app/components/document-detail/document-detail.component.ts - 450 + 632 - - The version of this document in your browser session appears older than the existing version. + + Document was updated at . src/app/components/document-detail/document-detail.component.ts - 451 + 633 - - Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + + Reload to discard your local unsaved edits and load the latest remote version. src/app/components/document-detail/document-detail.component.ts - 452 + 634 - - Ok + + Reload src/app/components/document-detail/document-detail.component.ts - 454 + 636 + + + + Document reloaded with latest changes. + + src/app/components/document-detail/document-detail.component.ts + 692 + + + + Document reloaded. + + src/app/components/document-detail/document-detail.component.ts + 703 Next document src/app/components/document-detail/document-detail.component.ts - 580 + 805 Previous document src/app/components/document-detail/document-detail.component.ts - 590 + 815 Close document src/app/components/document-detail/document-detail.component.ts - 598 + 823 src/app/services/open-documents.service.ts @@ -7125,190 +7787,323 @@ Save document src/app/components/document-detail/document-detail.component.ts - 605 + 830 Save and close / next src/app/components/document-detail/document-detail.component.ts - 614 + 839 - - Error retrieving metadata + + Error retrieving version content src/app/components/document-detail/document-detail.component.ts - 669 + 943 Error retrieving suggestions. src/app/components/document-detail/document-detail.component.ts - 698 + 1000 Document "" saved successfully. src/app/components/document-detail/document-detail.component.ts - 870 + 1212 src/app/components/document-detail/document-detail.component.ts - 894 + 1239 Error saving document "" src/app/components/document-detail/document-detail.component.ts - 900 + 1245 Error saving document src/app/components/document-detail/document-detail.component.ts - 950 + 1300 Do you really want to move the document "" to the trash? src/app/components/document-detail/document-detail.component.ts - 982 + 1333 Documents can be restored prior to permanent deletion. src/app/components/document-detail/document-detail.component.ts - 983 + 1334 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 754 + 783 - - Move to trash + + Error deleting document src/app/components/document-detail/document-detail.component.ts - 985 - - - src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 756 - - - - Error deleting document - - src/app/components/document-detail/document-detail.component.ts - 1004 + 1355 Reprocess confirm src/app/components/document-detail/document-detail.component.ts - 1024 + 1375 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 794 + 829 This operation will permanently recreate the archive file for this document. src/app/components/document-detail/document-detail.component.ts - 1025 + 1376 The archive file will be re-generated with the current settings. src/app/components/document-detail/document-detail.component.ts - 1026 + 1377 - - Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + Reprocess operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1036 + 1385 Error executing operation src/app/components/document-detail/document-detail.component.ts - 1047 + 1396 Error downloading document src/app/components/document-detail/document-detail.component.ts - 1096 + 1459 Page Fit src/app/components/document-detail/document-detail.component.ts - 1173 + 1539 PDF edit operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1411 + 1779 Error executing PDF edit operation src/app/components/document-detail/document-detail.component.ts - 1423 + 1791 + + + + Please enter the current password before attempting to remove it. + + src/app/components/document-detail/document-detail.component.ts + 1802 + + + + Password removal operation for "" will begin in the background. + + src/app/components/document-detail/document-detail.component.ts + 1836 + + + + Error executing password removal operation + + src/app/components/document-detail/document-detail.component.ts + 1850 Print failed. src/app/components/document-detail/document-detail.component.ts - 1460 + 1889 Error loading document for printing. src/app/components/document-detail/document-detail.component.ts - 1472 + 1901 An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts - 1537 + 1966 src/app/components/document-detail/document-detail.component.ts - 1541 + 1970 No entries found. - src/app/components/document-history/document-history.component.html + src/app/components/document-detail/document-history/document-history.component.html + 10 + + + + Versions + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 4 + + + + Label + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html 10 + + Optional + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 16 + + + + Add new version + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 31 + + + + Uploading version... + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 38 + + + + Processing version... + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 44 + + + + Version upload failed. + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 49 + + + + Version label + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 80 + + + + Version + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 91 + + + + Delete this version? + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 122 + + + + Delete version + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html + 127 + + + + Error deleting version + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 155 + + + + Error updating version label + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 188 + + + + Uploading new version. Processing will happen in the background. + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 210 + + + + Missing task ID. + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 223 + + + + Upload failed. + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 245 + + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 268 + + + + Error uploading new version + + src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts + 270 + + Edit: @@ -7360,21 +8155,6 @@ 73 - - Custom fields - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 61 - - - src/app/components/document-list/filter-editor/filter-editor.component.html - 84 - - - src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 - - Filter custom fields @@ -7393,67 +8173,67 @@ Rotate src/app/components/document-list/bulk-editor/bulk-editor.component.html - 94 + 93 Merge src/app/components/document-list/bulk-editor/bulk-editor.component.html - 97 + 96 + + + + Create a share link bundle + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 113 Include: src/app/components/document-list/bulk-editor/bulk-editor.component.html - 123 + 142 Archived files src/app/components/document-list/bulk-editor/bulk-editor.component.html - 127 + 146 Original files src/app/components/document-list/bulk-editor/bulk-editor.component.html - 131 - - - - Use formatted filename - - src/app/components/document-list/bulk-editor/bulk-editor.component.html - 136 + 150 Error executing bulk operation src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 290 + 321 "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 378 + 407 src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 384 + 413 "" and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 380 + 409 This is for messages like 'modify "tag1" and "tag2"' @@ -7461,7 +8241,7 @@ and "" src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 388,390 + 417,419 this is for messages like 'modify "tag1", "tag2" and "tag3"' @@ -7469,14 +8249,14 @@ Confirm tags assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 405 + 434 This operation will add the tag "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 411 + 440 @@ -7485,14 +8265,14 @@ )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 416,418 + 445,447 This operation will remove the tag "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 424 + 453 @@ -7501,7 +8281,7 @@ )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 429,431 + 458,460 @@ -7512,84 +8292,84 @@ )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 433,437 + 462,466 Confirm correspondent assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 474 + 503 This operation will assign the correspondent "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 476 + 505 This operation will remove the correspondent from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 478 + 507 Confirm document type assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 512 + 541 This operation will assign the document type "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 514 + 543 This operation will remove the document type from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 516 + 545 Confirm storage path assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 550 + 579 This operation will assign the storage path "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 552 + 581 This operation will remove the storage path from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 554 + 583 Confirm custom field assignment src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 583 + 612 This operation will assign the custom field "" to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 589 + 618 @@ -7598,14 +8378,14 @@ )"/> to selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 594,596 + 623,625 This operation will remove the custom field "" from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 602 + 631 @@ -7614,7 +8394,7 @@ )"/> from selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 607,609 + 636,638 @@ -7625,77 +8405,91 @@ )"/> on selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 611,615 + 640,644 Move selected document(s) to the trash? src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 753 + 782 This operation will permanently recreate the archive files for selected document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 795 + 830 The archive files will be re-generated with the current settings. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 796 + 831 Rotate confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 828 + 868 - - This operation will permanently rotate the original version of document(s). + + This operation will add rotated versions of the document(s). src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 829 + 869 Merge confirm src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 848 + 892 This operation will merge selected documents into a new document. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 849 + 893 Merged document will be queued for consumption. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 868 + 916 Custom fields updated. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 892 + 940 Error updating custom fields. src/app/components/document-list/bulk-editor/bulk-editor.component.ts - 901 + 949 + + + + Share link bundle creation requested. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 989 + + + + Share link bundle creation is not available yet. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 996 @@ -7728,7 +8522,7 @@ src/app/components/document-list/document-list.component.html - 339 + 333 @@ -7852,7 +8646,11 @@ Select src/app/components/document-list/document-list.component.html - 5 + 4 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 11 src/app/data/custom-field.ts @@ -7863,47 +8661,67 @@ Select none src/app/components/document-list/document-list.component.html - 11 + 10 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 17 Select page src/app/components/document-list/document-list.component.html - 12 + 11 src/app/components/document-list/document-list.component.ts - 315 + 345 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 18 Select all src/app/components/document-list/document-list.component.html - 13 + 12 src/app/components/document-list/document-list.component.ts - 308 + 338 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 19 Select: src/app/components/document-list/document-list.component.html - 18 + 17 + + + src/app/components/manage/document-attributes/document-attributes.component.html + 25 None src/app/components/document-list/document-list.component.html - 23 + 22 - src/app/components/manage/management-list/management-list.component.ts - 120 + src/app/components/manage/document-attributes/document-attributes.component.html + 30 + + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 132 src/app/data/matching-model.ts @@ -7914,63 +8732,63 @@ Sort src/app/components/document-list/document-list.component.html - 68 + 65 Views src/app/components/document-list/document-list.component.html - 94 + 90 Save "" src/app/components/document-list/document-list.component.html - 113 + 108 Save as... src/app/components/document-list/document-list.component.html - 116 + 110 All saved views src/app/components/document-list/document-list.component.html - 117 + 111 {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} src/app/components/document-list/document-list.component.html - 137 + 131 {VAR_PLURAL, plural, =1 {One document} other { documents}} src/app/components/document-list/document-list.component.html - 141 + 135 (filtered) src/app/components/document-list/document-list.component.html - 143 + 137 Reset filters src/app/components/document-list/document-list.component.html - 148 + 142 src/app/components/document-list/filter-editor/filter-editor.component.html @@ -7981,25 +8799,25 @@ Error while loading documents src/app/components/document-list/document-list.component.html - 169 + 163 Sort by ASN src/app/components/document-list/document-list.component.html - 198 + 192 ASN src/app/components/document-list/document-list.component.html - 202 + 196 src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -8014,28 +8832,28 @@ Sort by correspondent src/app/components/document-list/document-list.component.html - 207 + 201 Sort by title src/app/components/document-list/document-list.component.html - 216 + 210 Sort by owner src/app/components/document-list/document-list.component.html - 229 + 223 Owner src/app/components/document-list/document-list.component.html - 233 + 227 src/app/data/document.ts @@ -8050,49 +8868,49 @@ Sort by notes src/app/components/document-list/document-list.component.html - 238 + 232 Sort by document type src/app/components/document-list/document-list.component.html - 247 + 241 Sort by storage path src/app/components/document-list/document-list.component.html - 256 + 250 Sort by created date src/app/components/document-list/document-list.component.html - 265 + 259 Sort by added date src/app/components/document-list/document-list.component.html - 274 + 268 Sort by number of pages src/app/components/document-list/document-list.component.html - 283 + 277 Pages src/app/components/document-list/document-list.component.html - 287 + 281 src/app/data/document.ts @@ -8104,84 +8922,91 @@ src/app/data/paperless-config.ts - 91 + 104 Shared src/app/components/document-list/document-list.component.html - 290,292 + 284,286 Sort by src/app/components/document-list/document-list.component.html - 297,298 + 291,292 Edit document src/app/components/document-list/document-list.component.html - 331 + 325 Preview document src/app/components/document-list/document-list.component.html - 332 + 326 Reset filters / selection src/app/components/document-list/document-list.component.ts - 296 + 326 Open first [selected] document src/app/components/document-list/document-list.component.ts - 324 + 354 Previous page src/app/components/document-list/document-list.component.ts - 340 + 370 Next page src/app/components/document-list/document-list.component.ts - 352 + 382 View "" saved successfully. src/app/components/document-list/document-list.component.ts - 385 + 416 Failed to save view "". src/app/components/document-list/document-list.component.ts - 391 + 422 View "" created successfully. src/app/components/document-list/document-list.component.ts - 437 + 488 + + + + View "" created successfully, but could not update visibility settings. + + src/app/components/document-list/document-list.component.ts + 494 @@ -8195,56 +9020,56 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 @@ -8253,14 +9078,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 @@ -8269,14 +9094,14 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 @@ -8285,70 +9110,70 @@ )?.name"/> src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 @@ -8384,14 +9209,14 @@ Filter rules error occurred while saving this view src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html - 13 + 14 The error returned was src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html - 14 + 15 @@ -8465,132 +9290,391 @@ 142 + + Data Type + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 6 + + + + Filter Documents () + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 38 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 129 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 129 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 129 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 129 + + + + No fields defined. + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.html + 68 + + + + Confirm delete field + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts + 102 + + + + This operation will permanently delete this field. + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts + 103 + + + + Deleted field "" + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts + 112 + + + + Error deleting field "". + + src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts + 121 + + + + Manage tags, correspondents, document types, storage paths, and custom fields. + + src/app/components/manage/document-attributes/document-attributes.component.html + 3 + + + + Add Field + + src/app/components/manage/document-attributes/document-attributes.component.html + 57 + + correspondent - src/app/components/manage/correspondent-list/correspondent-list.component.ts - 47 + src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts + 46 correspondents - src/app/components/manage/correspondent-list/correspondent-list.component.ts - 48 + src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts + 47 Last used - src/app/components/manage/correspondent-list/correspondent-list.component.ts - 53 + src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts + 52 Do you really want to delete the correspondent ""? - src/app/components/manage/correspondent-list/correspondent-list.component.ts - 78 + src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts + 77 + + + + document type + + src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts + 42 + + + + document types + + src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts + 43 + + + + Do you really want to delete the document type ""? + + src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts + 48 - - Customize the data fields that can be attached to documents. + + Filter by: + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 4 + - src/app/components/manage/custom-fields/custom-fields.component.html + src/app/components/manage/document-attributes/management-list/management-list.component.html + 4 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 4 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html 4 - - Add Field + + Show: - src/app/components/manage/custom-fields/custom-fields.component.html - 9 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 12 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 12 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 12 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 12 - - Data Type + + per page - src/app/components/manage/custom-fields/custom-fields.component.html - 18 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 20 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 20 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 20 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 20 - - Filter Documents () + + Matching - src/app/components/manage/custom-fields/custom-fields.component.html - 45 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 39 - src/app/components/manage/management-list/management-list.component.html - 117 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 39 - src/app/components/manage/management-list/management-list.component.html - 117 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 39 - src/app/components/manage/management-list/management-list.component.html - 117 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 39 + + + Document count - src/app/components/manage/management-list/management-list.component.html - 117 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 40 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 40 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 40 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 40 - - No fields defined. + + {VAR_PLURAL, plural, =1 {One } other { total }} - src/app/components/manage/custom-fields/custom-fields.component.html - 70 + src/app/components/manage/document-attributes/management-list/management-list.component.html + 67 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 67 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 67 + + + src/app/components/manage/document-attributes/management-list/management-list.component.html + 67 - - Confirm delete field + + Automatic - src/app/components/manage/custom-fields/custom-fields.component.ts - 102 + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 130 + + + src/app/data/matching-model.ts + 15 - - This operation will permanently delete this field. + + Successfully created . + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 218 + + + + Error occurred while creating . + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 223 + + + + Successfully updated "". + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 238 + + + + Error occurred while saving . + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 243 + + + + Associated documents will not be deleted. + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 263 + + + + Error while deleting element + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 279 + + + + Error saving settings + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 318 + + + + Permissions updated successfully + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 402 + + + + Error updating permissions + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 409 + + + src/app/components/manage/mail/mail.component.ts + 351 + + + src/app/components/manage/saved-views/saved-views.component.ts + 274 + + + + This operation will permanently delete the selected . + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 423 + + + + Objects deleted successfully + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 437 + + + + Error deleting objects + + src/app/components/manage/document-attributes/management-list/management-list.component.ts + 443 + + + + storage path - src/app/components/manage/custom-fields/custom-fields.component.ts - 103 + src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts + 42 - - Deleted field "" + + storage paths - src/app/components/manage/custom-fields/custom-fields.component.ts - 112 + src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts + 43 - - Error deleting field "". + + Do you really want to delete the storage path ""? - src/app/components/manage/custom-fields/custom-fields.component.ts - 121 + src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts + 59 - - document type + + tag - src/app/components/manage/document-type-list/document-type-list.component.ts + src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts 43 - - document types + + tags - src/app/components/manage/document-type-list/document-type-list.component.ts + src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts 44 - - Do you really want to delete the document type ""? + + Do you really want to delete the tag ""? - src/app/components/manage/document-type-list/document-type-list.component.ts - 49 + src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts + 60 @@ -8703,165 +9787,158 @@ Error retrieving mail accounts src/app/components/manage/mail/mail.component.ts - 105 + 114 Error retrieving mail rules src/app/components/manage/mail/mail.component.ts - 127 + 136 OAuth2 authentication success src/app/components/manage/mail/mail.component.ts - 135 + 144 OAuth2 authentication failed, see logs for details src/app/components/manage/mail/mail.component.ts - 146 + 155 Saved account "". src/app/components/manage/mail/mail.component.ts - 170 + 179 Error saving account. src/app/components/manage/mail/mail.component.ts - 182 + 191 Confirm delete mail account src/app/components/manage/mail/mail.component.ts - 190 + 199 This operation will permanently delete this mail account. src/app/components/manage/mail/mail.component.ts - 191 + 200 Deleted mail account "" src/app/components/manage/mail/mail.component.ts - 201 + 210 Error deleting mail account "". src/app/components/manage/mail/mail.component.ts - 212 + 221 Processing mail account "" src/app/components/manage/mail/mail.component.ts - 224 + 233 Error processing mail account "" src/app/components/manage/mail/mail.component.ts - 229 + 238 Saved rule "". src/app/components/manage/mail/mail.component.ts - 247 + 256 Error saving rule. src/app/components/manage/mail/mail.component.ts - 258 + 267 Rule "" enabled. src/app/components/manage/mail/mail.component.ts - 274 + 283 Rule "" disabled. src/app/components/manage/mail/mail.component.ts - 275 + 284 Error toggling rule "". src/app/components/manage/mail/mail.component.ts - 280 + 289 Confirm delete mail rule src/app/components/manage/mail/mail.component.ts - 291 + 300 This operation will permanently delete this mail rule. src/app/components/manage/mail/mail.component.ts - 292 + 301 Deleted mail rule "" src/app/components/manage/mail/mail.component.ts - 302 + 311 Error deleting mail rule "". src/app/components/manage/mail/mail.component.ts - 313 + 322 Permissions updated src/app/components/manage/mail/mail.component.ts - 337 - - - - Error updating permissions - - src/app/components/manage/mail/mail.component.ts - 342 + 346 - src/app/components/manage/management-list/management-list.component.ts - 349 + src/app/components/manage/saved-views/saved-views.component.ts + 268 @@ -8899,163 +9976,6 @@ 72 - - Filter by: - - src/app/components/manage/management-list/management-list.component.html - 20 - - - src/app/components/manage/management-list/management-list.component.html - 20 - - - src/app/components/manage/management-list/management-list.component.html - 20 - - - src/app/components/manage/management-list/management-list.component.html - 20 - - - - Matching - - src/app/components/manage/management-list/management-list.component.html - 39 - - - src/app/components/manage/management-list/management-list.component.html - 39 - - - src/app/components/manage/management-list/management-list.component.html - 39 - - - src/app/components/manage/management-list/management-list.component.html - 39 - - - - Document count - - src/app/components/manage/management-list/management-list.component.html - 40 - - - src/app/components/manage/management-list/management-list.component.html - 40 - - - src/app/components/manage/management-list/management-list.component.html - 40 - - - src/app/components/manage/management-list/management-list.component.html - 40 - - - - {VAR_PLURAL, plural, =1 {One } other { total }} - - src/app/components/manage/management-list/management-list.component.html - 67 - - - src/app/components/manage/management-list/management-list.component.html - 67 - - - src/app/components/manage/management-list/management-list.component.html - 67 - - - src/app/components/manage/management-list/management-list.component.html - 67 - - - - Automatic - - src/app/components/manage/management-list/management-list.component.ts - 118 - - - src/app/data/matching-model.ts - 15 - - - - Successfully created . - - src/app/components/manage/management-list/management-list.component.ts - 196 - - - - Error occurred while creating . - - src/app/components/manage/management-list/management-list.component.ts - 201 - - - - Successfully updated "". - - src/app/components/manage/management-list/management-list.component.ts - 216 - - - - Error occurred while saving . - - src/app/components/manage/management-list/management-list.component.ts - 221 - - - - Associated documents will not be deleted. - - src/app/components/manage/management-list/management-list.component.ts - 241 - - - - Error while deleting element - - src/app/components/manage/management-list/management-list.component.ts - 257 - - - - Permissions updated successfully - - src/app/components/manage/management-list/management-list.component.ts - 342 - - - - This operation will permanently delete all objects. - - src/app/components/manage/management-list/management-list.component.ts - 363 - - - - Objects deleted successfully - - src/app/components/manage/management-list/management-list.component.ts - 377 - - - - Error deleting objects - - src/app/components/manage/management-list/management-list.component.ts - 383 - - Customize the views of your documents. @@ -9063,109 +9983,88 @@ 4 + + Permissions + + src/app/components/manage/saved-views/saved-views.component.html + 35 + + Documents page size src/app/components/manage/saved-views/saved-views.component.html - 41 + 49 Display as src/app/components/manage/saved-views/saved-views.component.html - 44 + 52 Table src/app/components/manage/saved-views/saved-views.component.html - 46 + 54 Small Cards src/app/components/manage/saved-views/saved-views.component.html - 47 + 55 Large Cards src/app/components/manage/saved-views/saved-views.component.html - 48 + 56 - - No saved views defined. + + Note: ordering is not preserved src/app/components/manage/saved-views/saved-views.component.html - 61 - - - - Saved view "" deleted. - - src/app/components/manage/saved-views/saved-views.component.ts - 133 - - - - Views saved successfully. - - src/app/components/manage/saved-views/saved-views.component.ts - 158 - - - - Error while saving views. - - src/app/components/manage/saved-views/saved-views.component.ts - 163 - - - - storage path - - src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 62 - - storage paths + + No saved views defined. - src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + src/app/components/manage/saved-views/saved-views.component.html + 70 - - Do you really want to delete the storage path ""? + + Saved view "" deleted. - src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + src/app/components/manage/saved-views/saved-views.component.ts + 153 - - tag + + Views saved successfully. - src/app/components/manage/tag-list/tag-list.component.ts - 45 + src/app/components/manage/saved-views/saved-views.component.ts + 230 - - tags + + Error while saving views. - src/app/components/manage/tag-list/tag-list.component.ts - 46 + src/app/components/manage/saved-views/saved-views.component.ts + 235 - - Do you really want to delete the tag ""? + + Note: Sharing saved views does not share the underlying documents. - src/app/components/manage/tag-list/tag-list.component.ts - 61 + src/app/components/manage/saved-views/saved-views.component.ts + 257 @@ -9502,196 +10401,322 @@ General Settings src/app/data/paperless-config.ts - 50 + 51 OCR Settings src/app/data/paperless-config.ts - 51 + 52 Barcode Settings src/app/data/paperless-config.ts - 52 + 53 + + + + AI Settings + + src/app/data/paperless-config.ts + 54 Output Type src/app/data/paperless-config.ts - 76 + 89 Language src/app/data/paperless-config.ts - 84 + 97 Mode src/app/data/paperless-config.ts - 98 + 111 Skip Archive File src/app/data/paperless-config.ts - 106 + 119 Image DPI src/app/data/paperless-config.ts - 114 + 127 Clean src/app/data/paperless-config.ts - 121 + 134 Deskew src/app/data/paperless-config.ts - 129 + 142 Rotate Pages src/app/data/paperless-config.ts - 136 + 149 Rotate Pages Threshold src/app/data/paperless-config.ts - 143 + 156 Max Image Pixels src/app/data/paperless-config.ts - 150 + 163 Color Conversion Strategy src/app/data/paperless-config.ts - 157 + 170 OCR Arguments src/app/data/paperless-config.ts - 165 + 178 Application Logo src/app/data/paperless-config.ts - 172 + 185 Application Title src/app/data/paperless-config.ts - 179 + 192 Enable Barcodes src/app/data/paperless-config.ts - 186 + 199 Enable TIFF Support src/app/data/paperless-config.ts - 193 + 206 Barcode String src/app/data/paperless-config.ts - 200 + 213 Retain Split Pages src/app/data/paperless-config.ts - 207 + 220 Enable ASN src/app/data/paperless-config.ts - 214 + 227 ASN Prefix src/app/data/paperless-config.ts - 221 + 234 Upscale src/app/data/paperless-config.ts - 228 + 241 DPI src/app/data/paperless-config.ts - 235 + 248 Max Pages src/app/data/paperless-config.ts - 242 + 255 Enable Tag Detection src/app/data/paperless-config.ts - 249 + 262 Tag Mapping src/app/data/paperless-config.ts - 256 + 269 + + + + Split on Tag Barcodes + + src/app/data/paperless-config.ts + 276 + + + + AI Enabled + + src/app/data/paperless-config.ts + 283 + + + + Consider privacy implications when enabling AI features, especially if using a remote model. + + src/app/data/paperless-config.ts + 287 + + + + LLM Embedding Backend + + src/app/data/paperless-config.ts + 291 + + + + LLM Embedding Model + + src/app/data/paperless-config.ts + 299 + + + + LLM Backend + + src/app/data/paperless-config.ts + 306 + + + + LLM Model + + src/app/data/paperless-config.ts + 314 + + + + LLM API Key + + src/app/data/paperless-config.ts + 321 + + + + LLM Endpoint + + src/app/data/paperless-config.ts + 328 + + + + Pending + + src/app/data/share-link-bundle.ts + 41 + + + + Processing + + src/app/data/share-link-bundle.ts + 42 + + + + Ready + + src/app/data/share-link-bundle.ts + 43 + + + + Failed + + src/app/data/share-link-bundle.ts + 44 + + + + Archive + + src/app/data/share-link-bundle.ts + 51 + + + + Original + + src/app/data/share-link-bundle.ts + 52 + + + + 7 days + + src/app/data/share-link.ts + 15 + + + + 30 days + + src/app/data/share-link.ts + 16 @@ -9770,7 +10795,7 @@ You don't have permissions to do that src/app/guards/permissions.guard.ts - 34 + 42 @@ -9997,179 +11022,186 @@ 135 + + Indonesian + + src/app/services/settings.service.ts + 141 + + Italian src/app/services/settings.service.ts - 141 + 147 Japanese src/app/services/settings.service.ts - 147 + 153 Korean src/app/services/settings.service.ts - 153 + 159 Luxembourgish src/app/services/settings.service.ts - 159 + 165 Dutch src/app/services/settings.service.ts - 165 + 171 Norwegian src/app/services/settings.service.ts - 171 + 177 Persian src/app/services/settings.service.ts - 177 + 183 Polish src/app/services/settings.service.ts - 183 + 189 Portuguese (Brazil) src/app/services/settings.service.ts - 189 + 195 Portuguese src/app/services/settings.service.ts - 195 + 201 Romanian src/app/services/settings.service.ts - 201 + 207 Russian src/app/services/settings.service.ts - 207 + 213 Slovak src/app/services/settings.service.ts - 213 + 219 Slovenian src/app/services/settings.service.ts - 219 + 225 Serbian src/app/services/settings.service.ts - 225 + 231 Swedish src/app/services/settings.service.ts - 231 + 237 Turkish src/app/services/settings.service.ts - 237 + 243 Ukrainian src/app/services/settings.service.ts - 243 + 249 Vietnamese src/app/services/settings.service.ts - 249 + 255 Chinese Simplified src/app/services/settings.service.ts - 255 + 261 Chinese Traditional src/app/services/settings.service.ts - 261 + 267 ISO 8601 src/app/services/settings.service.ts - 269 + 275 Successfully completed one-time migratration of settings to the database! src/app/services/settings.service.ts - 603 + 609 Unable to migrate settings to the database, please try saving manually. src/app/services/settings.service.ts - 604 + 610 You can restart the tour from the settings page. src/app/services/settings.service.ts - 677 + 683 @@ -10204,42 +11236,42 @@ Document already exists. src/app/services/websocket-status.service.ts - 24 + 26 Document already exists. Note: existing document is in the trash. src/app/services/websocket-status.service.ts - 25 + 27 Document with ASN already exists. src/app/services/websocket-status.service.ts - 26 + 28 Document with ASN already exists. Note: existing document is in the trash. src/app/services/websocket-status.service.ts - 27 + 29 File not found. src/app/services/websocket-status.service.ts - 28 + 30 Pre-consume script does not exist. src/app/services/websocket-status.service.ts - 29 + 31 Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation @@ -10247,7 +11279,7 @@ Error while executing pre-consume script. src/app/services/websocket-status.service.ts - 30 + 32 Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation @@ -10255,7 +11287,7 @@ Post-consume script does not exist. src/app/services/websocket-status.service.ts - 31 + 33 Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation @@ -10263,7 +11295,7 @@ Error while executing post-consume script. src/app/services/websocket-status.service.ts - 32 + 34 Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation @@ -10271,49 +11303,63 @@ Received new file. src/app/services/websocket-status.service.ts - 33 + 35 File type not supported. src/app/services/websocket-status.service.ts - 34 + 36 Processing document... src/app/services/websocket-status.service.ts - 35 + 37 Generating thumbnail... src/app/services/websocket-status.service.ts - 36 + 38 Retrieving date from document... src/app/services/websocket-status.service.ts - 37 + 39 Saving document... src/app/services/websocket-status.service.ts - 38 + 40 Finished. src/app/services/websocket-status.service.ts - 39 + 41 + + + + Prev + + src/main.ts + 410 + + + + End + + src/main.ts + 412 diff --git a/src-ui/package.json b/src-ui/package.json index 2589a048c8..95602b9343 100644 --- a/src-ui/package.json +++ b/src-ui/package.json @@ -1,6 +1,6 @@ { "name": "paperless-ngx-ui", - "version": "2.19.3", + "version": "2.20.11", "scripts": { "preinstall": "npx only-allow pnpm", "ng": "ng", @@ -11,64 +11,64 @@ }, "private": true, "dependencies": { - "@angular/cdk": "^20.2.6", - "@angular/common": "~20.3.2", - "@angular/compiler": "~20.3.2", - "@angular/core": "~20.3.2", - "@angular/forms": "~20.3.2", - "@angular/localize": "~20.3.2", - "@angular/platform-browser": "~20.3.2", - "@angular/platform-browser-dynamic": "~20.3.2", - "@angular/router": "~20.3.2", - "@ng-bootstrap/ng-bootstrap": "^19.0.1", - "@ng-select/ng-select": "^20.6.3", + "@angular/cdk": "^21.2.2", + "@angular/common": "~21.2.4", + "@angular/compiler": "~21.2.4", + "@angular/core": "~21.2.4", + "@angular/forms": "~21.2.4", + "@angular/localize": "~21.2.4", + "@angular/platform-browser": "~21.2.4", + "@angular/platform-browser-dynamic": "~21.2.4", + "@angular/router": "~21.2.4", + "@ng-bootstrap/ng-bootstrap": "^20.0.0", + "@ng-select/ng-select": "^21.5.2", "@ngneat/dirty-check-forms": "^3.0.3", "@popperjs/core": "^2.11.8", "bootstrap": "^5.3.8", "file-saver": "^2.0.5", "mime-names": "^1.0.0", - "ng2-pdf-viewer": "^10.4.0", "ngx-bootstrap-icons": "^1.9.3", "ngx-color": "^10.1.0", - "ngx-cookie-service": "^20.1.0", - "ngx-device-detector": "^10.1.0", - "ngx-ui-tour-ng-bootstrap": "^17.0.1", + "ngx-cookie-service": "^21.1.0", + "ngx-device-detector": "^11.0.0", + "ngx-ui-tour-ng-bootstrap": "^18.0.0", + "pdfjs-dist": "^5.4.624", "rxjs": "^7.8.2", "tslib": "^2.8.1", "utif": "^3.1.0", "uuid": "^13.0.0", - "zone.js": "^0.15.1" + "zone.js": "^0.16.1" }, "devDependencies": { - "@angular-builders/custom-webpack": "^20.0.0", - "@angular-builders/jest": "^20.0.0", - "@angular-devkit/core": "^20.3.3", - "@angular-devkit/schematics": "^20.3.3", - "@angular-eslint/builder": "20.3.0", - "@angular-eslint/eslint-plugin": "20.3.0", - "@angular-eslint/eslint-plugin-template": "20.3.0", - "@angular-eslint/schematics": "20.3.0", - "@angular-eslint/template-parser": "20.3.0", - "@angular/build": "^20.3.3", - "@angular/cli": "~20.3.3", - "@angular/compiler-cli": "~20.3.2", + "@angular-builders/custom-webpack": "^21.0.3", + "@angular-builders/jest": "^21.0.3", + "@angular-devkit/core": "^21.2.2", + "@angular-devkit/schematics": "^21.2.2", + "@angular-eslint/builder": "21.3.0", + "@angular-eslint/eslint-plugin": "21.3.0", + "@angular-eslint/eslint-plugin-template": "21.3.0", + "@angular-eslint/schematics": "21.3.0", + "@angular-eslint/template-parser": "21.3.0", + "@angular/build": "^21.2.2", + "@angular/cli": "~21.2.2", + "@angular/compiler-cli": "~21.2.4", "@codecov/webpack-plugin": "^1.9.1", - "@playwright/test": "^1.55.1", + "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", - "@types/node": "^24.6.1", - "@typescript-eslint/eslint-plugin": "^8.45.0", - "@typescript-eslint/parser": "^8.45.0", - "@typescript-eslint/utils": "^8.45.0", - "eslint": "^9.36.0", - "jest": "30.2.0", - "jest-environment-jsdom": "^30.2.0", + "@types/node": "^25.4.0", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "@typescript-eslint/utils": "^8.57.0", + "eslint": "^10.0.3", + "jest": "30.3.0", + "jest-environment-jsdom": "^30.3.0", "jest-junit": "^16.0.0", - "jest-preset-angular": "^15.0.2", + "jest-preset-angular": "^16.1.1", "jest-websocket-mock": "^2.5.0", "prettier-plugin-organize-imports": "^4.3.0", "ts-node": "~10.9.1", - "typescript": "^5.8.3", - "webpack": "^5.102.0" + "typescript": "^5.9.3", + "webpack": "^5.105.3" }, "packageManager": "pnpm@10.17.1", "pnpm": { diff --git a/src-ui/pnpm-lock.yaml b/src-ui/pnpm-lock.yaml index 13a84f1c2f..4cf6e9b36f 100644 --- a/src-ui/pnpm-lock.yaml +++ b/src-ui/pnpm-lock.yaml @@ -9,41 +9,41 @@ importers: .: dependencies: '@angular/cdk': - specifier: ^20.2.6 - version: 20.2.6(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + specifier: ^21.2.2 + version: 21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': - specifier: ~20.3.2 - version: 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: ~20.3.2 - version: 20.3.2 + specifier: ~21.2.4 + version: 21.2.4 '@angular/core': - specifier: ~20.3.2 - version: 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: ~20.3.2 - version: 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': - specifier: ~20.3.2 - version: 20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@angular/platform-browser': - specifier: ~20.3.2 - version: 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-browser-dynamic': - specifier: ~20.3.2 - version: 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) '@angular/router': - specifier: ~20.3.2 - version: 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + specifier: ~21.2.4 + version: 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@ng-bootstrap/ng-bootstrap': - specifier: ^19.0.1 - version: 19.0.1(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@popperjs/core@2.11.8)(rxjs@7.8.2) + specifier: ^20.0.0 + version: 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) '@ng-select/ng-select': - specifier: ^20.6.3 - version: 20.6.3(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)) + specifier: ^21.5.2 + version: 21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)) '@ngneat/dirty-check-forms': specifier: ^3.0.3 - version: 3.0.3(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/router@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) + version: 3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -56,24 +56,24 @@ importers: mime-names: specifier: ^1.0.0 version: 1.0.0 - ng2-pdf-viewer: - specifier: ^10.4.0 - version: 10.4.0 ngx-bootstrap-icons: specifier: ^1.9.3 - version: 1.9.3(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-color: specifier: ^10.1.0 - version: 10.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + version: 10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-cookie-service: - specifier: ^20.1.0 - version: 20.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + specifier: ^21.1.0 + version: 21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-device-detector: - specifier: ^10.1.0 - version: 10.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + specifier: ^11.0.0 + version: 11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) ngx-ui-tour-ng-bootstrap: - specifier: ^17.0.1 - version: 17.0.1(a51ec0d773a3e93ac3d51d20ca771021) + specifier: ^18.0.0 + version: 18.0.0(f247d97663488c516a027bc34de144d4) + pdfjs-dist: + specifier: ^5.4.624 + version: 5.4.624 rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -87,96 +87,96 @@ importers: specifier: ^13.0.0 version: 13.0.0 zone.js: - specifier: ^0.15.1 - version: 0.15.1 + specifier: ^0.16.1 + version: 0.16.1 devDependencies: '@angular-builders/custom-webpack': - specifier: ^20.0.0 - version: 20.0.0(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))(yaml@2.7.0) + specifier: ^21.0.3 + version: 21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular-builders/jest': - specifier: ^20.0.0 - version: 20.0.0(617e23274585616dcf62fd78c9140eac) + specifier: ^21.0.3 + version: 21.0.3(e6176eac41f0cffc5e05b8a4d945a538) '@angular-devkit/core': - specifier: ^20.3.3 - version: 20.3.3(chokidar@4.0.3) + specifier: ^21.2.2 + version: 21.2.2(chokidar@5.0.0) '@angular-devkit/schematics': - specifier: ^20.3.3 - version: 20.3.3(chokidar@4.0.3) + specifier: ^21.2.2 + version: 21.2.2(chokidar@5.0.0) '@angular-eslint/builder': - specifier: 20.3.0 - version: 20.3.0(chokidar@4.0.3)(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: 21.3.0 + version: 21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin': - specifier: 20.3.0 - version: 20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: 21.3.0 + version: 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': - specifier: 20.3.0 - version: 20.3.0(@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(@typescript-eslint/types@8.45.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: 21.3.0 + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/schematics': - specifier: 20.3.0 - version: 20.3.0(@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(@typescript-eslint/types@8.45.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(chokidar@4.0.3)(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: 21.3.0 + version: 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular-eslint/template-parser': - specifier: 20.3.0 - version: 20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: 21.3.0 + version: 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@angular/build': - specifier: ^20.3.3 - version: 20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0) + specifier: ^21.2.2 + version: 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) '@angular/cli': - specifier: ~20.3.3 - version: 20.3.3(@types/node@24.6.1)(chokidar@4.0.3) + specifier: ~21.2.2 + version: 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) '@angular/compiler-cli': - specifier: ~20.3.2 - version: 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) + specifier: ~21.2.4 + version: 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) '@codecov/webpack-plugin': specifier: ^1.9.1 - version: 1.9.1(webpack@5.102.0) + version: 1.9.1(webpack@5.105.3) '@playwright/test': - specifier: ^1.55.1 - version: 1.55.1 + specifier: ^1.58.2 + version: 1.58.2 '@types/jest': specifier: ^30.0.0 version: 30.0.0 '@types/node': - specifier: ^24.6.1 - version: 24.6.1 + specifier: ^25.4.0 + version: 25.4.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.45.0 - version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: ^8.57.0 + version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: ^8.57.0 + version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': - specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + specifier: ^8.57.0 + version: 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) eslint: - specifier: ^9.36.0 - version: 9.36.0(jiti@1.21.7) + specifier: ^10.0.3 + version: 10.0.3(jiti@2.6.1) jest: - specifier: 30.2.0 - version: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) + specifier: 30.3.0 + version: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-environment-jsdom: - specifier: ^30.2.0 - version: 30.2.0(canvas@3.0.0) + specifier: ^30.3.0 + version: 30.3.0(canvas@3.0.0) jest-junit: specifier: ^16.0.0 version: 16.0.0 jest-preset-angular: - specifier: ^15.0.2 - version: 15.0.2(ccefccc315e3e4bd30d78eb49c90d46a) + specifier: ^16.1.1 + version: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) jest-websocket-mock: specifier: ^2.5.0 version: 2.5.0 prettier-plugin-organize-imports: specifier: ^4.3.0 - version: 4.3.0(prettier@3.4.2)(typescript@5.8.3) + version: 4.3.0(prettier@3.4.2)(typescript@5.9.3) ts-node: specifier: ~10.9.1 - version: 10.9.2(@types/node@24.6.1)(typescript@5.8.3) + version: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 webpack: - specifier: ^5.102.0 - version: 5.102.0 + specifier: ^5.105.3 + version: 5.105.3 packages: @@ -195,114 +195,121 @@ packages: '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - '@algolia/abtesting@1.1.0': - resolution: {integrity: sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==} + '@algolia/abtesting@1.14.1': + resolution: {integrity: sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.35.0': - resolution: {integrity: sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==} + '@algolia/client-abtesting@5.48.1': + resolution: {integrity: sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.35.0': - resolution: {integrity: sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==} + '@algolia/client-analytics@5.48.1': + resolution: {integrity: sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.35.0': - resolution: {integrity: sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==} + '@algolia/client-common@5.48.1': + resolution: {integrity: sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.35.0': - resolution: {integrity: sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==} + '@algolia/client-insights@5.48.1': + resolution: {integrity: sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.35.0': - resolution: {integrity: sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==} + '@algolia/client-personalization@5.48.1': + resolution: {integrity: sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.35.0': - resolution: {integrity: sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==} + '@algolia/client-query-suggestions@5.48.1': + resolution: {integrity: sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.35.0': - resolution: {integrity: sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==} + '@algolia/client-search@5.48.1': + resolution: {integrity: sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.35.0': - resolution: {integrity: sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==} + '@algolia/ingestion@1.48.1': + resolution: {integrity: sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.35.0': - resolution: {integrity: sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==} + '@algolia/monitoring@1.48.1': + resolution: {integrity: sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.35.0': - resolution: {integrity: sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==} + '@algolia/recommend@5.48.1': + resolution: {integrity: sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.35.0': - resolution: {integrity: sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==} + '@algolia/requester-browser-xhr@5.48.1': + resolution: {integrity: sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.35.0': - resolution: {integrity: sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==} + '@algolia/requester-fetch@5.48.1': + resolution: {integrity: sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.35.0': - resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} + '@algolia/requester-node-http@5.48.1': + resolution: {integrity: sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular-builders/common@4.0.0': - resolution: {integrity: sha512-bepZI1KdXUVhDGqHOudZQJwucSbZWxfWzM+EHFXUoExUO0u7XEuHTF5bhtQZ+YU+ZK2Ayl26QbI/26Yj72vcFQ==} + '@angular-builders/common@5.0.3': + resolution: {integrity: sha512-Dro3574mu4/xqmjdA3159+TXDhgTbIJpEY/iBETSKUvHJiCgHel+R3eT105RpHN5o7NaD2rau5Zk2wuZqOk35Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular-builders/custom-webpack@20.0.0': - resolution: {integrity: sha512-aw7zXG5vhsYCPLR/eOThcyWLJZ9MEh49wYaj0LouBctJsAdR6Pgg3ksubrejLI5oiUWxM9Ywu4BGwmf3QaUYqg==} + '@angular-builders/custom-webpack@21.0.3': + resolution: {integrity: sha512-Aq3PZoQxY4jmfDb1sT5E6ZFAdiv35PziFmgYoW5DGX8xbYsV7EoKWZN2ZIjEI3Zr/WUZWGlxmxa11XK9WOtidg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler-cli': ^20.0.0 + '@angular/compiler-cli': ^21.0.0 - '@angular-builders/jest@20.0.0': - resolution: {integrity: sha512-3rnobnIdErtjyM3yAAAOdod79lgbkf1QWMFHiRDHW4tw4f+DLFiM2HMFircCoO5WIe/ILEJE9GNxs/vvYa3gvw==} + '@angular-builders/jest@21.0.3': + resolution: {integrity: sha512-RYIsJQJkke4Dns+lYBYzn0JcmABCQKvTWkqMibi5v8dgtNS8pgPS8pE5x8DSmgraqJikL3ukqaUQmdeL6r38aw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular-devkit/build-angular': ^20.0.0 - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/platform-browser-dynamic': ^20.0.0 - jest: '>=29' + '@angular-devkit/build-angular': ^21.0.0 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/platform-browser-dynamic': ^21.0.0 + jest: ^30.0.0 + + '@angular-devkit/architect@0.2101.2': + resolution: {integrity: sha512-pV2onJgp16xO0vAqEfRWVynRPPLVHydYLANNa3UX3l5T39JcYdMIoOHSIIl8tWrxVeOwiWd1ajub0VsFTUok4Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true - '@angular-devkit/architect@0.2000.4': - resolution: {integrity: sha512-pg+EPv/j17ybCoYiKjeRCebkE5CeD009xC6XJfugBmui6CcCQ5UAN82ibBhL869PXR7xCboylcRxlFfcBmvCpA==} + '@angular-devkit/architect@0.2102.0': + resolution: {integrity: sha512-kYFwTNzToG2SJMxj2f41w3QRtdqlrFuF+bpZrtIaHOP078Ktld8EPIp9KqB0Y46Vvs69ifby5Q1/wPD9wA3iaw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true - '@angular-devkit/architect@0.2003.3': - resolution: {integrity: sha512-DOnGyv9g24vaDzf5koLOcVri1kYJIBD9UKiJWOWk4H5cFlcpTXQ+PilPmDq6A+X94Tt4MZHImmKsk6LLRPIwFg==} + '@angular-devkit/architect@0.2102.2': + resolution: {integrity: sha512-CDvFtXwyBtMRkTQnm+LfBNLL0yLV8ZGskrM1T6VkcGwXGFDott1FxUdj96ViodYsYL5fbJr0MNA6TlLcanV3kQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true - '@angular-devkit/build-angular@20.0.4': - resolution: {integrity: sha512-YUf9hRAd//yu44vGMnET1ajmUMXwSz0t4rOajDj5yb57sYS9eYu912K2pWfDNDNJncOshtpklvBqUDngDNcPDw==} + '@angular-devkit/build-angular@21.1.2': + resolution: {integrity: sha512-i/FTbqVwj0Wk6B5RA2H9iVsDC/kIK/5koSEwkIQjXGZuDVFUoEuWiIR2PGGSSQ9u3DmkpVPZmKEXWRl+g7Qn5g==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/localize': ^20.0.0 - '@angular/platform-browser': ^20.0.0 - '@angular/platform-server': ^20.0.0 - '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.0.4 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.1.2 '@web/test-runner': ^0.20.0 browser-sync: ^3.0.2 - jest: ^29.5.0 - jest-environment-jsdom: ^29.5.0 + jest: ^30.2.0 + jest-environment-jsdom: ^30.2.0 karma: ^6.3.0 - ng-packagr: ^20.0.0 + ng-packagr: ^21.0.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.8 <5.9' + typescript: '>=5.9 <6.0' peerDependenciesMeta: '@angular/core': optional: true @@ -333,96 +340,108 @@ packages: tailwindcss: optional: true - '@angular-devkit/build-webpack@0.2000.4': - resolution: {integrity: sha512-ZdYSzuDJOIXzuzr3JuriAXWjjVH335K7sLF1udyd1BUeDkKjRNOrrd0Zfo8eraMgbMfEdjApf+UGzTBgU0euMA==} + '@angular-devkit/build-webpack@0.2101.2': + resolution: {integrity: sha512-/rC9rcrG+Tn8MZIEW9LTHmBuLiQdCHZyscgqgMXD049qgB858gS1Y/lP/tt0xrP3Yhan5XNcRYjcv6sYPtmPUw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^5.0.2 - '@angular-devkit/core@20.0.4': - resolution: {integrity: sha512-GmHBOEhdZn0Xh8JAdmnbSXtEMoAEqakEFy1JZmwuUo5e6uuuEp5xQY4O3MO0UQBVjYT+Wz8KNfonTvY91t/lNQ==} + '@angular-devkit/core@21.1.2': + resolution: {integrity: sha512-0wl5nJlFWsbwfUB2CQeTSmnVQ8AtqqwM3bYPYtXSc+vA8+hzsOAjjDuRnBxZS9zTnqtXKXB1e7M3Iy7KUwh7LA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^5.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@21.2.0': + resolution: {integrity: sha512-HZdTn46Ca6qbb9Zef8R/+TWsk6mNKRm4rJyL3PxHP6HnVCwSPNZ0LNN9BjVREBs+UlRdXqBGFBZh5D1nBgu5GQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - chokidar: ^4.0.0 + chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/core@20.3.3': - resolution: {integrity: sha512-2T5mX2duLapZYPYmXUSUe9VW8Dhu10nVBVvEp31jSE6xvjbPM5mlsv6+fks1E4RjhzvaamY9bm3WgwYwNiEV5g==} + '@angular-devkit/core@21.2.2': + resolution: {integrity: sha512-xUeKGe4BDQpkz0E6fnAPIJXE0y0nqtap0KhJIBhvN7xi3NenIzTmoi6T9Yv5OOBUdLZbOm4SOel8MhdXiIBpAQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - chokidar: ^4.0.0 + chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/schematics@20.3.3': - resolution: {integrity: sha512-LDn39BjyQLAK/DaVamLElMtI0UoCZIs4jKcMEv8PJ/nnBmrYFHVavWPggeFWMycjeXsdX34Msiml88HZWlXypw==} + '@angular-devkit/schematics@21.2.2': + resolution: {integrity: sha512-CCeyQxGUq+oyGnHd7PfcYIVbj9pRnqjQq0rAojoAqs1BJdtInx9weLBCLy+AjM3NHePeZrnwm+wEVr8apED8kg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular-eslint/builder@20.3.0': - resolution: {integrity: sha512-3XpWLdh+/K4+r0ChkKW00SXWyBA7ShMpE+Pt1XUmIu4srJgGRnt8e+kC4Syi+s2t5QS7PjlwRaelB1KfSMXZ5A==} + '@angular-eslint/builder@21.3.0': + resolution: {integrity: sha512-26QUUouei52biUFAlJSrWNAU9tuF2miKwd8uHdxWwCF31xz+OxC5+NfudWvt1AFaYow7gWueX1QX3rNNtSPDrg==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + '@angular/cli': '>= 21.0.0 < 22.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/bundled-angular-compiler@20.3.0': - resolution: {integrity: sha512-QwuNnmRNr/uNj89TxknPbGcs5snX1w7RoJJPNAsfb2QGcHzUTQovS8hqm9kaDZdpUJDPP7jt7B6F0+EjrPAXRA==} + '@angular-eslint/bundled-angular-compiler@21.3.0': + resolution: {integrity: sha512-l521I24J9gJxyMbRkrM24Tc7W8J8BP+TDAmVs2nT8+lXbS3kg8QpWBRtd+hNUgq6o+vt+lKBkytnEfu8OiqeRg==} - '@angular-eslint/eslint-plugin-template@20.3.0': - resolution: {integrity: sha512-WMJDJfybOLCiN4QrOyrLl+Zt5F+A/xoDYMWTdn+LgACheLs2tguVQiwf+oCgHnHGcsTsulPYlRHldKBGZMgs4w==} + '@angular-eslint/eslint-plugin-template@21.3.0': + resolution: {integrity: sha512-lVixd/KypPWgA/5/pUOhJV9MTcaHjYZEqyOi+IiLk+h+maGxn6/s6Ot+20n+XGS85zAgOY+qUw6EEQ11hoojIQ==} peerDependencies: - '@angular-eslint/template-parser': 20.3.0 + '@angular-eslint/template-parser': 21.3.0 '@typescript-eslint/types': ^7.11.0 || ^8.0.0 '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/eslint-plugin@20.3.0': - resolution: {integrity: sha512-7ghzGTiExrgTetDQ6IPP5uXSa94Xhtzp2VHCIa58EcUb7oMv06HWZ1Uss3xgFmACsLpN+vayKJIdFiboqaGVRA==} + '@angular-eslint/eslint-plugin@21.3.0': + resolution: {integrity: sha512-Whf/AUUBekOlfSJRS78m76YGrBQAZ3waXE7oOdlW5xEQvn8jBDN9EGuNnjg/syZzvzjK4ZpYC4g1XYXrc+fQIg==} peerDependencies: '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/schematics@20.3.0': - resolution: {integrity: sha512-4n92tHKIJm1PP+FjhnmO7AMpvKdRIoF+YgF38oUU7aMJqfZ3RXIhazMMxw2u3VU1MisKH766KSll++c4LgarVA==} + '@angular-eslint/schematics@21.3.0': + resolution: {integrity: sha512-8deU/zVY9f8k8kAQQ9PL130ox2VlrZw3fMxgsPNAY5tjQ0xk0J2YVSszYHhcqdMGG1J01IsxIjvQaJ4pFfEmMw==} + peerDependencies: + '@angular/cli': '>= 21.0.0 < 22.0.0' - '@angular-eslint/template-parser@20.3.0': - resolution: {integrity: sha512-gB564h/kZ7siWvgHDETU++sk5e25qFfVaizLaa6KoBEYFP6dOCiedz15LTcA0TsXp0rGu6Z6zkl291iSM1qzDA==} + '@angular-eslint/template-parser@21.3.0': + resolution: {integrity: sha512-ysyou1zAY6M6rSZNdIcYKGd4nk6TCapamyFNB3ivmTlVZ0O35TS9o/rJ0aUttuHgDp+Ysgs3ql+LA746PXgCyQ==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular-eslint/utils@20.3.0': - resolution: {integrity: sha512-7XOQeNXgyhznDwoP1TwPrCMq/uXKJHQgCVPFREkJGKbNf/jzNldB7iV1eqpBzUQIPEQFgfcDG67dexpMAq3N4g==} + '@angular-eslint/utils@21.3.0': + resolution: {integrity: sha512-oNigH6w3l+owTMboj/uFG0tHOy43uH8BpQRtBOQL1/s2+5in/BJ2Fjobv3SyizxTgeJ1FhRefbkT8GmVjK7jAA==} peerDependencies: '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' - '@angular/build@20.0.4': - resolution: {integrity: sha512-SIYLg2st05Q5hgFrxwj6L4i9j2j2JNWYoYgacXp+mw9YVhFiC02Ymbakc9fq+3+sWlm0XTX5JgrupV2ac1ytNQ==} + '@angular/build@21.1.2': + resolution: {integrity: sha512-5hl7OTZeQcdkr/3LXSijLuUCwlcqGyYJYOb8GbFqSifSR03JFI3tLQtyQ0LX2CXv3MOx1qFUQbYVfcjW5M36QQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler': ^20.0.0 - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/localize': ^20.0.0 - '@angular/platform-browser': ^20.0.0 - '@angular/platform-server': ^20.0.0 - '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.0.4 + '@angular/compiler': ^21.0.0 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.1.2 karma: ^6.4.0 less: ^4.2.0 - ng-packagr: ^20.0.0 + ng-packagr: ^21.0.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.8 <5.9' - vitest: ^3.1.1 + typescript: '>=5.9 <6.0' + vitest: ^4.0.8 peerDependenciesMeta: '@angular/core': optional: true @@ -449,26 +468,26 @@ packages: vitest: optional: true - '@angular/build@20.3.3': - resolution: {integrity: sha512-WhwAbovHAxDbNeR5jB2IS/SVs+yQg9NETFeJ5f7T3n/414ULkGOhXn+29i1rzwJhf1uqM9lsedcv2tKn1N24/A==} + '@angular/build@21.2.2': + resolution: {integrity: sha512-Vq2eIneNxzhHm1MwEmRqEJDwHU9ODfSRDaMWwtysGMhpoMQmLdfTqkQDmkC2qVUr8mV8Z1i5I+oe5ZJaMr/PlQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler': ^20.0.0 - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/localize': ^20.0.0 - '@angular/platform-browser': ^20.0.0 - '@angular/platform-server': ^20.0.0 - '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.3.3 + '@angular/compiler': ^21.0.0 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.2.2 karma: ^6.4.0 less: ^4.2.0 - ng-packagr: ^20.0.0 + ng-packagr: ^21.0.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.8 <6.0' - vitest: ^3.1.1 + typescript: '>=5.9 <6.0' + vitest: ^4.0.8 peerDependenciesMeta: '@angular/core': optional: true @@ -495,160 +514,149 @@ packages: vitest: optional: true - '@angular/cdk@20.2.6': - resolution: {integrity: sha512-+L0/KGMXE/lVuDid6PMsNSMuZoCnGUbCtuQ804fE4+EXoN+fLe6NVYGMi83ZINuWfeAEanH9l2XMdDIvVRWsUQ==} + '@angular/cdk@21.2.2': + resolution: {integrity: sha512-9AsZkwqy07No7+0qPydcJfXB6SpA9qLDBanoesNj5KsiZJ62PJH3oIjVyNeQEEe1HQWmSwBnhwN12OPLNMUlnw==} peerDependencies: - '@angular/common': ^20.0.0 || ^21.0.0 - '@angular/core': ^20.0.0 || ^21.0.0 + '@angular/common': ^21.0.0 || ^22.0.0 + '@angular/core': ^21.0.0 || ^22.0.0 + '@angular/platform-browser': ^21.0.0 || ^22.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/cli@20.3.3': - resolution: {integrity: sha512-3c8xCklJ0C0T6ETSncAoXlOYNi3x7vLT3PS56rIaQ0jtlvD4Y+RQakd3+iffVAapvh/JB27WNor8pJRThLZ/jg==} + '@angular/cli@21.2.2': + resolution: {integrity: sha512-eZo8/qX+ZIpIWc0CN+cCX13Lbgi/031wAp8DRVhDDO6SMVtcr/ObOQ2S16+pQdOMXxiG3vby6IhzJuz9WACzMQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@20.3.2': - resolution: {integrity: sha512-5V9AzLhCA1dNhF+mvihmdHoZHbEhIb1jNYRA1/JMheR+G7NR8Mznu6RmWaKSWZ4AJeSJN8rizWN2wpVPWTKjSQ==} + '@angular/common@21.2.4': + resolution: {integrity: sha512-NrP6qOuUpo3fqq14UJ1b2bIRtWsfvxh1qLqOyFV4gfBrHhXd0XffU1LUlUw1qp4w1uBSgPJ0/N5bSPUWrAguVg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 20.3.2 + '@angular/core': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@20.3.2': - resolution: {integrity: sha512-rLox2THiALVQqYGUaxZ6YD8qUoXIOGTw3s0tim9/U65GuXGRtYgG0ZQWYp3yjEBes0Ksx2/15eFPp1Ol4FdEKQ==} + '@angular/compiler-cli@21.2.4': + resolution: {integrity: sha512-vGjd7DZo/Ox50pQCm5EycmBu91JclimPtZoyNXu/2hSxz3oAkzwiHCwlHwk2g58eheSSp+lYtYRLmHAqSVZLjg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 20.3.2 - typescript: '>=5.8 <6.0' + '@angular/compiler': 21.2.4 + typescript: '>=5.9 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@20.3.2': - resolution: {integrity: sha512-5fSzkPmRomZ9H43c82FJWLwdOi7MICMimP1y1oYJZcUh3jYRhXUrQvD0jifdRVkkgKNjaZYlMr0NkrYQFgFong==} + '@angular/compiler@21.2.4': + resolution: {integrity: sha512-9+ulVK3idIo/Tu4X2ic7/V0+Uj7pqrOAbOuIirYe6Ymm3AjexuFRiGBbfcH0VJhQ5cf8TvIJ1fuh+MI4JiRIxA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@20.3.2': - resolution: {integrity: sha512-88uPgs5LjtnywnQaZE2ShBb1wa8IuD6jWs4nc4feo32QdBc55tjebTBFJSHbi3mUVAp0eS4wI6ITo0YIb01H4g==} + '@angular/core@21.2.4': + resolution: {integrity: sha512-2+gd67ZuXHpGOqeb2o7XZPueEWEP81eJza2tSHkT5QMV8lnYllDEmaNnkPxnIjSLGP1O3PmiXxo4z8ibHkLZwg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 20.3.2 + '@angular/compiler': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 - zone.js: ~0.15.0 + zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: '@angular/compiler': optional: true zone.js: optional: true - '@angular/forms@20.3.2': - resolution: {integrity: sha512-ECIbtwc7n9fPbiZXZVaoZpSiOksgcNbZ27oUN9BT7EmoXRzBw6yDL2UX6Ig7pEKhQGyBkKB+TMerRwTDVkkCWg==} + '@angular/forms@21.2.4': + resolution: {integrity: sha512-1fOhctA9ADEBYjI3nPQUR5dHsK2+UWAjup37Ksldk/k0w8UpD5YsN7JVNvsDMZRFMucKYcGykPblU7pABtsqnQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 20.3.2 - '@angular/core': 20.3.2 - '@angular/platform-browser': 20.3.2 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@20.3.2': - resolution: {integrity: sha512-RZMHgLZV1Aka7rUKvQbg08Dn+dMyVBEGTlUS6/bTDoB1Xq2UE9L8YKmlnEDQyzveO5vTsPvZZQRL4iLc4IokzQ==} + '@angular/localize@21.2.4': + resolution: {integrity: sha512-brKKeH+jaTlY4coIOinKQtitLCguQzyniKYtfrhCvZSN0ap4W4PljAT5w3l+1a8e7/ThM1JVQpqtVCCcJHJZSg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 20.3.2 - '@angular/compiler-cli': 20.3.2 + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4 - '@angular/platform-browser-dynamic@20.3.2': - resolution: {integrity: sha512-ehoV67Vxr3ZE8BJ3g7Q4ZLHo3qJVoDUDz/4UeCqmDeOnKxcdD53HTA/pgOO4QhKStUFbzgU19OQD4e6fkP8YoQ==} + '@angular/platform-browser-dynamic@21.2.4': + resolution: {integrity: sha512-LRJLnGh4rdgD0+S5xuDd4YRm5bV8WP2e6F1Pe5rIr6N4V9ofgpB0/uOjYy9se99FJZjoyPnpxaKsp8+XA753Zg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 20.3.2 - '@angular/compiler': 20.3.2 - '@angular/core': 20.3.2 - '@angular/platform-browser': 20.3.2 + '@angular/common': 21.2.4 + '@angular/compiler': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 - '@angular/platform-browser@20.3.2': - resolution: {integrity: sha512-d9XcT2UuWZCc0UOtkCcPEnMcOFKNczahamT/Izg3H9jLS3IcT6l0ry23d/Xf0DRwhLYQdOZiG7l8HMZ1sWPMOg==} + '@angular/platform-browser@21.2.4': + resolution: {integrity: sha512-1A9e/cQVu+3BkRCktLcO3RZGuw8NOTHw1frUUrpAz+iMyvIT4sDRFbL+U1g8qmOCZqRNC1Pi1HZfZ1kl6kvrcQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 20.3.2 - '@angular/common': 20.3.2 - '@angular/core': 20.3.2 + '@angular/animations': 21.2.4 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@20.3.2': - resolution: {integrity: sha512-+Crx6QpK00juoNU3A1vbVf4DQ7fduLe3DUdAob6a9Uj+IoWj2Ijd8zUWF8E0cfNNFotJ4Gost0lJORDvqKcC7A==} + '@angular/router@21.2.4': + resolution: {integrity: sha512-OjWze4XT8i2MThcBXMv7ru1k6/5L6QYZbcXuseqimFCHm2avEJ+mXPovY066fMBZJhqbXdjB82OhHAWkIHjglQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 20.3.2 - '@angular/core': 20.3.2 - '@angular/platform-browser': 20.3.2 + '@angular/common': 21.2.4 + '@angular/core': 21.2.4 + '@angular/platform-browser': 21.2.4 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.7': - resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.27.1': - resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.1': - resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.1': - resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -656,16 +664,16 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -674,8 +682,8 @@ packages: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.27.1': @@ -684,8 +692,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -702,29 +710,29 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -747,8 +755,8 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -780,14 +788,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -802,8 +810,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -850,8 +858,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -868,8 +876,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.27.1': - resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -886,44 +894,44 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.5': - resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.27.7': - resolution: {integrity: sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==} + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.27.7': - resolution: {integrity: sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -934,8 +942,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -946,8 +954,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -970,8 +984,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -982,8 +996,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1000,14 +1014,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1018,8 +1032,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1030,20 +1044,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.27.7': - resolution: {integrity: sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==} + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1054,14 +1068,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1072,14 +1086,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1090,14 +1104,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.5': - resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1108,8 +1122,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.27.1': - resolution: {integrity: sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==} + '@babel/plugin-transform-runtime@7.28.5': + resolution: {integrity: sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1120,8 +1134,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1150,8 +1164,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1162,14 +1176,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.27.2': - resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} + '@babel/preset-env@7.28.5': + resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1179,20 +1193,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1248,519 +1262,383 @@ packages: resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} - '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/runtime@1.9.0': + resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.3': + resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.36.0': - resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.3': + resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@gar/promise-retry@1.0.2': + resolution: {integrity: sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@harperfast/extended-iterable@1.0.3': + resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} + + '@hono/node-server@1.19.9': + resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1777,30 +1655,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@1.0.0': - resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} - engines: {node: '>=18'} - - '@inquirer/checkbox@4.2.4': - resolution: {integrity: sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/confirm@5.1.10': - resolution: {integrity: sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/confirm@5.1.14': - resolution: {integrity: sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==} + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1808,8 +1668,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.18': - resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1817,8 +1677,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.2.2': - resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1826,8 +1686,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.20': - resolution: {integrity: sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==} + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1835,8 +1695,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.20': - resolution: {integrity: sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==} + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1844,8 +1704,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@1.0.2': - resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1853,12 +1713,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.13': - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/input@4.2.4': - resolution: {integrity: sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==} + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1866,8 +1726,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.20': - resolution: {integrity: sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==} + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1875,8 +1735,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.20': - resolution: {integrity: sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==} + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1884,8 +1744,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.8.2': - resolution: {integrity: sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==} + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1893,8 +1753,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.8': - resolution: {integrity: sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==} + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1902,8 +1762,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.1.3': - resolution: {integrity: sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==} + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1911,8 +1771,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.3.4': - resolution: {integrity: sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==} + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1920,8 +1780,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1929,14 +1789,6 @@ packages: '@types/node': optional: true - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1953,12 +1805,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.2.0': - resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + '@jest/console@30.3.0': + resolution: {integrity: sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.2.0': - resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + '@jest/core@30.3.0': + resolution: {integrity: sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1970,6 +1822,10 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.3.0': + resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.2.0': resolution: {integrity: sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1980,34 +1836,44 @@ packages: canvas: optional: true - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment-jsdom-abstract@30.3.0': + resolution: {integrity: sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true '@jest/environment@30.2.0': resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.3.0': + resolution: {integrity: sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.0.5': resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + '@jest/expect-utils@30.3.0': + resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.2.0': - resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + '@jest/expect@30.3.0': + resolution: {integrity: sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/fake-timers@30.2.0': resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.3.0': + resolution: {integrity: sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.0.1': resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2016,16 +1882,16 @@ packages: resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.2.0': - resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + '@jest/globals@30.3.0': + resolution: {integrity: sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.2.0': - resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + '@jest/reporters@30.3.0': + resolution: {integrity: sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2041,30 +1907,26 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.2.0': - resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + '@jest/snapshot-utils@30.3.0': + resolution: {integrity: sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.2.0': - resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + '@jest/test-result@30.3.0': + resolution: {integrity: sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.2.0': - resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + '@jest/test-sequencer@30.3.0': + resolution: {integrity: sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.2.0': - resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + '@jest/transform@30.3.0': + resolution: {integrity: sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@30.0.5': resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2073,6 +1935,10 @@ packages: resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.3.0': + resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -2090,9 +1956,6 @@ packages: '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -2108,14 +1971,116 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + '@jsonjoy.com/base64@17.65.0': + resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@17.65.0': + resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@17.65.0': + resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.56.10': + resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.56.10': + resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.56.10': + resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.56.10': + resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.56.10': + resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.56.10': + resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.56.10': + resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.56.10': + resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@17.65.0': + resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@17.65.0': + resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.6.0': - resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} + '@jsonjoy.com/util@17.65.0': + resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -2123,86 +2088,92 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@listr2/prompt-adapter-inquirer@3.0.1': - resolution: {integrity: sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==} + '@listr2/prompt-adapter-inquirer@3.0.5': + resolution: {integrity: sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==} engines: {node: '>=20.0.0'} peerDependencies: '@inquirer/prompts': '>= 3 < 8' - listr2: 9.0.1 + listr2: 9.0.5 - '@lmdb/lmdb-darwin-arm64@3.3.0': - resolution: {integrity: sha512-LipbQobyEfQtu8WixasaFUZZ+JCGlho4OWwWIQ5ol0rB1RKkcZvypu7sS1CBvofBGVAa3vbOh8IOGQMrbmL5dg==} + '@lmdb/lmdb-darwin-arm64@3.4.4': + resolution: {integrity: sha512-XaKL705gDWd6XVls3ATDj13ZdML/LqSIxwgnYpG8xTzH2ifArx8fMMDdvqGE/Emd+W6R90W2fveZcJ0AyS8Y0w==} cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-arm64@3.4.2': - resolution: {integrity: sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==} + '@lmdb/lmdb-darwin-arm64@3.5.1': + resolution: {integrity: sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ==} cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.3.0': - resolution: {integrity: sha512-yA+9P+ZeA3vg76BLXWeUomIAjxfmSmR2eg8fueHXDg5Xe1Xmkl9JCKuHXUhtJ+mMVcH12d5k4kJBLbyXTadfGQ==} + '@lmdb/lmdb-darwin-x64@3.4.4': + resolution: {integrity: sha512-GPHGEVcwJlkD01GmIr7B4kvbIcUDS2+kBadVEd7lU4can1RZaZQLDDBJRrrNfS2Kavvl0VLI/cMv7UASAXGrww==} cpu: [x64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.4.2': - resolution: {integrity: sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==} + '@lmdb/lmdb-darwin-x64@3.5.1': + resolution: {integrity: sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w==} cpu: [x64] os: [darwin] - '@lmdb/lmdb-linux-arm64@3.3.0': - resolution: {integrity: sha512-OeWvSgjXXZ/zmtLqqL78I3910F6UYpUubmsUU+iBHo6nTtjkpXms95rJtGrjkWQqwswKBD7xSMplbYC4LEsiPA==} + '@lmdb/lmdb-linux-arm64@3.4.4': + resolution: {integrity: sha512-mALqr7DE42HsiwVTKpQWxacjHoJk+e9p00RWIJqTACh/hpucxp/0lK/XMh5XzWnU/TDCZLukq1+vNqnNumTP/Q==} cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm64@3.4.2': - resolution: {integrity: sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==} + '@lmdb/lmdb-linux-arm64@3.5.1': + resolution: {integrity: sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg==} cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm@3.3.0': - resolution: {integrity: sha512-EDYrW9kle+8wI19JCj/PhRnGoCN9bked5cdOPdo1wdgH/HzjgoLPFTn9DHlZccgTEVhp3O+bpWXdN/rWySVvjw==} + '@lmdb/lmdb-linux-arm@3.4.4': + resolution: {integrity: sha512-cmev5/dZr5ACKri9f6GU6lZCXTjMhV72xujlbOhFCgFXrt4W0TxGsmY8kA1BITvH60JBKE50cSxsiulybAbrrw==} cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-arm@3.4.2': - resolution: {integrity: sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==} + '@lmdb/lmdb-linux-arm@3.5.1': + resolution: {integrity: sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A==} cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-x64@3.3.0': - resolution: {integrity: sha512-wDd02mt5ScX4+xd6g78zKBr6ojpgCJCTrllCAabjgap5FzuETqOqaQfKhO+tJuGWv/J5q+GIds6uY7rNFueOxg==} + '@lmdb/lmdb-linux-x64@3.4.4': + resolution: {integrity: sha512-QjLs8OcmCNcraAcLoZyFlo0atzBJniQLLwhtR+ymQqS5kLYpV5RqwriL87BW+ZiR9ZiGgZx3evrz5vnWPtJ1fQ==} cpu: [x64] os: [linux] - '@lmdb/lmdb-linux-x64@3.4.2': - resolution: {integrity: sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==} + '@lmdb/lmdb-linux-x64@3.5.1': + resolution: {integrity: sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g==} cpu: [x64] os: [linux] - '@lmdb/lmdb-win32-arm64@3.3.0': - resolution: {integrity: sha512-COotWhHJgzXULLiEjOgWQwqig6PoA+6ji6W+sDl6M1HhMXWIymEVHGs0edsVSNtsNSCAWMxJgR3asv6FNX/2EA==} + '@lmdb/lmdb-win32-arm64@3.4.4': + resolution: {integrity: sha512-tr/pwHDlZ33forLGAr0tI04cRmP4SgF93yHbb+2zvZiDEyln5yMHhbKDySxY66aUOkhvBvTuHq9q/3YmTj6ZHQ==} cpu: [arm64] os: [win32] - '@lmdb/lmdb-win32-arm64@3.4.2': - resolution: {integrity: sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==} + '@lmdb/lmdb-win32-arm64@3.5.1': + resolution: {integrity: sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w==} cpu: [arm64] os: [win32] - '@lmdb/lmdb-win32-x64@3.3.0': - resolution: {integrity: sha512-kqUgQH+l8HDbkAapx+aoko7Ez4X4DqkIraOqY/k0QY5EN/iialVlFpBUXh4wFXzirdmEVjbIUMrceUh0Kh8LeA==} + '@lmdb/lmdb-win32-x64@3.4.4': + resolution: {integrity: sha512-KRzfocJzB/mgoTCqnMawuLSKheHRVTqWfSmouIgYpFs6Hx4zvZSvsZKSCEb5gHmICy7qsx9l06jk3MFTtiFVAQ==} cpu: [x64] os: [win32] - '@lmdb/lmdb-win32-x64@3.4.2': - resolution: {integrity: sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==} + '@lmdb/lmdb-win32-x64@3.5.1': + resolution: {integrity: sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg==} cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.17.3': - resolution: {integrity: sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==} + '@modelcontextprotocol/sdk@1.26.0': + resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} @@ -2234,10 +2205,80 @@ packages: cpu: [x64] os: [win32] - '@napi-rs/nice-android-arm-eabi@1.1.1': - resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + '@napi-rs/canvas-android-arm64@0.1.90': + resolution: {integrity: sha512-3JBULVF+BIgr7yy7Rf8UjfbkfFx4CtXrkJFD1MDgKJ83b56o0U9ciT8ZGTCNmwWkzu8RbNKlyqPP3KYRG88y7Q==} engines: {node: '>= 10'} - cpu: [arm] + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.90': + resolution: {integrity: sha512-L8XVTXl+8vd8u7nPqcX77NyG5RuFdVsJapQrKV9WE3jBayq1aSMht/IH7Dwiz/RNJ86E5ZSg9pyUPFIlx52PZA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.90': + resolution: {integrity: sha512-h0ukhlnGhacbn798VWYTQZpf6JPDzQYaow+vtQ2Fat7j7ImDdpg6tfeqvOTO1r8wS+s+VhBIFITC7aA1Aik0ZQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.90': + resolution: {integrity: sha512-JCvTl99b/RfdBtgftqrf+5UNF7GIbp7c5YBFZ+Bd6++4Y3phaXG/4vD9ZcF1bw1P4VpALagHmxvodHuQ9/TfTg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.90': + resolution: {integrity: sha512-vbWFp8lrP8NIM5L4zNOwnsqKIkJo0+GIRUDcLFV9XEJCptCc1FY6/tM02PT7GN4PBgochUPB1nBHdji6q3ieyQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.90': + resolution: {integrity: sha512-8Bc0BgGEeOaux4EfIfNzcRRw0JE+lO9v6RWQFCJNM9dJFE4QJffTf88hnmbOaI6TEMpgWOKipbha3dpIdUqb/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.90': + resolution: {integrity: sha512-0iiVDG5IH+gJb/YUrY/pRdbsjcgvwUmeckL/0gShWAA7004ygX2ST69M1wcfyxXrzFYjdF8S/Sn6aCAeBi89XQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.90': + resolution: {integrity: sha512-SkKmlHMvA5spXuKfh7p6TsScDf7lp5XlMbiUhjdCtWdOS6Qke/A4qGVOciy6piIUCJibL+YX+IgdGqzm2Mpx/w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.90': + resolution: {integrity: sha512-o6QgS10gAS4vvELGDOOWYfmERXtkVRYFWBCjomILWfMgCvBVutn8M97fsMW5CrEuJI8YuxuJ7U+/DQ9oG93vDA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-arm64-msvc@0.1.90': + resolution: {integrity: sha512-2UHO/DC1oyuSjeCAhHA0bTD9qsg58kknRqjJqRfvIEFtdqdtNTcWXMCT9rQCuJ8Yx5ldhyh2SSp7+UDqD2tXZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@0.1.90': + resolution: {integrity: sha512-48CxEbzua5BP4+OumSZdi3+9fNiRO8cGNBlO2bKwx1PoyD1R2AXzPtqd/no1f1uSl0W2+ihOO1v3pqT3USbmgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.90': + resolution: {integrity: sha512-vO9j7TfwF9qYCoTOPO39yPLreTRslBVOaeIwhDZkizDvBb0MounnTl0yeWUMBxP4Pnkg9Sv+3eQwpxNUmTwt0w==} + engines: {node: '>= 10'} + + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] os: [android] '@napi-rs/nice-android-arm64@1.1.1': @@ -2343,26 +2384,26 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.0.5': - resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@ng-bootstrap/ng-bootstrap@19.0.1': - resolution: {integrity: sha512-1lErAkwh0F+gWkzpiddViY4GfA9LVXkwLpgBsV9Mb3IC0zo6WNkY8WxCC+LqajirBTu20DCkZSqeRzrwaVLpZw==} + '@ng-bootstrap/ng-bootstrap@20.0.0': + resolution: {integrity: sha512-Jt+GUQ0PdM8VsOUUVr7vTQXhwcGwe2DCe1mmfS21vz9pLSOtGRz41ohZKc1egUevj5Rxm2sHVq5Sve68/nTMfA==} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/forms': ^20.0.0 - '@angular/localize': ^20.0.0 + '@angular/common': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/forms': ^21.0.0 + '@angular/localize': ^21.0.0 '@popperjs/core': ^2.11.8 rxjs: ^6.5.3 || ^7.4.0 - '@ng-select/ng-select@20.6.3': - resolution: {integrity: sha512-+aX2l3OshyPsyMCAuiA3ND5c6X1DG5jQjdlP8PBIyYEoQWlxEcgJWrMsPa7mHVFRpp+5KZZhnXhyosUE4CEc3w==} - engines: {node: ^22.12.0 || >=24.0.0} + '@ng-select/ng-select@21.5.2': + resolution: {integrity: sha512-QFfZ00Z/UfZikK3BCyl4rWpZGd7W5YE2ScTbRcC2jH6QN8E1pNgxH1bBS05p2YEYZIA6RZ5/HcJguj3ipPy5Jw==} + engines: {node: ^20.19.0 || ^22.12.0 || ^24.0.0} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/forms': ^20.0.0 + '@angular/common': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/forms': ^21.0.0 '@ngneat/dirty-check-forms@3.0.3': resolution: {integrity: sha512-YGlKrAaqTRO8lfT1xyN9LkYN0GH0crzdnXAxQFNEuNDQpCHv9cQ0j9XPDsonek6X4K7fLug84n0CQ42rSmGBqw==} @@ -2373,62 +2414,50 @@ packages: lodash-es: '>=4.17.0' rxjs: '>=6.0.0' - '@ngtools/webpack@20.0.4': - resolution: {integrity: sha512-GFke8NcaFW62d1KXd4DkKbEw4mSsjJsMGmeHkBe5LPWS6zRIAZULo0fk/qV94IZ8INDbqY2k1WoxvStg7pHTsg==} + '@ngtools/webpack@21.1.2': + resolution: {integrity: sha512-ZNMMD35urDKqYtx1drxPyGAvUPMOoiKjvrH8owpN+mzIO1nYpssCgmAseo1hePAduSvv8tAsY1NLtJfMSNzubw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^20.0.0 - typescript: '>=5.8 <5.9' + '@angular/compiler-cli': ^21.0.0 + typescript: '>=5.9 <6.0' webpack: ^5.54.0 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/agent@3.0.0': - resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/fs@4.0.0': - resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/git@6.0.3': - resolution: {integrity: sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/git@7.0.2': + resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/installed-package-contents@3.0.0': - resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/installed-package-contents@4.0.0': + resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - '@npmcli/node-gyp@4.0.0': - resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/package-json@6.2.0': - resolution: {integrity: sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/package-json@7.0.5': + resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/promise-spawn@8.0.3': - resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/promise-spawn@9.0.1': + resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/redact@3.2.2': - resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/redact@4.0.0': + resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/run-script@9.1.0': - resolution: {integrity: sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/run-script@10.0.4': + resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} + engines: {node: ^20.17.0 || >=22.9.0} '@octokit/auth-token@4.0.0': resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} @@ -2478,89 +2507,92 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@oxc-project/types@0.89.0': - resolution: {integrity: sha512-yuo+ECPIW5Q9mSeNmCDC2im33bfKuwW18mwkaHMQh8KakHYDzj4ci/q7wxf2qS3dMlVVCIyrs3kFtH5LmnlYnw==} + '@oxc-project/types@0.106.0': + resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@oxc-project/types@0.113.0': + resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': @@ -2571,356 +2603,344 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.55.1': - resolution: {integrity: sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==} + '@playwright/test@1.58.2': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} engines: {node: '>=18'} hasBin: true '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@rolldown/binding-android-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-AE3HFQrjWCKLFZD1Vpiy+qsqTRwwoil1oM5WsKPSmfQ5fif/A+ZtOZetF32erZdsR7qyvns6qHEteEsF6g6rsQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-RaoWOKc0rrFsVmKOjQpebMY6c6/I7GR1FBc25v7L/R7NlM0166mUotwGEv7vxu7ruXH4SJcFeVrfADFUUXUmmQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.38': - resolution: {integrity: sha512-Ymojqc2U35iUc8NFU2XX1WQPfBRRHN6xHcrxAf9WS8BFFBn8pDrH5QPvH1tYs3lDkw6UGGbanr1RGzARqdUp1g==} + '@rolldown/binding-darwin-x64@1.0.0-beta.58': + resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.4': + resolution: {integrity: sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.38': - resolution: {integrity: sha512-0ermTQ//WzSI0nOL3z/LUWMNiE9xeM5cLGxjewPFEexqxV/0uM8/lNp9QageQ8jfc/VO1OURsGw34HYO5PaL8w==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.4': + resolution: {integrity: sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': - resolution: {integrity: sha512-GADxzVUTCTp6EWI52831A29Tt7PukFe94nhg/SUsfkI33oTiNQtPxyLIT/3oRegizGuPSZSlrdBurkjDwxyEUQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': + resolution: {integrity: sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': - resolution: {integrity: sha512-SKO7Exl5Yem/OSNoA5uLHzyrptUQ8Hg70kHDxuwEaH0+GUg+SQe9/7PWmc4hFKBMrJGdQtii8WZ0uIz9Dofg5Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': + resolution: {integrity: sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': - resolution: {integrity: sha512-SOo6+WqhXPBaShLxLT0eCgH17d3Yu1lMAe4mFP0M9Bvr/kfMSOPQXuLxBcbBU9IFM9w3N6qP9xWOHO+oUJvi8Q==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': + resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': - resolution: {integrity: sha512-yvsQ3CyrodOX+lcoi+lejZGCOvJZa9xTsNB8OzpMDmHeZq3QzJfpYjXSAS6vie70fOkLVJb77UqYO193Cl8XBQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': + resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': - resolution: {integrity: sha512-84qzKMwUwikfYeOuJ4Kxm/3z15rt0nFGGQArHYIQQNSTiQdxGHxOkqXtzPFqrVfBJUdxBAf+jYzR1pttFJuWyg==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': + resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': - resolution: {integrity: sha512-QrNiWlce01DYH0rL8K3yUBu+lNzY+B0DyCbIc2Atan6/S6flxOL0ow5DLQvMamOI/oKhrJ4xG+9MkMb9dDHbLQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': - resolution: {integrity: sha512-fnLtHyjwEsG4/aNV3Uv3Qd1ZbdH+CopwJNoV0RgBqrcQB8V6/Qdikd5JKvnO23kb3QvIpP+dAMGZMv1c2PJMzw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + resolution: {integrity: sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-19cTfnGedem+RY+znA9J6ARBOCEFD4YSjnx0p5jiTm9tR6pHafRfFIfKlTXhun+NL0WWM/M0eb2IfPPYUa8+wg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-HcICm4YzFJZV+fI0O0bFLVVlsWvRNo/AB9EfUXvNYbtAxakCnQZ15oq22deFdz6sfi9Y4/SagH2kPU723dhCFA==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': + resolution: {integrity: sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': - resolution: {integrity: sha512-4Qx6cgEPXLb0XsCyLoQcUgYBpfL0sjugftob+zhUH0EOk/NVCAIT+h0NJhY+jn7pFpeKxhNMqhvTNx3AesxIAQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': + resolution: {integrity: sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.38': - resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@rolldown/pluginutils@1.0.0-beta.58': + resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} - cpu: [arm] - os: [android] + '@rolldown/pluginutils@1.0.0-rc.4': + resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} - '@rollup/rollup-android-arm-eabi@4.52.3': - resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.52.3': - resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-arm64@4.52.3': - resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.52.3': - resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-arm64@4.52.3': - resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.3': - resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.52.3': - resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.3': - resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.52.3': - resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.3': - resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.52.3': - resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.3': - resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.52.3': - resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.3': - resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.52.3': - resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.3': - resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.52.3': - resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} - cpu: [x64] - os: [linux] + os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.52.3': - resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-arm64-msvc@4.52.3': - resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.3': - resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.52.3': - resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.3': - resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] - '@schematics/angular@20.3.3': - resolution: {integrity: sha512-lqIP1pNKp8yaqd663R3graZWaTBjXH+Cl72BQl1Ghl7lFGReZJALr4GiSMiBR9r30Epklcw5TwOSi+Bs4UKmbw==} + '@schematics/angular@21.2.2': + resolution: {integrity: sha512-Ywa6HDtX7TRBQZTVMMnxX3Mk7yVnG8KtSFaXWrkx779+q8tqYdBwNwAqbNd4Zatr1GccKaz9xcptHJta5+DTxw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@sigstore/bundle@3.1.0': - resolution: {integrity: sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@2.0.0': - resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/core@3.1.0': + resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.4.3': - resolution: {integrity: sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==} + '@sigstore/protobuf-specs@0.5.0': + resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/sign@3.1.0': - resolution: {integrity: sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/sign@4.1.0': + resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/tuf@3.1.1': - resolution: {integrity: sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/tuf@4.0.1': + resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/verify@2.1.1': - resolution: {integrity: sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/verify@3.1.0': + resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@sinonjs/fake-timers@15.1.1': + resolution: {integrity: sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@tsconfig/node10@1.0.9': resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -2938,9 +2958,9 @@ packages: resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} - '@tufjs/models@3.0.1': - resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@tufjs/models@4.1.0': + resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} + engines: {node: ^20.17.0 || >=22.9.0} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2975,26 +2995,23 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + '@types/express-serve-static-core@4.19.8': + resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/http-proxy@1.17.16': - resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -3008,9 +3025,6 @@ packages: '@types/jest@30.0.0': resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} @@ -3020,11 +3034,11 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@24.6.1': - resolution: {integrity: sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==} + '@types/node@25.4.0': + resolution: {integrity: sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -3035,14 +3049,17 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} '@types/serve-index@1.9.4': resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -3059,66 +3076,66 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.45.0': - resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} + '@typescript-eslint/eslint-plugin@8.57.0': + resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.45.0 - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/parser': ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.45.0': - resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} + '@typescript-eslint/parser@8.57.0': + resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.45.0': - resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} + '@typescript-eslint/project-service@8.57.0': + resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.45.0': - resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} + '@typescript-eslint/scope-manager@8.57.0': + resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.45.0': - resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} + '@typescript-eslint/tsconfig-utils@8.57.0': + resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.45.0': - resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} + '@typescript-eslint/type-utils@8.57.0': + resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.45.0': - resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} + '@typescript-eslint/types@8.57.0': + resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.45.0': - resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} + '@typescript-eslint/typescript-estree@8.57.0': + resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.45.0': - resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} + '@typescript-eslint/utils@8.57.0': + resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.45.0': - resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} + '@typescript-eslint/visitor-keys@8.57.0': + resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3219,14 +3236,14 @@ packages: cpu: [x64] os: [win32] - '@vitejs/plugin-basic-ssl@2.0.0': - resolution: {integrity: sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==} + '@vitejs/plugin-basic-ssl@2.1.0': + resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - vite: ^6.0.0 + vite: ^6.0.0 || ^7.0.0 - '@vitejs/plugin-basic-ssl@2.1.0': - resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} + '@vitejs/plugin-basic-ssl@2.1.4': + resolution: {integrity: sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: vite: ^6.0.0 || ^7.0.0 @@ -3285,13 +3302,9 @@ packages: '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abbrev@3.0.1: - resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} - engines: {node: ^18.17.0 || >=20.5.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -3301,9 +3314,6 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -3324,8 +3334,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -3333,10 +3343,6 @@ packages: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -3362,14 +3368,17 @@ packages: peerDependencies: ajv: ^8.8.2 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.35.0: - resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + algoliasearch@5.48.1: + resolution: {integrity: sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -3380,8 +3389,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.1.1: - resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} ansi-html-community@0.0.8: @@ -3409,10 +3418,6 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} - engines: {node: '>=14'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3433,11 +3438,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + autoprefixer@10.4.23: + resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -3447,8 +3449,8 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-jest@30.2.0: - resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + babel-jest@30.3.0: + resolution: {integrity: sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-0 @@ -3464,22 +3466,22 @@ packages: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} - babel-plugin-jest-hoist@30.2.0: - resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + babel-plugin-jest-hoist@30.3.0: + resolution: {integrity: sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -3488,8 +3490,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@30.2.0: - resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + babel-preset-jest@30.3.0: + resolution: {integrity: sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-beta.1 @@ -3497,24 +3499,29 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.10: - resolution: {integrity: sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==} + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} hasBin: true batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - beasties@0.3.4: - resolution: {integrity: sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw==} - engines: {node: '>=14.0.0'} - beasties@0.3.5: resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} engines: {node: '>=14.0.0'} + beasties@0.4.1: + resolution: {integrity: sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==} + engines: {node: '>=18.0.0'} + before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -3528,12 +3535,12 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} bonjour-service@1.3.0: @@ -3553,12 +3560,16 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3583,9 +3594,9 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cacache@19.0.1: - resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} - engines: {node: ^18.17.0 || >=20.5.0} + cacache@20.0.3: + resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} + engines: {node: ^20.17.0 || >=22.9.0} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -3607,8 +3618,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001746: - resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} + caniuse-lite@1.0.30001775: + resolution: {integrity: sha512-s3Qv7Lht9zbVKE9XoTyRG6wVDCKdtOFIjBGg3+Yhn6JaytuNKPIjBMTMIY1AnOH3seL5mvF+x33oGAyK3hVt3A==} canvas@3.0.0: resolution: {integrity: sha512-NtcIBY88FjymQy+g2g5qnuP5IslrbWCQ3A6rSr1PeuYxVRapRZ3BZCrDyAakvI6CuDYidgZaf55ygulFVwROdg==} @@ -3626,8 +3637,8 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -3637,13 +3648,13 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -3652,28 +3663,24 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cjs-module-lexer@2.1.0: - resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} @@ -3695,8 +3702,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3708,10 +3715,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3719,8 +3722,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -3734,9 +3737,9 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} @@ -3748,17 +3751,13 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -3766,20 +3765,20 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - copy-webpack-plugin@13.0.0: - resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} + copy-webpack-plugin@13.0.1: + resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 - core-js-compat@3.43.0: - resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} cosmiconfig@9.0.0: @@ -3810,16 +3809,9 @@ packages: webpack: optional: true - css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-select@6.0.0: resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - css-what@7.0.0: resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} engines: {node: '>= 6'} @@ -3829,24 +3821,10 @@ packages: engines: {node: '>=4'} hasBin: true - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -3879,8 +3857,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -3898,22 +3876,18 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} engines: {node: '>=18'} define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -3929,13 +3903,8 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - - detect-libc@2.1.1: - resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -3963,11 +3932,6 @@ packages: domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -3985,15 +3949,15 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.228: - resolution: {integrity: sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==} + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4005,22 +3969,15 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -4031,6 +3988,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -4057,35 +4018,30 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild-wasm@0.25.10: - resolution: {integrity: sha512-IyyfrTA2iiOh/uhlaJj0aUDgW42lFhr29ZeKouVNOz/8mLyuqWbEuVst+B4RBH18pb3AcOHnaOgyskAbsVOe3A==} - engines: {node: '>=18'} - hasBin: true - - esbuild-wasm@0.25.5: - resolution: {integrity: sha512-V/rbdOws2gDcnCAECfPrajhuafI0WY4WumUgc8ZHwOLnvmM0doLQ+dqvVFI2qkVxQsvo6880aC9IjpyDqcwwTw==} + esbuild-wasm@0.27.2: + resolution: {integrity: sha512-eUTnl8eh+v8UZIZh4MrMOKDAc8Lm7+NqP3pyuTORGFY1s/o9WoiJgKnwXy+te2J3hX7iRbFSHEyig7GsPeeJyw==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild-wasm@0.27.3: + resolution: {integrity: sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true @@ -4104,30 +4060,29 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.1: + resolution: {integrity: sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.36.0: - resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.0.3: + resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -4135,17 +4090,17 @@ packages: jiti: optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -4171,8 +4126,8 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -4202,34 +4157,30 @@ packages: resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + expect@30.3.0: + resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + express-rate-limit@8.2.1: + resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4239,9 +4190,6 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -4269,13 +4217,13 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -4293,11 +4241,11 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4309,16 +4257,12 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} @@ -4331,10 +4275,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs-minipass@3.0.3: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4363,8 +4303,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -4394,24 +4334,27 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} @@ -4420,9 +4363,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -4443,21 +4383,17 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hosted-git-info@8.1.0: - resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} - engines: {node: ^18.17.0 || >=20.5.0} + hono@4.12.3: + resolution: {integrity: sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==} + engines: {node: '>=16.9.0'} - hosted-git-info@9.0.0: - resolution: {integrity: sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==} + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} engines: {node: ^20.17.0 || >=22.9.0} hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -4465,8 +4401,8 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -4474,21 +4410,17 @@ packages: http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} http-parser-js@0.5.10: resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -4510,10 +4442,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -4534,8 +4462,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} icss-utils@5.1.0: @@ -4564,8 +4492,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - immutable@5.1.3: - resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -4584,29 +4512,30 @@ packages: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@5.0.0: - resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} - engines: {node: ^18.17.0 || >=20.5.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} ip-address@10.0.1: resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} is-arrayish@0.2.1: @@ -4633,10 +4562,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - is-fullwidth-code-point@5.1.0: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} @@ -4649,6 +4574,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -4658,8 +4587,8 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} engines: {node: '>=16'} is-number@7.0.0: @@ -4688,10 +4617,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -4709,9 +4634,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -4740,16 +4665,16 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@30.2.0: - resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + jest-changed-files@30.3.0: + resolution: {integrity: sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.2.0: - resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + jest-circus@30.3.0: + resolution: {integrity: sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.2.0: - resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + jest-cli@30.3.0: + resolution: {integrity: sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -4758,8 +4683,8 @@ packages: node-notifier: optional: true - jest-config@30.2.0: - resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + jest-config@30.3.0: + resolution: {integrity: sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -4781,29 +4706,20 @@ packages: resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + jest-diff@30.3.0: + resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-docblock@30.2.0: resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.2.0: - resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + jest-each@30.3.0: + resolution: {integrity: sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-jsdom@30.2.0: - resolution: {integrity: sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==} + jest-environment-jsdom@30.3.0: + resolution: {integrity: sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -4811,38 +4727,34 @@ packages: canvas: optional: true - jest-environment-node@30.2.0: - resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + jest-environment-node@30.3.0: + resolution: {integrity: sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.2.0: - resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + jest-haste-map@30.3.0: + resolution: {integrity: sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-junit@16.0.0: resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} engines: {node: '>=10.12.0'} - jest-leak-detector@30.2.0: - resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + jest-leak-detector@30.3.0: + resolution: {integrity: sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@30.0.5: resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + jest-matcher-utils@30.3.0: + resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-message-util@30.0.5: resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4851,9 +4763,9 @@ packages: resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.3.0: + resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock@30.0.5: resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} @@ -4863,6 +4775,10 @@ packages: resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.3.0: + resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -4872,28 +4788,14 @@ packages: jest-resolve: optional: true - jest-preset-angular@14.6.0: - resolution: {integrity: sha512-LGSKLCsUhtrs2dw6f7ega/HOS8/Ni/1gV+oXmxPHmJDLHFpM6cI78Monmz8Z1P87a/A4OwnKilxgPRr+6Pzmgg==} - engines: {node: ^14.15.0 || >=16.10.0} - peerDependencies: - '@angular/compiler-cli': '>=15.0.0 <21.0.0' - '@angular/core': '>=15.0.0 <21.0.0' - '@angular/platform-browser-dynamic': '>=15.0.0 <21.0.0' - jest: ^29.0.0 - jsdom: '>=20.0.0' - typescript: '>=4.8' - peerDependenciesMeta: - jsdom: - optional: true - - jest-preset-angular@15.0.2: - resolution: {integrity: sha512-XQNKL2BQllWF+eeiLuooMnL23IJ2s7yg7YfX52KhUMmwCTD0HlrU5RLzAgbP7xrsplsGWFlQwCe2kTJss/q0UQ==} + jest-preset-angular@16.1.1: + resolution: {integrity: sha512-yrvV/86IO2mj3H33xWVEPwmLW9CJIOM7YcMBcwDWa9OXEAW9XM+47no8R06oine9+wH+QWXfFzFR3TG6nX7QRA==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} peerDependencies: - '@angular/compiler-cli': '>=18.0.0 <21.0.0' - '@angular/core': '>=18.0.0 <21.0.0' - '@angular/platform-browser': '>=18.0.0 <21.0.0' - '@angular/platform-browser-dynamic': '>=18.0.0 <21.0.0' + '@angular/compiler-cli': '>=19.0.0 <22.0.0' + '@angular/core': '>=19.0.0 <22.0.0' + '@angular/platform-browser': '>=19.0.0 <22.0.0' + '@angular/platform-browser-dynamic': '>=19.0.0 <22.0.0' jest: ^30.0.0 jsdom: '>=26.0.0' typescript: '>=5.5' @@ -4902,30 +4804,26 @@ packages: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.2.0: - resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + jest-resolve-dependencies@30.3.0: + resolution: {integrity: sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.2.0: - resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + jest-resolve@30.3.0: + resolution: {integrity: sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.2.0: - resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + jest-runner@30.3.0: + resolution: {integrity: sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.2.0: - resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + jest-runtime@30.3.0: + resolution: {integrity: sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.2.0: - resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + jest-snapshot@30.3.0: + resolution: {integrity: sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@30.0.5: resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4934,12 +4832,16 @@ packages: resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.2.0: - resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + jest-util@30.3.0: + resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.3.0: + resolution: {integrity: sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.2.0: - resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + jest-watcher@30.3.0: + resolution: {integrity: sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-websocket-mock@2.5.0: @@ -4949,12 +4851,12 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@30.2.0: - resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + jest-worker@30.3.0: + resolution: {integrity: sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.2.0: - resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + jest@30.3.0: + resolution: {integrity: sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -4963,30 +4865,24 @@ packages: node-notifier: optional: true - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - jsdom@26.1.0: resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} @@ -4996,11 +4892,6 @@ packages: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5012,9 +4903,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-parse-even-better-errors@4.0.0: - resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} - engines: {node: ^18.17.0 || >=20.5.0} + json-parse-even-better-errors@5.0.0: + resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} + engines: {node: ^20.17.0 || >=22.9.0} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -5022,6 +4913,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -5047,8 +4941,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - launch-editor@2.10.0: - resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} less-loader@12.3.0: resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} @@ -5063,8 +4957,8 @@ packages: webpack: optional: true - less@4.3.0: - resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + less@4.4.2: + resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} engines: {node: '>=14'} hasBin: true @@ -5087,24 +4981,20 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} - - listr2@9.0.1: - resolution: {integrity: sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==} + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} - lmdb@3.3.0: - resolution: {integrity: sha512-MgJocUI6QEiSXQBFWLeyo1R7eQj8Rke5dlPxX0KFwli8/bsCxpM/KbXO5y0qmV/5llQ3wpneDWcTYxa+4vn8iQ==} + lmdb@3.4.4: + resolution: {integrity: sha512-+Y2DqovevLkb6DrSQ6SXTYLEd6kvlRbhsxzgJrk7BUfOVA/mt21ak6pFDZDKxiAczHMWxrb02kXBTSTIA0O94A==} hasBin: true - lmdb@3.4.2: - resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==} + lmdb@3.5.1: + resolution: {integrity: sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==} hasBin: true - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -5132,14 +5022,11 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} log-update@6.1.0: @@ -5149,15 +5036,19 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -5170,9 +5061,9 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@14.0.3: - resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} - engines: {node: ^18.17.0 || >=20.5.0} + make-fetch-happen@15.0.4: + resolution: {integrity: sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==} + engines: {node: ^20.17.0 || >=22.9.0} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -5192,9 +5083,10 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memfs@4.17.2: - resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} - engines: {node: '>= 4.0.0'} + memfs@4.56.10: + resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} + peerDependencies: + tslib: '2' merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -5206,10 +5098,6 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -5233,9 +5121,9 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -5258,8 +5146,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + mini-css-extract-plugin@2.9.4: + resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -5267,15 +5155,15 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -5285,9 +5173,9 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@4.0.1: - resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} - engines: {node: ^18.17.0 || >=20.5.0} + minipass-fetch@5.0.2: + resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} + engines: {node: ^20.17.0 || >=22.9.0} minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} @@ -5297,26 +5185,18 @@ packages: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + minipass-sized@2.0.0: + resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==} engines: {node: '>=8'} minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} @@ -5347,8 +5227,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.5: - resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} + msgpackr@1.11.8: + resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} @@ -5363,11 +5243,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-postinstall@0.3.3: - resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -5394,9 +5274,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - ng2-pdf-viewer@10.4.0: - resolution: {integrity: sha512-TPh1oLZoeARggreTG60Sl3ikSn+Z3+At9pLZ0o/vxPjc7mW2ok2XPyl2Oqz7VyP80ipVorldm1hsLPBmNe2zzA==} - ngx-bootstrap-icons@1.9.3: resolution: {integrity: sha512-UsFqJ/cn0u5W39hVMIDbm+ze1dCF9fDV839scqeimi70Efcmg41zOx6GgR6i2gWAVFR0OBso1cdqb4E75XhTSw==} engines: {node: '>= 16.18.1', npm: '>= 8.11.0'} @@ -5410,35 +5287,35 @@ packages: '@angular/common': '>=19.0.0-0' '@angular/core': '>=19.0.0-0' - ngx-cookie-service@20.1.0: - resolution: {integrity: sha512-g7Ddq8097qujmJfoEK27H12KLEpuO4SBPhoOYQ2kmLMSvz65vRrSKVwzOxdc75cFLQPW45Jfyyg3LoMTjKW0uA==} + ngx-cookie-service@21.1.0: + resolution: {integrity: sha512-W3IsoMImUVNt0ZuMesEuQJUGrEgKJaPkQGGfCg7zjUGM/EaeAIbIkfNktNIgUDmeUYapZQJa2pSg4YuK4v1gVQ==} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 + '@angular/common': ^21.0.0 + '@angular/core': ^21.0.0 - ngx-device-detector@10.1.0: - resolution: {integrity: sha512-+MrJReetLq9Flp/IoncJYvmnOP8X6vEFK/qR+2PghoqUXwDlyNjh8ujX/nx2SK/5khK2Yr0bj7ICowhXjhgC/w==} + ngx-device-detector@11.0.0: + resolution: {integrity: sha512-vQ07MpUvVKgxGMPmNvbZ9mUcgH4cH0KMVCj9skMOciPh4sBUKNsorWE/FUs2eSYiLbtu7oq1JcPMcRuEWZ1rug==} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 + '@angular/common': ^21.0.0 + '@angular/core': ^21.0.0 - ngx-ui-tour-core@15.0.0: - resolution: {integrity: sha512-ECFU+aELgXpltveC7rtoQn72bzhmQB/bpqPUcfr2G+WjT2nUPMsbRRDbK5RfngslM0cNl5JJ1N0Z/KR39FJ7oA==} + ngx-ui-tour-core@16.0.0: + resolution: {integrity: sha512-pfIUsYwZ0x5hHZTewxHT8V/mOFUnXLM8w+3m0UlYvH0ikFMtY8WaDK4YGnAyf4ASPEx/14jtgU5VyEf9aTgcJA==} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/router': ^20.0.0 + '@angular/common': ^21.1.0 + '@angular/core': ^21.1.0 + '@angular/router': ^21.1.0 rxjs: ^7.4.0 - ngx-ui-tour-ng-bootstrap@17.0.1: - resolution: {integrity: sha512-JgKiMnYHuvTDQfo0XknRiSvyZZWGsyYyD5z7J5SEerQ4K6jp1RDrQYlkSvSN30qUKJ0WrO1QTEZ4hoIElrr7gQ==} + ngx-ui-tour-ng-bootstrap@18.0.0: + resolution: {integrity: sha512-2yfpyRPRnxXd407yI8uU1MpZr4430JbDIgR7aRVsE7QGrC4FiRtYQdGAQx+gf/iazcpWTxK4mK9oouJB3M/acQ==} peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 - '@ng-bootstrap/ng-bootstrap': ^19.0.0 + '@angular/common': ^21.1.0 + '@angular/core': ^21.1.0 + '@ng-bootstrap/ng-bootstrap': ^20.0.0 - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + node-abi@3.89.0: + resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -5447,69 +5324,64 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-gyp@11.4.2: - resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==} - engines: {node: ^18.17.0 || >=20.5.0} + node-gyp@12.2.0: + resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-readable-to-web-readable-stream@0.4.2: + resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==} - nopt@8.1.0: - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} - engines: {node: ^18.17.0 || >=20.5.0} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-bundled@4.0.0: - resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} - engines: {node: ^18.17.0 || >=20.5.0} - - npm-install-checks@7.1.2: - resolution: {integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-bundled@5.0.0: + resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-normalize-package-bin@4.0.0: - resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-package-arg@12.0.2: - resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-package-arg@13.0.0: - resolution: {integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==} + npm-package-arg@13.0.2: + resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} engines: {node: ^20.17.0 || >=22.9.0} - npm-packlist@10.0.2: - resolution: {integrity: sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==} + npm-packlist@10.0.4: + resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==} engines: {node: ^20.17.0 || >=22.9.0} - npm-pick-manifest@10.0.0: - resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-registry-fetch@18.0.2: - resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-registry-fetch@19.1.1: + resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} + engines: {node: ^20.17.0 || >=22.9.0} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -5518,8 +5390,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.22: - resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -5536,8 +5408,8 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} once@1.4.0: @@ -5551,20 +5423,28 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - open@10.1.2: - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} + + ora@9.3.0: + resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} + engines: {node: '>=20'} - ordered-binary@1.6.0: - resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} + ordered-binary@1.6.1: + resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -5582,8 +5462,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} p-retry@6.2.1: @@ -5597,8 +5477,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pacote@21.0.0: - resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==} + pacote@21.3.1: + resolution: {integrity: sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -5617,15 +5497,9 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} - parse5-html-rewriting-stream@7.1.0: - resolution: {integrity: sha512-2ifK6Jb+ONoqOy5f+cYHsqvx1obHQdvIk13Jmt/5ezxP0U9p+fqd+R6O73KblGswyuzBYfetmsfK9ThMgnuPPg==} - parse5-html-rewriting-stream@8.0.0: resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} - parse5-sax-parser@7.0.0: - resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} - parse5-sax-parser@8.0.0: resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} @@ -5658,19 +5532,19 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - path2d@0.2.2: - resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==} - engines: {node: '>=6'} - - pdfjs-dist@4.8.69: - resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} - engines: {node: '>=18'} + pdfjs-dist@5.4.624: + resolution: {integrity: sha512-sm6TxKTtWv1Oh6n3C6J6a8odejb5uO4A4zo/2dgkHuC0iu8ZMAXOezEODkVaoVp8nX1Xzr+0WxFJJmUr45hQzg==} + engines: {node: '>=20.16.0 || >=22.3.0'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -5679,10 +5553,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -5695,34 +5565,30 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - piscina@5.1.1: - resolution: {integrity: sha512-9rPDIPsCwOivatEZGM8+apgM7AiTDLSnpwMmLaSmdm2PeND8bFJzZLZZxyrJjLH8Xx/MpKoVaKf+vZOWALNHbw==} - engines: {node: '>=20.x'} - - piscina@5.1.3: - resolution: {integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==} + piscina@5.1.4: + resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} engines: {node: '>=20.x'} - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.55.1: - resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} engines: {node: '>=18'} hasBin: true - playwright@1.55.1: - resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==} + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} engines: {node: '>=18'} hasBin: true - postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + postcss-loader@8.2.0: + resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -5761,24 +5627,31 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true prelude-ls@1.2.1: @@ -5812,9 +5685,13 @@ packages: resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - proc-log@5.0.0: - resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} - engines: {node: ^18.17.0 || >=20.5.0} + pretty-format@30.3.0: + resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5830,11 +5707,8 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -5843,20 +5717,14 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.15.0: + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -5864,12 +5732,12 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} - raw-body@3.0.1: - resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} rc@1.2.8: @@ -5894,11 +5762,15 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} regenerate@1.4.2: @@ -5907,15 +5779,15 @@ packages: regex-parser@2.3.1: resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true require-directory@2.1.1: @@ -5945,8 +5817,8 @@ packages: resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} engines: {node: '>=12'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -5962,25 +5834,21 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.0-beta.38: - resolution: {integrity: sha512-58frPNX55Je1YsyrtPJv9rOSR3G5efUZpRqok94Efsj0EUa8dnqJV3BldShyI7A+bVPleucOtzXHwVpJRcR0kQ==} + rolldown@1.0.0-beta.58: + resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.4: + resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.52.3: - resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5991,13 +5859,10 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -6010,8 +5875,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass-loader@16.0.5: - resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} + sass-loader@16.0.6: + resolution: {integrity: sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -6031,25 +5896,26 @@ packages: webpack: optional: true - sass@1.88.0: - resolution: {integrity: sha512-sF6TWQqjFvr4JILXzG4ucGOLELkESHL+I5QJhh7CNaE+Yge0SI+ehCatsXhJ7ymU1hAFcIS3/PBpjdIbXoyVbg==} + sass@1.97.1: + resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} engines: {node: '>=14.0.0'} hasBin: true - sass@1.90.0: - resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} engines: {node: '>=14.0.0'} hasBin: true - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} select-hose@2.0.0: @@ -6067,37 +5933,39 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + serve-index@1.9.2: + resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} engines: {node: '>= 0.8.0'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -6140,9 +6008,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@3.1.0: - resolution: {integrity: sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==} - engines: {node: ^18.17.0 || >=20.5.0} + sigstore@4.1.0: + resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} + engines: {node: ^20.17.0 || >=22.9.0} simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -6157,14 +6025,14 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -6200,25 +6068,18 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -6230,9 +6091,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - ssri@12.0.0: - resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} - engines: {node: ^18.17.0 || >=20.5.0} + ssri@13.0.1: + resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} + engines: {node: ^20.17.0 || >=22.9.0} stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} @@ -6242,10 +6103,6 @@ packages: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -6254,6 +6111,10 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + stdin-discarder@0.3.1: + resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + engines: {node: '>=18'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -6270,6 +6131,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -6284,6 +6149,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -6319,31 +6188,27 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - tar@7.5.1: - resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + tar@7.5.9: + resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} engines: {node: '>=18'} - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -6358,13 +6223,13 @@ packages: uglify-js: optional: true - terser@5.39.1: - resolution: {integrity: sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==} + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true - terser@5.44.0: - resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true @@ -6372,8 +6237,8 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -6381,14 +6246,6 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -6411,24 +6268,16 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - tree-dump@1.0.3: - resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6437,14 +6286,14 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.4: - resolution: {integrity: sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==} + ts-jest@29.4.6: + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6491,9 +6340,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tuf-js@3.1.0: - resolution: {integrity: sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==} - engines: {node: ^18.17.0 || >=20.5.0} + tuf-js@4.1.0: + resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} + engines: {node: ^20.17.0 || >=22.9.0} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -6529,8 +6378,8 @@ packages: typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -6539,13 +6388,21 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undici-types@7.13.0: - resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} + undici@7.18.2: + resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} + engines: {node: '>=20.18.1'} + + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -6554,29 +6411,25 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unique-filename@4.0.0: - resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} - engines: {node: ^18.17.0 || >=20.5.0} + unique-filename@5.0.0: + resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} + engines: {node: ^20.17.0 || >=22.9.0} - unique-slug@5.0.0: - resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} - engines: {node: ^18.17.0 || >=20.5.0} + unique-slug@6.0.0: + resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} + engines: {node: ^20.17.0 || >=22.9.0} universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -6588,8 +6441,8 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -6597,9 +6450,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - utif@3.1.0: resolution: {integrity: sha512-WEo4D/xOvFW53K5f5QTaTbbiORcm2/pCL9P6qmJnup+17eYfKaEhDeX9PeQkuyEoIxlbGklDuGl8xwuXYMrrXQ==} @@ -6625,30 +6475,27 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validate-npm-package-name@6.0.2: - resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} - engines: {node: ^18.17.0 || >=20.5.0} + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -6676,8 +6523,8 @@ packages: yaml: optional: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -6716,10 +6563,6 @@ packages: yaml: optional: true - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -6727,12 +6570,12 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} engines: {node: '>=10.13.0'} - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -6745,8 +6588,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.0.0 @@ -6754,8 +6597,8 @@ packages: webpack: optional: true - webpack-dev-server@5.2.1: - resolution: {integrity: sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==} + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: @@ -6771,8 +6614,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + webpack-sources@3.3.4: + resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -6788,8 +6631,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.102.0: - resolution: {integrity: sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==} + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -6798,8 +6641,8 @@ packages: webpack-cli: optional: true - webpack@5.99.8: - resolution: {integrity: sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==} + webpack@5.105.3: + resolution: {integrity: sha512-LLBBA4oLmT7sZdHiYE/PeVuifOxYyE2uL/V+9VQP7YSYdJU7bSf7H8bZRRxW8kEPMkmVjnrXmoR3oejIdX0xbg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -6816,26 +6659,15 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - whatwg-url@14.2.0: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} @@ -6845,9 +6677,9 @@ packages: engines: {node: '>= 8'} hasBin: true - which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} - engines: {node: ^18.17.0 || >=20.5.0} + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true wildcard@2.0.1: @@ -6883,8 +6715,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6895,9 +6727,13 @@ packages: utf-8-validate: optional: true - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} @@ -6956,16 +6792,23 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - zod-to-json-schema@3.24.6: - resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.24.1 + zod: ^3.25 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zone.js@0.15.1: - resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + + zone.js@0.16.1: + resolution: {integrity: sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==} snapshots: @@ -6995,99 +6838,99 @@ snapshots: '@actions/io@1.1.3': {} - '@algolia/abtesting@1.1.0': + '@algolia/abtesting@1.14.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-abtesting@5.35.0': + '@algolia/client-abtesting@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-analytics@5.35.0': + '@algolia/client-analytics@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-common@5.35.0': {} + '@algolia/client-common@5.48.1': {} - '@algolia/client-insights@5.35.0': + '@algolia/client-insights@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-personalization@5.35.0': + '@algolia/client-personalization@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-query-suggestions@5.35.0': + '@algolia/client-query-suggestions@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/client-search@5.35.0': + '@algolia/client-search@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/ingestion@1.35.0': + '@algolia/ingestion@1.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/monitoring@1.35.0': + '@algolia/monitoring@1.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/recommend@5.35.0': + '@algolia/recommend@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + '@algolia/client-common': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 - '@algolia/requester-browser-xhr@5.35.0': + '@algolia/requester-browser-xhr@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 + '@algolia/client-common': 5.48.1 - '@algolia/requester-fetch@5.35.0': + '@algolia/requester-fetch@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 + '@algolia/client-common': 5.48.1 - '@algolia/requester-node-http@5.35.0': + '@algolia/requester-node-http@5.48.1': dependencies: - '@algolia/client-common': 5.35.0 + '@algolia/client-common': 5.48.1 '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular-builders/common@4.0.0(@types/node@24.6.1)(chokidar@4.0.3)(typescript@5.8.3)': + '@angular-builders/common@5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - ts-node: 10.9.2(@types/node@24.6.1)(typescript@5.8.3) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: - '@swc/core' @@ -7096,15 +6939,15 @@ snapshots: - chokidar - typescript - '@angular-builders/custom-webpack@20.0.0(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))(yaml@2.7.0)': + '@angular-builders/custom-webpack@21.0.3(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: - '@angular-builders/common': 4.0.0(@types/node@24.6.1)(chokidar@4.0.3)(typescript@5.8.3) - '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) - '@angular-devkit/build-angular': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jiti@1.21.7)(typescript@5.8.3)(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))(yaml@2.7.0) - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - '@angular/build': 20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0) - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - lodash: 4.17.21 + '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/build': 21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + lodash: 4.17.23 webpack-merge: 6.0.1 transitivePeerDependencies: - '@angular/compiler' @@ -7145,24 +6988,24 @@ snapshots: - typescript - uglify-js - utf-8-validate - - vite - vitest - webpack-cli - yaml - '@angular-builders/jest@20.0.0(617e23274585616dcf62fd78c9140eac)': - dependencies: - '@angular-builders/common': 4.0.0(@types/node@24.6.1)(chokidar@4.0.3)(typescript@5.8.3) - '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) - '@angular-devkit/build-angular': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jiti@1.21.7)(typescript@5.8.3)(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))(yaml@2.7.0) - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser-dynamic': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))) - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - jest-preset-angular: 14.6.0(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser-dynamic@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))))(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(canvas@3.0.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jsdom@26.1.0(canvas@3.0.0))(typescript@5.8.3) - lodash: 4.17.21 + '@angular-builders/jest@21.0.3(e6176eac41f0cffc5e05b8a4d945a538)': + dependencies: + '@angular-builders/common': 5.0.3(@types/node@25.4.0)(chokidar@5.0.0)(typescript@5.9.3) + '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) + '@angular-devkit/build-angular': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-preset-angular: 16.1.1(135ea37d5312db3eeddee262c6eb1d13) + lodash: 4.17.23 transitivePeerDependencies: + - '@angular/platform-browser' - '@babel/core' - '@jest/transform' - '@jest/types' @@ -7170,94 +7013,97 @@ snapshots: - '@swc/wasm' - '@types/node' - babel-jest - - bufferutil - canvas - chokidar - jsdom - - supports-color - typescript - - utf-8-validate - '@angular-devkit/architect@0.2000.4(chokidar@4.0.3)': + '@angular-devkit/architect@0.2101.2(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 21.1.2(chokidar@5.0.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/architect@0.2102.0(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 20.0.4(chokidar@4.0.3) + '@angular-devkit/core': 21.2.0(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/architect@0.2003.3(chokidar@4.0.3)': + '@angular-devkit/architect@0.2102.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jest-environment-jsdom@30.2.0(canvas@3.0.0))(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jiti@1.21.7)(typescript@5.8.3)(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))(yaml@2.7.0)': + '@angular-devkit/build-angular@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jest-environment-jsdom@30.3.0(canvas@3.0.0))(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(jiti@2.6.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.0))(webpack@5.99.8(esbuild@0.25.5)) - '@angular-devkit/core': 20.0.4(chokidar@4.0.3) - '@angular/build': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0) - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@babel/core': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 + '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) + '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2)) + '@angular-devkit/core': 21.1.2(chokidar@5.0.0) + '@angular/build': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-runtime': 7.27.1(@babel/core@7.27.1) - '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/runtime': 7.27.1 + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) + '@babel/preset-env': 7.28.5(@babel/core@7.28.5) + '@babel/runtime': 7.28.4 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5)) - '@vitejs/plugin-basic-ssl': 2.0.0(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0)) + '@ngtools/webpack': 21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) ansi-colors: 4.1.3 - autoprefixer: 10.4.21(postcss@8.5.3) - babel-loader: 10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5)) - browserslist: 4.26.3 - copy-webpack-plugin: 13.0.0(webpack@5.99.8(esbuild@0.25.5)) - css-loader: 7.1.2(webpack@5.99.8(esbuild@0.25.5)) - esbuild-wasm: 0.25.5 - fast-glob: 3.3.3 + autoprefixer: 10.4.23(postcss@8.5.6) + babel-loader: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)) + browserslist: 4.28.1 + copy-webpack-plugin: 13.0.1(webpack@5.104.1(esbuild@0.27.2)) + css-loader: 7.1.2(webpack@5.104.1(esbuild@0.27.2)) + esbuild-wasm: 0.27.2 http-proxy-middleware: 3.0.5 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 - less: 4.3.0 - less-loader: 12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.5)) - license-webpack-plugin: 4.0.2(webpack@5.99.8(esbuild@0.25.5)) + less: 4.4.2 + less-loader: 12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)) + license-webpack-plugin: 4.0.2(webpack@5.104.1(esbuild@0.27.2)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.9.2(webpack@5.99.8(esbuild@0.25.5)) - open: 10.1.2 - ora: 8.2.0 - picomatch: 4.0.2 - piscina: 5.1.1 - postcss: 8.5.3 - postcss-loader: 8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5)) + mini-css-extract-plugin: 2.9.4(webpack@5.104.1(esbuild@0.27.2)) + open: 11.0.0 + ora: 9.0.0 + picomatch: 4.0.3 + piscina: 5.1.4 + postcss: 8.5.6 + postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 - sass: 1.88.0 - sass-loader: 16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.5)) - semver: 7.7.2 - source-map-loader: 5.0.0(webpack@5.99.8(esbuild@0.25.5)) + sass: 1.97.1 + sass-loader: 16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)) + semver: 7.7.3 + source-map-loader: 5.0.0(webpack@5.104.1(esbuild@0.27.2)) source-map-support: 0.5.21 - terser: 5.39.1 + terser: 5.44.1 + tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 - typescript: 5.8.3 - webpack: 5.99.8(esbuild@0.25.5) - webpack-dev-middleware: 7.4.2(webpack@5.99.8(esbuild@0.25.5)) - webpack-dev-server: 5.2.1(webpack@5.99.8(esbuild@0.25.5)) + typescript: 5.9.3 + webpack: 5.104.1(esbuild@0.27.2) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) + webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.99.8(esbuild@0.25.5)) + webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) optionalDependencies: - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/localize': 20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) - esbuild: 0.25.5 - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - jest-environment-jsdom: 30.2.0(canvas@3.0.0) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + esbuild: 0.27.2 + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-environment-jsdom: 30.3.0(canvas@3.0.0) transitivePeerDependencies: - '@angular/compiler' - '@rspack/core' @@ -7277,92 +7123,104 @@ snapshots: - tsx - uglify-js - utf-8-validate - - vite - vitest - webpack-cli - yaml - '@angular-devkit/build-webpack@0.2000.4(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.102.0))(webpack@5.99.8(esbuild@0.25.5))': + '@angular-devkit/build-webpack@0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3))(webpack@5.104.1(esbuild@0.27.2))': dependencies: - '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) + '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) rxjs: 7.8.2 - webpack: 5.99.8(esbuild@0.25.5) - webpack-dev-server: 5.2.1(webpack@5.102.0) + webpack: 5.104.1(esbuild@0.27.2) + webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.105.3) transitivePeerDependencies: - chokidar - '@angular-devkit/core@20.0.4(chokidar@4.0.3)': + '@angular-devkit/core@21.1.2(chokidar@5.0.0)': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) jsonc-parser: 3.3.1 - picomatch: 4.0.2 + picomatch: 4.0.3 rxjs: 7.8.2 - source-map: 0.7.4 + source-map: 0.7.6 optionalDependencies: - chokidar: 4.0.3 + chokidar: 5.0.0 - '@angular-devkit/core@20.3.3(chokidar@4.0.3)': + '@angular-devkit/core@21.2.0(chokidar@5.0.0)': dependencies: - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) jsonc-parser: 3.3.1 picomatch: 4.0.3 rxjs: 7.8.2 source-map: 0.7.6 optionalDependencies: - chokidar: 4.0.3 + chokidar: 5.0.0 - '@angular-devkit/schematics@20.3.3(chokidar@4.0.3)': + '@angular-devkit/core@21.2.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) jsonc-parser: 3.3.1 - magic-string: 0.30.17 - ora: 8.2.0 + picomatch: 4.0.3 + rxjs: 7.8.2 + source-map: 0.7.6 + optionalDependencies: + chokidar: 5.0.0 + + '@angular-devkit/schematics@21.2.2(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + ora: 9.3.0 rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-eslint/builder@20.3.0(chokidar@4.0.3)(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/builder@21.3.0(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-devkit/architect': 0.2003.3(chokidar@4.0.3) - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - eslint: 9.36.0(jiti@1.21.7) - typescript: 5.8.3 + '@angular-devkit/architect': 0.2102.0(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) + eslint: 10.0.3(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - chokidar - '@angular-eslint/bundled-angular-compiler@20.3.0': {} + '@angular-eslint/bundled-angular-compiler@21.3.0': {} - '@angular-eslint/eslint-plugin-template@20.3.0(@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(@typescript-eslint/types@8.45.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/eslint-plugin-template@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 20.3.0 - '@angular-eslint/template-parser': 20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@angular-eslint/utils': 20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + '@angular-eslint/bundled-angular-compiler': 21.3.0 + '@angular-eslint/template-parser': 21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 9.36.0(jiti@1.21.7) - typescript: 5.8.3 + eslint: 10.0.3(jiti@2.6.1) + typescript: 5.9.3 - '@angular-eslint/eslint-plugin@20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/eslint-plugin@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 20.3.0 - '@angular-eslint/utils': 20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.36.0(jiti@1.21.7) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@angular-eslint/bundled-angular-compiler': 21.3.0 + '@angular-eslint/utils': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 - '@angular-eslint/schematics@20.3.0(@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(@typescript-eslint/types@8.45.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(chokidar@4.0.3)(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/schematics@21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - '@angular-devkit/schematics': 20.3.3(chokidar@4.0.3) - '@angular-eslint/eslint-plugin': 20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@angular-eslint/eslint-plugin-template': 20.3.0(@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(@typescript-eslint/types@8.45.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) + '@angular-eslint/eslint-plugin': 21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.3.0(@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/types@8.57.0)(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@angular/cli': 21.2.2(@types/node@25.4.0)(chokidar@5.0.0) ignore: 7.0.5 - semver: 7.7.2 + semver: 7.7.4 strip-json-comments: 3.1.1 transitivePeerDependencies: - '@angular-eslint/template-parser' @@ -7372,59 +7230,60 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@20.3.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/template-parser@21.3.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 20.3.0 - eslint: 9.36.0(jiti@1.21.7) - eslint-scope: 8.4.0 - typescript: 5.8.3 + '@angular-eslint/bundled-angular-compiler': 21.3.0 + eslint: 10.0.3(jiti@2.6.1) + eslint-scope: 9.1.1 + typescript: 5.9.3 - '@angular-eslint/utils@20.3.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@angular-eslint/utils@21.3.0(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@angular-eslint/bundled-angular-compiler': 20.3.0 - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - eslint: 9.36.0(jiti@1.21.7) - typescript: 5.8.3 + '@angular-eslint/bundled-angular-compiler': 21.3.0 + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) + typescript: 5.9.3 - '@angular/build@20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0)': + '@angular/build@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2000.4(chokidar@4.0.3) - '@angular/compiler': 20.3.2 - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 + '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.10(@types/node@24.6.1) - '@vitejs/plugin-basic-ssl': 2.0.0(vite@6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0)) - beasties: 0.3.4 - browserslist: 4.26.3 - esbuild: 0.25.5 + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0)) + beasties: 0.3.5 + browserslist: 4.28.1 + esbuild: 0.27.2 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 - listr2: 8.3.3 - magic-string: 0.30.17 + listr2: 9.0.5 + magic-string: 0.30.21 mrmime: 2.0.1 - parse5-html-rewriting-stream: 7.1.0 - picomatch: 4.0.2 - piscina: 5.1.1 - rollup: 4.40.2 - sass: 1.88.0 - semver: 7.7.2 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.4 + rolldown: 1.0.0-beta.58 + sass: 1.97.1 + semver: 7.7.3 source-map-support: 0.5.21 - tinyglobby: 0.2.13 + tinyglobby: 0.2.15 tslib: 2.8.1 - typescript: 5.8.3 - vite: 6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0) - watchpack: 2.4.2 + typescript: 5.9.3 + undici: 7.18.2 + vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) + watchpack: 2.5.0 optionalDependencies: - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/localize': 20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.3.0 - lmdb: 3.3.0 - postcss: 8.5.3 + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + less: 4.4.2 + lmdb: 3.4.4 + postcss: 8.5.6 transitivePeerDependencies: - '@types/node' - chokidar @@ -7438,45 +7297,46 @@ snapshots: - tsx - yaml - '@angular/build@20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@1.21.7)(less@4.3.0)(postcss@8.5.3)(terser@5.39.1)(tslib@2.8.1)(typescript@5.8.3)(yaml@2.7.0)': + '@angular/build@21.2.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(@types/node@25.4.0)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(terser@5.44.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.7.0)': dependencies: '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2003.3(chokidar@4.0.3) - '@angular/compiler': 20.3.2 - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@babel/core': 7.28.3 + '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.14(@types/node@24.6.1) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0)) - beasties: 0.3.5 - browserslist: 4.26.3 - esbuild: 0.25.9 + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0)) + beasties: 0.4.1 + browserslist: 4.28.1 + esbuild: 0.27.3 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 - listr2: 9.0.1 - magic-string: 0.30.17 + listr2: 9.0.5 + magic-string: 0.30.21 mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.3 - piscina: 5.1.3 - rolldown: 1.0.0-beta.38 - sass: 1.90.0 - semver: 7.7.2 + piscina: 5.1.4 + rolldown: 1.0.0-rc.4 + sass: 1.97.3 + semver: 7.7.4 source-map-support: 0.5.21 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tslib: 2.8.1 - typescript: 5.8.3 - vite: 7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0) - watchpack: 2.4.4 + typescript: 5.9.3 + undici: 7.22.0 + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) + watchpack: 2.5.1 optionalDependencies: - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/localize': 20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) - less: 4.3.0 - lmdb: 3.4.2 - postcss: 8.5.3 + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + less: 4.4.2 + lmdb: 3.5.1 + postcss: 8.5.6 transitivePeerDependencies: - '@types/node' - chokidar @@ -7490,111 +7350,114 @@ snapshots: - tsx - yaml - '@angular/cdk@20.2.6(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + '@angular/cdk@21.2.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) parse5: 8.0.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@20.3.3(@types/node@24.6.1)(chokidar@4.0.3)': + '@angular/cli@21.2.2(@types/node@25.4.0)(chokidar@5.0.0)': dependencies: - '@angular-devkit/architect': 0.2003.3(chokidar@4.0.3) - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - '@angular-devkit/schematics': 20.3.3(chokidar@4.0.3) - '@inquirer/prompts': 7.8.2(@types/node@24.6.1) - '@listr2/prompt-adapter-inquirer': 3.0.1(@inquirer/prompts@7.8.2(@types/node@24.6.1))(@types/node@24.6.1)(listr2@9.0.1) - '@modelcontextprotocol/sdk': 1.17.3 - '@schematics/angular': 20.3.3(chokidar@4.0.3) + '@angular-devkit/architect': 0.2102.2(chokidar@5.0.0) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) + '@inquirer/prompts': 7.10.1(@types/node@25.4.0) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5) + '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) + '@schematics/angular': 21.2.2(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 - algoliasearch: 5.35.0 - ini: 5.0.0 + algoliasearch: 5.48.1 + ini: 6.0.0 jsonc-parser: 3.3.1 - listr2: 9.0.1 - npm-package-arg: 13.0.0 - pacote: 21.0.0 - resolve: 1.22.10 - semver: 7.7.2 + listr2: 9.0.5 + npm-package-arg: 13.0.2 + pacote: 21.3.1 + parse5-html-rewriting-stream: 8.0.0 + semver: 7.7.4 yargs: 18.0.0 - zod: 3.25.76 + zod: 4.3.6 transitivePeerDependencies: + - '@cfworker/json-schema' - '@types/node' - chokidar - supports-color - '@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + '@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3)': + '@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3)': dependencies: - '@angular/compiler': 20.3.2 - '@babel/core': 7.28.3 + '@angular/compiler': 21.2.4 + '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 - chokidar: 4.0.3 + chokidar: 5.0.0 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.7.2 + semver: 7.7.4 tslib: 2.8.1 yargs: 18.0.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@angular/compiler@20.3.2': + '@angular/compiler@21.2.4': dependencies: tslib: 2.8.1 - '@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)': + '@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 20.3.2 - zone.js: 0.15.1 + '@angular/compiler': 21.2.4 + zone.js: 0.16.1 - '@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)': + '@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4)': dependencies: - '@angular/compiler': 20.3.2 - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@babel/core': 7.28.3 + '@angular/compiler': 21.2.4 + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 yargs: 18.0.0 transitivePeerDependencies: - supports-color - '@angular/platform-browser-dynamic@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))': + '@angular/platform-browser-dynamic@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': 20.3.2 - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 21.2.4 + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) tslib: 2.8.1 - '@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))': + '@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/router@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + '@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 @@ -7606,48 +7469,26 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.0': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.7': {} + '@babel/compat-data@7.29.0': {} - '@babel/compat-data@7.28.4': {} - - '@babel/core@7.27.1': + '@babel/core@7.28.5': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.1) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.3': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -7656,17 +7497,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7676,753 +7517,749 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.27.1': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.28.3': + '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.1': - dependencies: - '@babel/types': 7.28.4 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.28.4 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.3 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.1)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 - regexpu-core: 6.2.0 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.1)': + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.27.1)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.1)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-wrap-function@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.4': + '@babel/helpers@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - '@babel/parser@7.28.4': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.5 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.1)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.27.7(@babel/core@7.27.1)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) - '@babel/traverse': 7.28.4 - globals: 11.12.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.27.7(@babel/core@7.27.1)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.27.7(@babel/core@7.27.1)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/traverse': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.27.1)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.1)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-runtime@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1) + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.28.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.27.2(@babel/core@7.27.1)': + '@babel/preset-env@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/compat-data': 7.27.7 - '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/compat-data': 7.29.0 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.1) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-object-rest-spread': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.1) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.1) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.1) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1) - core-js-compat: 3.43.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.28.5) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.28.5) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.28.5) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.28.5) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.28.5) + core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.1)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.4 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 esutils: 2.0.3 - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.28.4': {} - '@babel/template@7.27.2': + '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - '@babel/traverse@7.28.4': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@0.2.3': {} @@ -8431,15 +8268,15 @@ snapshots: '@actions/core': 1.11.1 '@actions/github': 6.0.1 chalk: 4.1.2 - semver: 7.7.2 + semver: 7.7.4 unplugin: 1.16.1 zod: 3.25.76 - '@codecov/webpack-plugin@1.9.1(webpack@5.102.0)': + '@codecov/webpack-plugin@1.9.1(webpack@5.105.3)': dependencies: '@codecov/bundler-plugin-core': 1.9.1 unplugin: 1.16.1 - webpack: 5.102.0 + webpack: 5.105.3 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -8469,299 +8306,237 @@ snapshots: '@discoveryjs/json-ext@0.6.3': {} - '@emnapi/core@1.5.0': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': + '@emnapi/core@1.9.0': dependencies: + '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.10': - optional: true - - '@esbuild/aix-ppc64@0.25.5': - optional: true - - '@esbuild/aix-ppc64@0.25.9': - optional: true - - '@esbuild/android-arm64@0.25.10': - optional: true - - '@esbuild/android-arm64@0.25.5': - optional: true - - '@esbuild/android-arm64@0.25.9': - optional: true - - '@esbuild/android-arm@0.25.10': - optional: true - - '@esbuild/android-arm@0.25.5': - optional: true - - '@esbuild/android-arm@0.25.9': - optional: true - - '@esbuild/android-x64@0.25.10': - optional: true - - '@esbuild/android-x64@0.25.5': - optional: true - - '@esbuild/android-x64@0.25.9': - optional: true - - '@esbuild/darwin-arm64@0.25.10': - optional: true - - '@esbuild/darwin-arm64@0.25.5': - optional: true - - '@esbuild/darwin-arm64@0.25.9': - optional: true - - '@esbuild/darwin-x64@0.25.10': - optional: true - - '@esbuild/darwin-x64@0.25.5': - optional: true - - '@esbuild/darwin-x64@0.25.9': - optional: true - - '@esbuild/freebsd-arm64@0.25.10': - optional: true - - '@esbuild/freebsd-arm64@0.25.5': - optional: true - - '@esbuild/freebsd-arm64@0.25.9': - optional: true - - '@esbuild/freebsd-x64@0.25.10': - optional: true - - '@esbuild/freebsd-x64@0.25.5': + '@emnapi/runtime@1.9.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/freebsd-x64@0.25.9': + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-arm64@0.25.10': + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.25.5': + '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.25.5': + '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-s390x@0.25.5': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-x64@0.25.5': + '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.5': + '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.25.5': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.5': + '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.25.5': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.25.5': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-ia32@0.25.5': + '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.27.2': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': dependencies: - eslint: 9.36.0(jiti@1.21.7) + eslint: 10.0.3(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.23.3': dependencies: - '@eslint/object-schema': 2.1.6 + '@eslint/object-schema': 3.0.3 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.2.4 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} - - '@eslint/core@0.15.2': + '@eslint/config-helpers@0.5.3': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 1.1.1 - '@eslint/eslintrc@3.3.1': + '@eslint/core@1.1.1': dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.36.0': {} + '@types/json-schema': 7.0.15 - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@3.0.3': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.6.1': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 1.1.1 levn: 0.4.1 '@fastify/busboy@2.1.1': {} + '@gar/promise-retry@1.0.2': + dependencies: + retry: 0.13.1 + + '@harperfast/extended-iterable@1.0.3': + optional: true + + '@hono/node-server@1.19.9(hono@4.12.3)': + dependencies: + hono: 4.12.3 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -8773,212 +8548,191 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@1.0.0': {} + '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.2.4(@types/node@24.6.1)': + '@inquirer/checkbox@4.3.2(@types/node@25.4.0)': dependencies: - '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/confirm@5.1.10(@types/node@24.6.1)': + '@inquirer/confirm@5.1.21(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/confirm@5.1.14(@types/node@24.6.1)': + '@inquirer/core@10.3.2(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) - optionalDependencies: - '@types/node': 24.6.1 - - '@inquirer/confirm@5.1.18(@types/node@24.6.1)': - dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) - optionalDependencies: - '@types/node': 24.6.1 - - '@inquirer/core@10.2.2(@types/node@24.6.1)': - dependencies: - '@inquirer/ansi': 1.0.0 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.4.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/editor@4.2.20(@types/node@24.6.1)': + '@inquirer/editor@4.2.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/external-editor': 1.0.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/expand@4.0.20(@types/node@24.6.1)': + '@inquirer/expand@4.0.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/external-editor@1.0.2(@types/node@24.6.1)': + '@inquirer/external-editor@1.0.3(@types/node@25.4.0)': dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 + chardet: 2.1.1 + iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/figures@1.0.13': {} + '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.2.4(@types/node@24.6.1)': + '@inquirer/input@4.3.1(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/number@3.0.20(@types/node@24.6.1)': + '@inquirer/number@3.0.23(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/password@4.0.20(@types/node@24.6.1)': + '@inquirer/password@4.0.23(@types/node@25.4.0)': dependencies: - '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 - - '@inquirer/prompts@7.8.2(@types/node@24.6.1)': - dependencies: - '@inquirer/checkbox': 4.2.4(@types/node@24.6.1) - '@inquirer/confirm': 5.1.18(@types/node@24.6.1) - '@inquirer/editor': 4.2.20(@types/node@24.6.1) - '@inquirer/expand': 4.0.20(@types/node@24.6.1) - '@inquirer/input': 4.2.4(@types/node@24.6.1) - '@inquirer/number': 3.0.20(@types/node@24.6.1) - '@inquirer/password': 4.0.20(@types/node@24.6.1) - '@inquirer/rawlist': 4.1.8(@types/node@24.6.1) - '@inquirer/search': 3.1.3(@types/node@24.6.1) - '@inquirer/select': 4.3.4(@types/node@24.6.1) + '@types/node': 25.4.0 + + '@inquirer/prompts@7.10.1(@types/node@25.4.0)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.4.0) + '@inquirer/confirm': 5.1.21(@types/node@25.4.0) + '@inquirer/editor': 4.2.23(@types/node@25.4.0) + '@inquirer/expand': 4.0.23(@types/node@25.4.0) + '@inquirer/input': 4.3.1(@types/node@25.4.0) + '@inquirer/number': 3.0.23(@types/node@25.4.0) + '@inquirer/password': 4.0.23(@types/node@25.4.0) + '@inquirer/rawlist': 4.1.11(@types/node@25.4.0) + '@inquirer/search': 3.2.2(@types/node@25.4.0) + '@inquirer/select': 4.4.2(@types/node@25.4.0) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/rawlist@4.1.8(@types/node@24.6.1)': + '@inquirer/rawlist@4.1.11(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/search@3.1.3(@types/node@24.6.1)': + '@inquirer/search@3.2.2(@types/node@25.4.0)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/select@4.3.4(@types/node@24.6.1)': + '@inquirer/select@4.4.2(@types/node@25.4.0)': dependencies: - '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@25.4.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.4.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@inquirer/type@3.0.8(@types/node@24.6.1)': + '@inquirer/type@3.0.10(@types/node@25.4.0)': optionalDependencies: - '@types/node': 24.6.1 - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 + '@types/node': 25.4.0 '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@isaacs/fs-minipass@4.0.1': dependencies: - minipass: 7.1.2 + minipass: 7.1.3 '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.1 + js-yaml: 3.14.2 resolve-from: 5.0.0 '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.2.0': + '@jest/console@30.3.0': dependencies: - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 chalk: 4.1.2 - jest-message-util: 30.2.0 - jest-util: 30.2.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.2.0(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3))': + '@jest/core@30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))': dependencies: - '@jest/console': 30.2.0 + '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/reporters': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - jest-haste-map: 30.2.0 - jest-message-util: 30.2.0 + jest-changed-files: 30.3.0 + jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-haste-map: 30.3.0 + jest-message-util: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-resolve-dependencies: 30.2.0 - jest-runner: 30.2.0 - jest-runtime: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 - jest-watcher: 30.2.0 - micromatch: 4.0.8 - pretty-format: 30.2.0 + jest-resolve: 30.3.0 + jest-resolve-dependencies: 30.3.0 + jest-runner: 30.3.0 + jest-runtime: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 + jest-watcher: 30.3.0 + pretty-format: 30.3.0 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -8988,106 +8742,121 @@ snapshots: '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.3.0': {} + '@jest/environment-jsdom-abstract@30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0))': dependencies: '@jest/environment': 30.2.0 '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 '@types/jsdom': 21.1.7 - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-mock: 30.2.0 jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) optionalDependencies: canvas: 3.0.0 - '@jest/environment@29.7.0': + '@jest/environment-jsdom-abstract@30.3.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0))': dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 24.6.1 - jest-mock: 29.7.0 + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/jsdom': 21.1.7 + '@types/node': 25.4.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + jsdom: 26.1.0(canvas@3.0.0) + optionalDependencies: + canvas: 3.0.0 '@jest/environment@30.2.0': dependencies: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-mock: 30.2.0 + '@jest/environment@30.3.0': + dependencies: + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + jest-mock: 30.3.0 + '@jest/expect-utils@30.0.5': dependencies: '@jest/get-type': 30.0.1 - '@jest/expect-utils@30.2.0': + '@jest/expect-utils@30.3.0': dependencies: '@jest/get-type': 30.1.0 - '@jest/expect@30.2.0': + '@jest/expect@30.3.0': dependencies: - expect: 30.2.0 - jest-snapshot: 30.2.0 + expect: 30.3.0 + jest-snapshot: 30.3.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.6.1 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - '@jest/fake-timers@30.2.0': dependencies: '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 + '@jest/fake-timers@30.3.0': + dependencies: + '@jest/types': 30.3.0 + '@sinonjs/fake-timers': 15.1.1 + '@types/node': 25.4.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + '@jest/get-type@30.0.1': {} '@jest/get-type@30.1.0': {} - '@jest/globals@30.2.0': + '@jest/globals@30.3.0': dependencies: - '@jest/environment': 30.2.0 - '@jest/expect': 30.2.0 - '@jest/types': 30.2.0 - jest-mock: 30.2.0 + '@jest/environment': 30.3.0 + '@jest/expect': 30.3.0 + '@jest/types': 30.3.0 + jest-mock: 30.3.0 transitivePeerDependencies: - supports-color '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-regex-util: 30.0.1 - '@jest/reporters@30.2.0': + '@jest/reporters@30.3.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 + '@jest/console': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 24.6.1 + '@types/node': 25.4.0 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit-x: 0.2.2 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - jest-message-util: 30.2.0 - jest-util: 30.2.0 - jest-worker: 30.2.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 + jest-worker: 30.3.0 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -9096,15 +8865,15 @@ snapshots: '@jest/schemas@29.6.3': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.27.10 '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.41 + '@sinclair/typebox': 0.34.48 - '@jest/snapshot-utils@30.2.0': + '@jest/snapshot-utils@30.3.0': dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 @@ -9115,67 +8884,67 @@ snapshots: callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.2.0': + '@jest/test-result@30.3.0': dependencies: - '@jest/console': 30.2.0 - '@jest/types': 30.2.0 + '@jest/console': 30.3.0 + '@jest/types': 30.3.0 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@30.2.0': + '@jest/test-sequencer@30.3.0': dependencies: - '@jest/test-result': 30.2.0 + '@jest/test-result': 30.3.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 + jest-haste-map: 30.3.0 slash: 3.0.0 - '@jest/transform@30.2.0': + '@jest/transform@30.3.0': dependencies: - '@babel/core': 7.28.4 - '@jest/types': 30.2.0 + '@babel/core': 7.29.0 + '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 + jest-haste-map: 30.3.0 jest-regex-util: 30.0.1 - jest-util: 30.2.0 - micromatch: 4.0.8 + jest-util: 30.3.0 pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': + '@jest/types@30.0.5': dependencies: - '@jest/schemas': 29.6.3 + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.6.1 - '@types/yargs': 17.0.33 + '@types/node': 25.4.0 + '@types/yargs': 17.0.35 chalk: 4.1.2 - '@jest/types@30.0.5': + '@jest/types@30.2.0': dependencies: '@jest/pattern': 30.0.1 '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.6.1 - '@types/yargs': 17.0.33 + '@types/node': 25.4.0 + '@types/yargs': 17.0.35 chalk: 4.1.2 - '@jest/types@30.2.0': + '@jest/types@30.3.0': dependencies: '@jest/pattern': 30.0.1 '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.6.1 - '@types/yargs': 17.0.33 + '@types/node': 25.4.0 + '@types/yargs': 17.0.35 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': @@ -9197,105 +8966,216 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/source-map@0.3.6': + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 - '@jridgewell/trace-mapping@0.3.31': + '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 - '@jridgewell/trace-mapping@0.3.9': + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': dependencies: + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@1.6.0(tslib@2.8.1)': + '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) tslib: 2.8.1 '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@24.6.1))(@types/node@24.6.1)(listr2@9.0.1)': + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.4.0))(@types/node@25.4.0)(listr2@9.0.5)': dependencies: - '@inquirer/prompts': 7.8.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) - listr2: 9.0.1 + '@inquirer/prompts': 7.10.1(@types/node@25.4.0) + '@inquirer/type': 3.0.10(@types/node@25.4.0) + listr2: 9.0.5 transitivePeerDependencies: - '@types/node' - '@lmdb/lmdb-darwin-arm64@3.3.0': + '@lmdb/lmdb-darwin-arm64@3.4.4': optional: true - '@lmdb/lmdb-darwin-arm64@3.4.2': + '@lmdb/lmdb-darwin-arm64@3.5.1': optional: true - '@lmdb/lmdb-darwin-x64@3.3.0': + '@lmdb/lmdb-darwin-x64@3.4.4': optional: true - '@lmdb/lmdb-darwin-x64@3.4.2': + '@lmdb/lmdb-darwin-x64@3.5.1': optional: true - '@lmdb/lmdb-linux-arm64@3.3.0': + '@lmdb/lmdb-linux-arm64@3.4.4': optional: true - '@lmdb/lmdb-linux-arm64@3.4.2': + '@lmdb/lmdb-linux-arm64@3.5.1': optional: true - '@lmdb/lmdb-linux-arm@3.3.0': + '@lmdb/lmdb-linux-arm@3.4.4': optional: true - '@lmdb/lmdb-linux-arm@3.4.2': + '@lmdb/lmdb-linux-arm@3.5.1': optional: true - '@lmdb/lmdb-linux-x64@3.3.0': + '@lmdb/lmdb-linux-x64@3.4.4': optional: true - '@lmdb/lmdb-linux-x64@3.4.2': + '@lmdb/lmdb-linux-x64@3.5.1': optional: true - '@lmdb/lmdb-win32-arm64@3.3.0': + '@lmdb/lmdb-win32-arm64@3.4.4': optional: true - '@lmdb/lmdb-win32-arm64@3.4.2': + '@lmdb/lmdb-win32-arm64@3.5.1': optional: true - '@lmdb/lmdb-win32-x64@3.3.0': + '@lmdb/lmdb-win32-x64@3.4.4': optional: true - '@lmdb/lmdb-win32-x64@3.4.2': + '@lmdb/lmdb-win32-x64@3.5.1': optional: true - '@modelcontextprotocol/sdk@1.17.3': + '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': dependencies: - ajv: 6.12.6 + '@hono/node-server': 1.19.9(hono@4.12.3) + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 - cors: 2.8.5 + cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.1 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) + express: 5.2.1 + express-rate-limit: 8.2.1(express@5.2.1) + hono: 4.12.3 + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) transitivePeerDependencies: - supports-color @@ -9317,6 +9197,54 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true + '@napi-rs/canvas-android-arm64@0.1.90': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.90': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.90': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.90': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.90': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.90': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.90': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.90': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.90': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@0.1.90': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.90': + optional: true + + '@napi-rs/canvas@0.1.90': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.90 + '@napi-rs/canvas-darwin-arm64': 0.1.90 + '@napi-rs/canvas-darwin-x64': 0.1.90 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.90 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.90 + '@napi-rs/canvas-linux-arm64-musl': 0.1.90 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.90 + '@napi-rs/canvas-linux-x64-gnu': 0.1.90 + '@napi-rs/canvas-linux-x64-musl': 0.1.90 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.90 + '@napi-rs/canvas-win32-x64-msvc': 0.1.90 + optional: true + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -9391,118 +9319,105 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.0.5': + '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true - '@ng-bootstrap/ng-bootstrap@19.0.1(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@popperjs/core@2.11.8)(rxjs@7.8.2)': + '@ng-bootstrap/ng-bootstrap@20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2)': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/forms': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - '@angular/localize': 20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/localize': 21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4) '@popperjs/core': 2.11.8 rxjs: 7.8.2 tslib: 2.8.1 - '@ng-select/ng-select@20.6.3(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))': + '@ng-select/ng-select@21.5.2(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))': dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/forms': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) tslib: 2.8.1 - ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/router@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' + ? '@ngneat/dirty-check-forms@3.0.3(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(lodash-es@4.17.21)(rxjs@7.8.2)' : dependencies: - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/forms': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - '@angular/router': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) lodash-es: 4.17.21 rxjs: 7.8.2 tslib: 2.8.1 - '@ngtools/webpack@20.0.4(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5))': + '@ngtools/webpack@21.1.2(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2))': dependencies: - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - typescript: 5.8.3 - webpack: 5.99.8(esbuild@0.25.5) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + typescript: 5.9.3 + webpack: 5.104.1(esbuild@0.27.2) - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@npmcli/agent@3.0.0': + '@npmcli/agent@4.0.0': dependencies: agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - lru-cache: 10.4.3 + lru-cache: 11.2.7 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - '@npmcli/fs@4.0.0': + '@npmcli/fs@5.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.4 - '@npmcli/git@6.0.3': + '@npmcli/git@7.0.2': dependencies: - '@npmcli/promise-spawn': 8.0.3 - ini: 5.0.0 - lru-cache: 10.4.3 - npm-pick-manifest: 10.0.0 - proc-log: 5.0.0 - promise-retry: 2.0.1 - semver: 7.7.2 - which: 5.0.0 + '@gar/promise-retry': 1.0.2 + '@npmcli/promise-spawn': 9.0.1 + ini: 6.0.0 + lru-cache: 11.2.6 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 + semver: 7.7.4 + which: 6.0.1 - '@npmcli/installed-package-contents@3.0.0': + '@npmcli/installed-package-contents@4.0.0': dependencies: - npm-bundled: 4.0.0 - npm-normalize-package-bin: 4.0.0 + npm-bundled: 5.0.0 + npm-normalize-package-bin: 5.0.0 - '@npmcli/node-gyp@4.0.0': {} + '@npmcli/node-gyp@5.0.0': {} - '@npmcli/package-json@6.2.0': + '@npmcli/package-json@7.0.5': dependencies: - '@npmcli/git': 6.0.3 - glob: 10.4.5 - hosted-git-info: 8.1.0 - json-parse-even-better-errors: 4.0.0 - proc-log: 5.0.0 - semver: 7.7.2 - validate-npm-package-license: 3.0.4 + '@npmcli/git': 7.0.2 + glob: 13.0.6 + hosted-git-info: 9.0.2 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.7.4 + spdx-expression-parse: 4.0.0 - '@npmcli/promise-spawn@8.0.3': + '@npmcli/promise-spawn@9.0.1': dependencies: - which: 5.0.0 + which: 6.0.1 - '@npmcli/redact@3.2.2': {} + '@npmcli/redact@4.0.0': {} - '@npmcli/run-script@9.1.0': + '@npmcli/run-script@10.0.4': dependencies: - '@npmcli/node-gyp': 4.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.3 - node-gyp: 11.4.2 - proc-log: 5.0.0 - which: 5.0.0 + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.2.0 + proc-log: 6.1.0 transitivePeerDependencies: - supports-color @@ -9564,67 +9479,69 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@oxc-project/types@0.89.0': {} + '@oxc-project/types@0.106.0': {} - '@parcel/watcher-android-arm64@2.5.1': + '@oxc-project/types@0.113.0': {} + + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 optional: true '@pkgjs/parseargs@0.11.0': @@ -9632,241 +9549,230 @@ snapshots: '@pkgr/core@0.2.9': {} - '@playwright/test@1.55.1': + '@playwright/test@1.58.2': dependencies: - playwright: 1.55.1 + playwright: 1.58.2 '@popperjs/core@2.11.8': {} - '@rolldown/binding-android-arm64@1.0.0-beta.38': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-beta.38': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-beta.38': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-beta.38': + '@rolldown/binding-android-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': + '@rolldown/binding-android-arm64@1.0.0-rc.4': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': + '@rolldown/binding-darwin-arm64@1.0.0-rc.4': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': + '@rolldown/binding-darwin-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': + '@rolldown/binding-darwin-x64@1.0.0-rc.4': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': - dependencies: - '@napi-rs/wasm-runtime': 1.0.5 + '@rolldown/binding-freebsd-x64@1.0.0-rc.4': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': optional: true - '@rolldown/pluginutils@1.0.0-beta.38': {} - - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': optional: true - '@rollup/rollup-android-arm-eabi@4.52.3': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': optional: true - '@rollup/rollup-android-arm64@4.52.3': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': optional: true - '@rollup/rollup-darwin-arm64@4.52.3': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': optional: true - '@rollup/rollup-darwin-x64@4.52.3': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': optional: true - '@rollup/rollup-freebsd-arm64@4.52.3': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rollup/rollup-freebsd-x64@4.52.3': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.3': - optional: true + '@rolldown/pluginutils@1.0.0-beta.58': {} - '@rollup/rollup-linux-arm64-gnu@4.40.2': - optional: true + '@rolldown/pluginutils@1.0.0-rc.4': {} - '@rollup/rollup-linux-arm64-gnu@4.52.3': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.3': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.3': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.3': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.3': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.3': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.3': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.3': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.52.3': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.52.3': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.3': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.3': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.3': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.3': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@schematics/angular@20.3.3(chokidar@4.0.3)': + '@schematics/angular@21.2.2(chokidar@5.0.0)': dependencies: - '@angular-devkit/core': 20.3.3(chokidar@4.0.3) - '@angular-devkit/schematics': 20.3.3(chokidar@4.0.3) + '@angular-devkit/core': 21.2.2(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.2(chokidar@5.0.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar - '@sigstore/bundle@3.1.0': + '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.4.3 + '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/core@2.0.0': {} + '@sigstore/core@3.1.0': {} - '@sigstore/protobuf-specs@0.4.3': {} + '@sigstore/protobuf-specs@0.5.0': {} - '@sigstore/sign@3.1.0': + '@sigstore/sign@4.1.0': dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - make-fetch-happen: 14.0.3 - proc-log: 5.0.0 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + make-fetch-happen: 15.0.4 + proc-log: 6.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@3.1.1': + '@sigstore/tuf@4.0.1': dependencies: - '@sigstore/protobuf-specs': 0.4.3 - tuf-js: 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + tuf-js: 4.1.0 transitivePeerDependencies: - supports-color - '@sigstore/verify@2.1.1': + '@sigstore/verify@3.1.0': dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.27.10': {} - '@sinclair/typebox@0.34.41': {} + '@sinclair/typebox@0.34.48': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': + '@sinonjs/fake-timers@13.0.5': dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers@13.0.5': + '@sinonjs/fake-timers@15.1.1': dependencies: '@sinonjs/commons': 3.0.1 - '@tootallnate/once@2.0.0': {} + '@standard-schema/spec@1.1.0': {} '@tsconfig/node10@1.0.9': {} @@ -9878,10 +9784,10 @@ snapshots: '@tufjs/canonical-json@2.0.0': {} - '@tufjs/models@3.0.1': + '@tufjs/models@4.1.0': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.5 + minimatch: 10.2.4 '@tybys/wasm-util@0.10.1': dependencies: @@ -9890,42 +9796,42 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.0.6 - '@types/node': 24.6.1 + '@types/express-serve-static-core': 4.19.8 + '@types/node': 25.4.0 '@types/connect@3.4.38': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/eslint-scope@3.7.7': dependencies: @@ -9937,36 +9843,29 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree@1.0.7': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 24.6.1 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 - - '@types/express-serve-static-core@5.0.6': + '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 + '@types/send': 1.2.1 - '@types/express@4.17.23': + '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.6 + '@types/express-serve-static-core': 4.19.8 '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/http-errors@2.0.5': {} - '@types/http-proxy@1.17.16': + '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9983,15 +9882,9 @@ snapshots: expect: 30.0.5 pretty-format: 30.0.5 - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 24.6.1 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/jsdom@21.1.7': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -9999,13 +9892,13 @@ snapshots: '@types/mime@1.3.5': {} - '@types/node-forge@1.3.11': + '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 - '@types/node@24.6.1': + '@types/node@25.4.0': dependencies: - undici-types: 7.13.0 + undici-types: 7.18.2 '@types/qs@6.14.0': {} @@ -10013,24 +9906,28 @@ snapshots: '@types/retry@0.12.2': {} - '@types/send@0.17.5': + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.6.1 + '@types/node': 25.4.0 + + '@types/send@1.2.1': + dependencies: + '@types/node': 25.4.0 '@types/serve-index@1.9.4': dependencies: - '@types/express': 4.17.23 + '@types/express': 4.17.25 - '@types/serve-static@1.15.8': + '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.6.1 - '@types/send': 0.17.5 + '@types/node': 25.4.0 + '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/stack-utils@2.0.3': {} @@ -10038,106 +9935,104 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.45.0 - eslint: 9.36.0(jiti@1.21.7) - graphemer: 1.4.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/type-utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 + eslint: 10.0.3(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - eslint: 9.36.0(jiti@1.21.7) - typescript: 5.8.3 + eslint: 10.0.3(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.45.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.8.3) - '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 debug: 4.4.3 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.45.0': + '@typescript-eslint/scope-manager@8.57.0': dependencies: - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.36.0(jiti@1.21.7) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + eslint: 10.0.3(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.45.0': {} + '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@8.45.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.45.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.8.3) - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/visitor-keys': 8.45.0 + '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.8.3) - eslint: 9.36.0(jiti@1.21.7) - typescript: 5.8.3 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + eslint: 10.0.3(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.45.0': + '@typescript-eslint/visitor-keys@8.57.0': dependencies: - '@typescript-eslint/types': 8.45.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.57.0 + eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -10200,17 +10095,13 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0))': - dependencies: - vite: 6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0) - - '@vitejs/plugin-basic-ssl@2.0.0(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0) + vite: 7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0) - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0))': dependencies: - vite: 7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0) + vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -10294,9 +10185,7 @@ snapshots: '@yarnpkg/lockfile@1.1.0': {} - abab@2.0.6: {} - - abbrev@3.0.1: {} + abbrev@4.0.0: {} accepts@1.3.8: dependencies: @@ -10305,55 +10194,48 @@ snapshots: accepts@2.0.0: dependencies: - mime-types: 3.0.1 + mime-types: 3.0.2 negotiator: 1.0.0 - acorn-globals@7.0.1: + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: - acorn: 8.15.0 - acorn-walk: 8.3.1 - - acorn-import-phases@1.0.4(acorn@8.15.0): - dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-walk@8.3.1: {} acorn@8.14.0: {} - acorn@8.15.0: {} + acorn@8.16.0: {} adjust-sourcemap-loader@4.0.0: dependencies: loader-utils: 2.0.4 regex-parser: 2.3.1 - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - agent-base@7.1.4: {} - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 - ajv-keywords@5.1.0(ajv@8.17.1): + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-keywords@5.1.0(ajv@8.18.0): dependencies: - ajv: 8.17.1 + ajv: 8.18.0 fast-deep-equal: 3.1.3 - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -10367,22 +10249,29 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.35.0: - dependencies: - '@algolia/abtesting': 1.1.0 - '@algolia/client-abtesting': 5.35.0 - '@algolia/client-analytics': 5.35.0 - '@algolia/client-common': 5.35.0 - '@algolia/client-insights': 5.35.0 - '@algolia/client-personalization': 5.35.0 - '@algolia/client-query-suggestions': 5.35.0 - '@algolia/client-search': 5.35.0 - '@algolia/ingestion': 1.35.0 - '@algolia/monitoring': 1.35.0 - '@algolia/recommend': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.48.1: + dependencies: + '@algolia/abtesting': 1.14.1 + '@algolia/client-abtesting': 5.48.1 + '@algolia/client-analytics': 5.48.1 + '@algolia/client-common': 5.48.1 + '@algolia/client-insights': 5.48.1 + '@algolia/client-personalization': 5.48.1 + '@algolia/client-query-suggestions': 5.48.1 + '@algolia/client-search': 5.48.1 + '@algolia/ingestion': 1.48.1 + '@algolia/monitoring': 1.48.1 + '@algolia/recommend': 5.48.1 + '@algolia/requester-browser-xhr': 5.48.1 + '@algolia/requester-fetch': 5.48.1 + '@algolia/requester-node-http': 5.48.1 ansi-colors@4.1.3: {} @@ -10390,7 +10279,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.1.1: + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -10408,8 +10297,6 @@ snapshots: ansi-styles@6.2.3: {} - ansis@4.2.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -10427,42 +10314,39 @@ snapshots: array-flatten@1.1.1: {} - asynckit@0.4.0: {} - - autoprefixer@10.4.21(postcss@8.5.3): + autoprefixer@10.4.23(postcss@8.5.6): dependencies: - browserslist: 4.26.3 - caniuse-lite: 1.0.30001746 - fraction.js: 4.3.7 - normalize-range: 0.1.2 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001775 + fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 axobject-query@4.1.0: {} - babel-jest@30.2.0(@babel/core@7.28.4): + babel-jest@30.3.0(@babel/core@7.29.0): dependencies: - '@babel/core': 7.28.4 - '@jest/transform': 30.2.0 + '@babel/core': 7.29.0 + '@jest/transform': 30.3.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.2.0(@babel/core@7.28.4) + babel-preset-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.1)(webpack@5.99.8(esbuild@0.25.5)): + babel-loader@10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)): dependencies: - '@babel/core': 7.27.1 + '@babel/core': 7.28.5 find-up: 5.0.0 - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) babel-plugin-istanbul@7.0.1: dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 6.0.3 @@ -10470,89 +10354,92 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.2.0: + babel-plugin-jest-hoist@30.3.0: dependencies: '@types/babel__core': 7.20.5 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1): + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.28.5): dependencies: - '@babel/compat-data': 7.27.7 - '@babel/core': 7.27.1 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) + '@babel/compat-data': 7.29.0 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.1): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.27.1 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) - core-js-compat: 3.43.0 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.5) + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.1): + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.28.5): dependencies: - '@babel/core': 7.27.1 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) - - babel-preset-jest@30.2.0(@babel/core@7.28.4): - dependencies: - '@babel/core': 7.28.4 - babel-plugin-jest-hoist: 30.2.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + + babel-preset-jest@30.3.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 30.3.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: optional: true - baseline-browser-mapping@2.8.10: {} + baseline-browser-mapping@2.10.0: {} batch@0.6.1: {} - beasties@0.3.4: + beasties@0.3.5: dependencies: - css-select: 5.2.2 - css-what: 6.2.2 + css-select: 6.0.0 + css-what: 7.0.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - htmlparser2: 10.0.0 + htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.6 postcss-media-query-parser: 0.2.3 - beasties@0.3.5: + beasties@0.4.1: dependencies: css-select: 6.0.0 css-what: 7.0.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - htmlparser2: 10.0.0 + htmlparser2: 10.1.0 picocolors: 1.1.1 postcss: 8.5.6 postcss-media-query-parser: 0.2.3 + postcss-safe-parser: 7.0.1(postcss@8.5.6) before-after-hook@2.2.3: {} @@ -10567,33 +10454,33 @@ snapshots: readable-stream: 3.6.2 optional: true - body-parser@1.20.3: + body-parser@1.20.4: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 + qs: 6.14.2 + raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - body-parser@2.2.0: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3 - http-errors: 2.0.0 - iconv-lite: 0.6.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.1 + qs: 6.15.0 + raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -10618,17 +10505,21 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 - browserslist@4.26.3: + browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.8.10 - caniuse-lite: 1.0.30001746 - electron-to-chromium: 1.5.228 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.3) + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001775 + electron-to-chromium: 1.5.302 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) bs-logger@0.2.6: dependencies: @@ -10648,24 +10539,23 @@ snapshots: bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 bytes@3.1.2: {} - cacache@19.0.1: + cacache@20.0.3: dependencies: - '@npmcli/fs': 4.0.0 + '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 - glob: 10.4.5 - lru-cache: 10.4.3 - minipass: 7.1.2 + glob: 13.0.6 + lru-cache: 11.2.6 + minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 7.0.3 - ssri: 12.0.0 - tar: 7.5.1 - unique-filename: 4.0.0 + p-map: 7.0.4 + ssri: 13.0.1 + unique-filename: 5.0.0 call-bind-apply-helpers@1.0.2: dependencies: @@ -10683,12 +10573,12 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001746: {} + caniuse-lite@1.0.30001775: {} canvas@3.0.0: dependencies: node-addon-api: 7.1.1 - prebuild-install: 7.1.2 + prebuild-install: 7.1.3 simple-get: 3.1.1 optional: true @@ -10701,7 +10591,7 @@ snapshots: char-regex@1.0.2: {} - chardet@2.1.0: {} + chardet@2.1.1: {} chokidar@3.6.0: dependencies: @@ -10719,31 +10609,31 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@1.1.4: optional: true - chownr@2.0.0: {} - chownr@3.0.0: {} chrome-trace-event@1.0.4: {} - ci-info@3.9.0: {} + ci-info@4.4.0: {} - ci-info@4.3.0: {} - - cjs-module-lexer@2.1.0: {} + cjs-module-lexer@2.2.0: {} cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 - cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} - cli-truncate@4.0.0: + cli-truncate@5.2.0: dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 + slice-ansi: 8.0.0 + string-width: 8.2.0 cli-width@4.1.0: {} @@ -10756,7 +10646,7 @@ snapshots: cliui@9.0.1: dependencies: string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 clone-deep@4.0.1: @@ -10767,7 +10657,7 @@ snapshots: co@4.6.0: {} - collect-v8-coverage@1.0.2: {} + collect-v8-coverage@1.0.3: {} color-convert@2.0.1: dependencies: @@ -10777,23 +10667,19 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@2.20.3: {} compressible@2.0.18: dependencies: mime-db: 1.54.0 - compression@1.8.0: + compression@1.8.1: dependencies: bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 negotiator: 0.6.4 - on-headers: 1.0.2 + on-headers: 1.1.0 safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: @@ -10807,9 +10693,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 + content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -10817,46 +10701,44 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.6: {} + cookie-signature@1.0.7: {} cookie-signature@1.2.2: {} - cookie@0.7.1: {} - cookie@0.7.2: {} copy-anything@2.0.6: dependencies: is-what: 3.14.1 - copy-webpack-plugin@13.0.0(webpack@5.99.8(esbuild@0.25.5)): + copy-webpack-plugin@13.0.1(webpack@5.104.1(esbuild@0.27.2)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) - core-js-compat@3.43.0: + core-js-compat@3.48.0: dependencies: - browserslist: 4.26.3 + browserslist: 4.28.1 core-util-is@1.0.3: {} - cors@2.8.5: + cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 create-require@1.1.1: {} @@ -10866,26 +10748,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@7.1.2(webpack@5.99.8(esbuild@0.25.5)): + css-loader@7.1.2(webpack@5.104.1(esbuild@0.27.2)): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) - postcss-modules-scope: 3.2.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.4 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) - - css-select@5.2.2: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 + webpack: 5.104.1(esbuild@0.27.2) css-select@6.0.0: dependencies: @@ -10895,31 +10769,15 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-what@6.2.2: {} - css-what@7.0.0: {} cssesc@3.0.0: {} - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 - data-urls@3.0.2: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -10945,7 +10803,7 @@ snapshots: mimic-response: 3.1.0 optional: true - dedent@1.7.0: {} + dedent@1.7.2: {} deep-extend@0.6.0: optional: true @@ -10954,17 +10812,15 @@ snapshots: deepmerge@4.3.1: {} - default-browser-id@5.0.0: {} + default-browser-id@5.0.1: {} - default-browser@5.2.1: + default-browser@5.4.0: dependencies: bundle-name: 4.1.0 - default-browser-id: 5.0.0 + default-browser-id: 5.0.1 define-lazy-prop@3.0.0: {} - delayed-stream@1.0.0: {} - depd@1.1.2: {} depd@2.0.0: {} @@ -10973,10 +10829,7 @@ snapshots: destroy@1.2.0: {} - detect-libc@1.0.3: - optional: true - - detect-libc@2.1.1: + detect-libc@2.1.2: optional: true detect-newline@3.1.0: {} @@ -10999,10 +10852,6 @@ snapshots: domelementtype@2.3.0: {} - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - domhandler@5.0.3: dependencies: domelementtype: 2.3.0 @@ -11023,11 +10872,11 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.228: {} + electron-to-chromium@1.5.302: {} emittery@0.13.1: {} - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -11035,29 +10884,24 @@ snapshots: emojis-list@3.0.0: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 optional: true - enhanced-resolve@5.18.3: + enhanced-resolve@5.20.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.3 + tapable: 2.3.0 entities@4.5.0: {} entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -11077,102 +10921,73 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - esbuild-wasm@0.25.10: {} + esbuild-wasm@0.27.2: {} - esbuild-wasm@0.25.5: {} + esbuild-wasm@0.27.3: {} - esbuild@0.25.10: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 - optional: true - - esbuild@0.25.5: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + esbuild@0.27.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 - - esbuild@0.25.9: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 escalade@3.2.0: {} @@ -11182,52 +10997,49 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.1: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} - eslint@9.36.0(jiti@1.21.7): + eslint@10.0.3(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@1.21.7)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.36.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.3 + '@eslint/config-helpers': 0.5.3 + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 + ajv: 6.14.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -11237,24 +11049,23 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.4 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.7 + jiti: 2.6.1 transitivePeerDependencies: - supports-color - espree@10.4.0: + espree@11.2.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -11272,7 +11083,7 @@ snapshots: eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} events@3.3.0: {} @@ -11308,83 +11119,85 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 - expect@30.2.0: + expect@30.3.0: dependencies: - '@jest/expect-utils': 30.2.0 + '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 - exponential-backoff@3.1.2: {} + exponential-backoff@3.1.3: {} - express-rate-limit@7.5.1(express@5.1.0): + express-rate-limit@8.2.1(express@5.2.1): dependencies: - express: 5.1.0 + express: 5.2.1 + ip-address: 10.0.1 - express@4.21.2: + express@4.22.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.3 + body-parser: 1.20.4 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 + cookie: 0.7.2 + cookie-signature: 1.0.7 debug: 2.6.9 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.1 + finalhandler: 1.3.2 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 + send: 0.19.2 + serve-static: 1.16.3 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - express@5.1.0: + express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 debug: 4.4.3 + depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.0 + finalhandler: 2.1.1 fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 2.0.0 - mime-types: 3.0.1 + mime-types: 3.0.2 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.15.0 range-parser: 1.2.1 router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 @@ -11393,24 +11206,12 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fast-uri@3.1.0: {} - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 @@ -11419,10 +11220,6 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -11437,19 +11234,19 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.1: + finalhandler@1.3.2: dependencies: debug: 2.6.9 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - finalhandler@2.1.0: + finalhandler@2.1.1: dependencies: debug: 4.4.3 encodeurl: 2.0.0 @@ -11472,14 +11269,14 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.2: {} - follow-redirects@1.15.9(debug@4.4.3): + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: debug: 4.4.3 @@ -11488,15 +11285,9 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - forwarded@0.2.0: {} - fraction.js@4.3.7: {} + fraction.js@5.3.4: {} fresh@0.5.2: {} @@ -11505,13 +11296,9 @@ snapshots: fs-constants@1.0.0: optional: true - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs-minipass@3.0.3: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 fs.realpath@1.0.0: {} @@ -11527,7 +11314,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.4.0: {} + get-east-asian-width@1.5.0: {} get-intrinsic@1.3.0: dependencies: @@ -11562,36 +11349,40 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} - glob@10.4.5: + glob@10.5.0: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 + minimatch: 9.0.9 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.6: + dependencies: + minimatch: 10.2.4 + minipass: 7.1.3 + path-scurry: 2.0.2 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 - globals@11.12.0: {} - - globals@14.0.0: {} - gopd@1.2.0: {} graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - handle-thing@2.0.1: {} handlebars@4.7.8: @@ -11611,13 +11402,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hosted-git-info@8.1.0: - dependencies: - lru-cache: 10.4.3 + hono@4.12.3: {} - hosted-git-info@9.0.0: + hosted-git-info@9.0.2: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.6 hpack.js@2.1.6: dependencies: @@ -11626,52 +11415,41 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 html-escaper@2.0.2: {} - htmlparser2@10.0.0: + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - entities: 6.0.1 + entities: 7.0.1 http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} - http-errors@1.6.3: + http-errors@1.8.1: dependencies: depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 statuses: 1.5.0 + toidentifier: 1.0.1 - http-errors@2.0.0: + http-errors@2.0.1: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 http-parser-js@0.5.10: {} - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -11679,21 +11457,21 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.23): + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: - '@types/http-proxy': 1.17.16 + '@types/http-proxy': 1.17.17 http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 optionalDependencies: - '@types/express': 4.17.23 + '@types/express': 4.17.25 transitivePeerDependencies: - debug http-proxy-middleware@3.0.5: dependencies: - '@types/http-proxy': 1.17.16 + '@types/http-proxy': 1.17.17 debug: 4.4.3 http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 @@ -11705,18 +11483,11 @@ snapshots: http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.3) + follow-redirects: 1.15.11(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -11736,20 +11507,20 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.0: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): + icss-utils@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 ieee754@1.2.1: optional: true ignore-walk@8.0.0: dependencies: - minimatch: 10.0.3 + minimatch: 10.2.4 ignore@5.3.2: {} @@ -11758,7 +11529,7 @@ snapshots: image-size@0.5.5: optional: true - immutable@5.1.3: {} + immutable@5.1.4: {} import-fresh@3.3.1: dependencies: @@ -11777,20 +11548,20 @@ snapshots: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.3: {} - inherits@2.0.4: {} ini@1.3.8: optional: true - ini@5.0.0: {} + ini@6.0.0: {} ip-address@10.0.1: {} + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} - ipaddr.js@2.2.0: {} + ipaddr.js@2.3.0: {} is-arrayish@0.2.1: {} @@ -11808,11 +11579,9 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@4.0.0: {} - is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.4.0 + get-east-asian-width: 1.5.0 is-generator-fn@2.1.0: {} @@ -11820,13 +11589,15 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 is-interactive@2.0.0: {} - is-network-error@1.1.0: {} + is-network-error@1.3.0: {} is-number@7.0.0: {} @@ -11844,8 +11615,6 @@ snapshots: is-stream@2.0.1: {} - is-unicode-supported@1.3.0: {} - is-unicode-supported@2.1.0: {} is-what@3.14.1: {} @@ -11858,7 +11627,7 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.1: {} + isexe@4.0.0: {} isobject@3.0.1: {} @@ -11866,11 +11635,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.4 + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -11899,31 +11668,31 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.2.0: + jest-changed-files@30.3.0: dependencies: execa: 5.1.1 - jest-util: 30.2.0 + jest-util: 30.3.0 p-limit: 3.1.0 - jest-circus@30.2.0: + jest-circus@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/expect': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/environment': 30.3.0 + '@jest/expect': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0 + dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 30.2.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-runtime: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 + jest-each: 30.3.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-runtime: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 p-limit: 3.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -11931,17 +11700,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)): + jest-cli@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - jest-util: 30.2.0 - jest-validate: 30.2.0 + jest-config: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + jest-util: 30.3.0 + jest-validate: 30.3.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -11950,35 +11719,34 @@ snapshots: - supports-color - ts-node - jest-config@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)): + jest-config@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.28.4) + '@jest/test-sequencer': 30.3.0 + '@jest/types': 30.3.0 + babel-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-circus: 30.2.0 + jest-circus: 30.3.0 jest-docblock: 30.2.0 - jest-environment-node: 30.2.0 + jest-environment-node: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-runner: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 - micromatch: 4.0.8 + jest-resolve: 30.3.0 + jest-runner: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 parse-json: 5.2.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.6.1 - ts-node: 10.9.2(@types/node@24.6.1)(typescript@5.8.3) + '@types/node': 25.4.0 + ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11997,48 +11765,29 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 - jest-diff@30.2.0: + jest-diff@30.3.0: dependencies: - '@jest/diff-sequences': 30.0.1 + '@jest/diff-sequences': 30.3.0 '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.2.0 + pretty-format: 30.3.0 jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 - jest-each@30.2.0: + jest-each@30.3.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 chalk: 4.1.2 - jest-util: 30.2.0 - pretty-format: 30.2.0 - - jest-environment-jsdom@29.7.0(canvas@3.0.0): - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 24.6.1 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3(canvas@3.0.0) - optionalDependencies: - canvas: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + jest-util: 30.3.0 + pretty-format: 30.3.0 - jest-environment-jsdom@30.2.0(canvas@3.0.0): + jest-environment-jsdom@30.3.0(canvas@3.0.0): dependencies: - '@jest/environment': 30.2.0 - '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) - '@types/jsdom': 21.1.7 - '@types/node': 24.6.1 + '@jest/environment': 30.3.0 + '@jest/environment-jsdom-abstract': 30.3.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) jsdom: 26.1.0(canvas@3.0.0) optionalDependencies: canvas: 3.0.0 @@ -12047,29 +11796,29 @@ snapshots: - supports-color - utf-8-validate - jest-environment-node@30.2.0: + jest-environment-node@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/fake-timers': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 - jest-mock: 30.2.0 - jest-util: 30.2.0 - jest-validate: 30.2.0 + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + jest-mock: 30.3.0 + jest-util: 30.3.0 + jest-validate: 30.3.0 jest-get-type@29.6.3: {} - jest-haste-map@30.2.0: + jest-haste-map@30.3.0: dependencies: - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 30.0.1 - jest-util: 30.2.0 - jest-worker: 30.2.0 - micromatch: 4.0.8 + jest-util: 30.3.0 + jest-worker: 30.3.0 + picomatch: 4.0.3 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -12081,10 +11830,10 @@ snapshots: uuid: 8.3.2 xml: 1.0.1 - jest-leak-detector@30.2.0: + jest-leak-detector@30.3.0: dependencies: '@jest/get-type': 30.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 jest-matcher-utils@30.0.5: dependencies: @@ -12093,28 +11842,16 @@ snapshots: jest-diff: 30.0.5 pretty-format: 30.0.5 - jest-matcher-utils@30.2.0: + jest-matcher-utils@30.3.0: dependencies: '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.2.0 - pretty-format: 30.2.0 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + jest-diff: 30.3.0 + pretty-format: 30.3.0 jest-message-util@30.0.5: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 30.0.5 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -12126,7 +11863,7 @@ snapshots: jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -12136,71 +11873,57 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.7.0: + jest-message-util@30.3.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 24.6.1 - jest-util: 29.7.0 + '@babel/code-frame': 7.29.0 + '@jest/types': 30.3.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + pretty-format: 30.3.0 + slash: 3.0.0 + stack-utils: 2.0.6 jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-util: 30.0.5 jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@types/node': 25.4.0 jest-util: 30.2.0 - jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): - optionalDependencies: - jest-resolve: 30.2.0 - - jest-preset-angular@14.6.0(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser-dynamic@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))))(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(canvas@3.0.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(jsdom@26.1.0(canvas@3.0.0))(typescript@5.8.3): + jest-mock@30.3.0: dependencies: - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser-dynamic': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))) - bs-logger: 0.2.6 - esbuild-wasm: 0.25.10 - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - jest-environment-jsdom: 29.7.0(canvas@3.0.0) - jest-util: 29.7.0 - pretty-format: 29.7.0 - ts-jest: 29.4.4(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest-util@29.7.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(typescript@5.8.3) - typescript: 5.8.3 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 + jest-util: 30.3.0 + + jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): optionalDependencies: - esbuild: 0.25.10 - jsdom: 26.1.0(canvas@3.0.0) - transitivePeerDependencies: - - '@babel/core' - - '@jest/transform' - - '@jest/types' - - babel-jest - - bufferutil - - canvas - - supports-color - - utf-8-validate + jest-resolve: 30.3.0 - jest-preset-angular@15.0.2(ccefccc315e3e4bd30d78eb49c90d46a): + jest-preset-angular@16.1.1(135ea37d5312db3eeddee262c6eb1d13): dependencies: - '@angular/compiler-cli': 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/platform-browser-dynamic': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))) + '@angular/compiler-cli': 21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/platform-browser-dynamic': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@21.2.4)(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))) '@jest/environment-jsdom-abstract': 30.2.0(canvas@3.0.0)(jsdom@26.1.0(canvas@3.0.0)) bs-logger: 0.2.6 - esbuild-wasm: 0.25.10 - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) + esbuild-wasm: 0.27.3 + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) jest-util: 30.2.0 jsdom: 26.1.0(canvas@3.0.0) pretty-format: 30.2.0 - ts-jest: 29.4.4(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest-util@30.2.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(typescript@5.8.3) - typescript: 5.8.3 + ts-jest: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3) + typescript: 5.9.3 optionalDependencies: - esbuild: 0.25.10 + esbuild: 0.27.3 transitivePeerDependencies: - '@babel/core' - '@jest/transform' @@ -12210,149 +11933,149 @@ snapshots: jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.2.0: + jest-resolve-dependencies@30.3.0: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.2.0 + jest-snapshot: 30.3.0 transitivePeerDependencies: - supports-color - jest-resolve@30.2.0: + jest-resolve@30.3.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 - jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) - jest-util: 30.2.0 - jest-validate: 30.2.0 + jest-haste-map: 30.3.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.3.0) + jest-util: 30.3.0 + jest-validate: 30.3.0 slash: 3.0.0 unrs-resolver: 1.11.1 - jest-runner@30.2.0: + jest-runner@30.3.0: dependencies: - '@jest/console': 30.2.0 - '@jest/environment': 30.2.0 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/console': 30.3.0 + '@jest/environment': 30.3.0 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-docblock: 30.2.0 - jest-environment-node: 30.2.0 - jest-haste-map: 30.2.0 - jest-leak-detector: 30.2.0 - jest-message-util: 30.2.0 - jest-resolve: 30.2.0 - jest-runtime: 30.2.0 - jest-util: 30.2.0 - jest-watcher: 30.2.0 - jest-worker: 30.2.0 + jest-environment-node: 30.3.0 + jest-haste-map: 30.3.0 + jest-leak-detector: 30.3.0 + jest-message-util: 30.3.0 + jest-resolve: 30.3.0 + jest-runtime: 30.3.0 + jest-util: 30.3.0 + jest-watcher: 30.3.0 + jest-worker: 30.3.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.2.0: + jest-runtime@30.3.0: dependencies: - '@jest/environment': 30.2.0 - '@jest/fake-timers': 30.2.0 - '@jest/globals': 30.2.0 + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/globals': 30.3.0 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/test-result': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 chalk: 4.1.2 - cjs-module-lexer: 2.1.0 - collect-v8-coverage: 1.0.2 - glob: 10.4.5 + cjs-module-lexer: 2.2.0 + collect-v8-coverage: 1.0.3 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-haste-map: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 + jest-haste-map: 30.3.0 + jest-message-util: 30.3.0 + jest-mock: 30.3.0 jest-regex-util: 30.0.1 - jest-resolve: 30.2.0 - jest-snapshot: 30.2.0 - jest-util: 30.2.0 + jest-resolve: 30.3.0 + jest-snapshot: 30.3.0 + jest-util: 30.3.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.2.0: + jest-snapshot@30.3.0: dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.28.4 - '@jest/expect-utils': 30.2.0 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 + '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.2.0 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + '@jest/snapshot-utils': 30.3.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) chalk: 4.1.2 - expect: 30.2.0 + expect: 30.3.0 graceful-fs: 4.2.11 - jest-diff: 30.2.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-util: 30.2.0 - pretty-format: 30.2.0 - semver: 7.7.2 - synckit: 0.11.11 + jest-diff: 30.3.0 + jest-matcher-utils: 30.3.0 + jest-message-util: 30.3.0 + jest-util: 30.3.0 + pretty-format: 30.3.0 + semver: 7.7.4 + synckit: 0.11.12 transitivePeerDependencies: - supports-color - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 24.6.1 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.6.1 + '@types/node': 25.4.0 chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.3 jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@types/node': 25.4.0 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-util@30.3.0: + dependencies: + '@jest/types': 30.3.0 + '@types/node': 25.4.0 chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.3 - jest-validate@30.2.0: + jest-validate@30.3.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.2.0 + pretty-format: 30.3.0 - jest-watcher@30.2.0: + jest-watcher@30.3.0: dependencies: - '@jest/test-result': 30.2.0 - '@jest/types': 30.2.0 - '@types/node': 24.6.1 + '@jest/test-result': 30.3.0 + '@jest/types': 30.3.0 + '@types/node': 25.4.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.2.0 + jest-util: 30.3.0 string-length: 4.0.2 jest-websocket-mock@2.5.0: @@ -12362,24 +12085,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.2.0: + jest-worker@30.3.0: dependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 '@ungap/structured-clone': 1.3.0 - jest-util: 30.2.0 + jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)): + jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: - '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - '@jest/types': 30.2.0 + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) + '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) + jest-cli: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12387,54 +12110,21 @@ snapshots: - supports-color - ts-node - jiti@1.21.7: {} + jiti@2.6.1: {} + + jose@6.1.3: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsdom@20.0.3(canvas@3.0.0): - dependencies: - abab: 2.0.6 - acorn: 8.15.0 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.6.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 - parse5: 7.3.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.3 - xml-name-validator: 4.0.0 - optionalDependencies: - canvas: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - jsdom@26.1.0(canvas@3.0.0): dependencies: cssstyle: 4.6.0 @@ -12444,7 +12134,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 + nwsapi: 2.2.23 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -12455,7 +12145,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.3 + ws: 8.19.0 xml-name-validator: 5.0.0 optionalDependencies: canvas: 3.0.0 @@ -12464,20 +12154,20 @@ snapshots: - supports-color - utf-8-validate - jsesc@3.0.2: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@4.0.0: {} + json-parse-even-better-errors@5.0.0: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -12496,18 +12186,18 @@ snapshots: kind-of@6.0.3: {} - launch-editor@2.10.0: + launch-editor@2.12.0: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 - less-loader@12.3.0(less@4.3.0)(webpack@5.99.8(esbuild@0.25.5)): + less-loader@12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)): dependencies: - less: 4.3.0 + less: 4.4.2 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) - less@4.3.0: + less@4.4.2: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -12528,67 +12218,59 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.99.8(esbuild@0.25.5)): + license-webpack-plugin@4.0.2(webpack@5.104.1(esbuild@0.27.2)): dependencies: - webpack-sources: 3.3.3 + webpack-sources: 3.3.4 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) lines-and-columns@1.2.4: {} - listr2@8.3.3: + listr2@9.0.5: dependencies: - cli-truncate: 4.0.0 + cli-truncate: 5.2.0 colorette: 2.0.20 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.2 - listr2@9.0.1: + lmdb@3.4.4: dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 - - lmdb@3.3.0: - dependencies: - msgpackr: 1.11.5 + msgpackr: 1.11.8 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.0 + ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.3.0 - '@lmdb/lmdb-darwin-x64': 3.3.0 - '@lmdb/lmdb-linux-arm': 3.3.0 - '@lmdb/lmdb-linux-arm64': 3.3.0 - '@lmdb/lmdb-linux-x64': 3.3.0 - '@lmdb/lmdb-win32-arm64': 3.3.0 - '@lmdb/lmdb-win32-x64': 3.3.0 + '@lmdb/lmdb-darwin-arm64': 3.4.4 + '@lmdb/lmdb-darwin-x64': 3.4.4 + '@lmdb/lmdb-linux-arm': 3.4.4 + '@lmdb/lmdb-linux-arm64': 3.4.4 + '@lmdb/lmdb-linux-x64': 3.4.4 + '@lmdb/lmdb-win32-arm64': 3.4.4 + '@lmdb/lmdb-win32-x64': 3.4.4 optional: true - lmdb@3.4.2: + lmdb@3.5.1: dependencies: - msgpackr: 1.11.5 + '@harperfast/extended-iterable': 1.0.3 + msgpackr: 1.11.8 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.0 + ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.4.2 - '@lmdb/lmdb-darwin-x64': 3.4.2 - '@lmdb/lmdb-linux-arm': 3.4.2 - '@lmdb/lmdb-linux-arm64': 3.4.2 - '@lmdb/lmdb-linux-x64': 3.4.2 - '@lmdb/lmdb-win32-arm64': 3.4.2 - '@lmdb/lmdb-win32-x64': 3.4.2 + '@lmdb/lmdb-darwin-arm64': 3.5.1 + '@lmdb/lmdb-darwin-x64': 3.5.1 + '@lmdb/lmdb-linux-arm': 3.5.1 + '@lmdb/lmdb-linux-arm64': 3.5.1 + '@lmdb/lmdb-linux-x64': 3.5.1 + '@lmdb/lmdb-win32-arm64': 3.5.1 + '@lmdb/lmdb-win32-x64': 3.5.1 optional: true - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} loader-utils@2.0.4: dependencies: @@ -12612,32 +12294,32 @@ snapshots: lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} + lodash@4.17.23: {} - lodash@4.17.21: {} - - log-symbols@6.0.0: + log-symbols@7.0.1: dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 log-update@6.1.0: dependencies: - ansi-escapes: 7.1.1 + ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 9.0.2 lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.6: {} + + lru-cache@11.2.7: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - magic-string@0.30.17: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12649,23 +12331,23 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 make-error@1.3.6: {} - make-fetch-happen@14.0.3: + make-fetch-happen@15.0.4: dependencies: - '@npmcli/agent': 3.0.0 - cacache: 19.0.1 + '@gar/promise-retry': 1.0.2 + '@npmcli/agent': 4.0.0 + cacache: 20.0.3 http-cache-semantics: 4.2.0 - minipass: 7.1.2 - minipass-fetch: 4.0.1 + minipass: 7.1.3 + minipass-fetch: 5.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 1.0.0 - proc-log: 5.0.0 - promise-retry: 2.0.1 - ssri: 12.0.0 + proc-log: 6.1.0 + ssri: 13.0.1 transitivePeerDependencies: - supports-color @@ -12681,11 +12363,21 @@ snapshots: media-typer@1.1.0: {} - memfs@4.17.2: - dependencies: - '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - tree-dump: 1.0.3(tslib@2.8.1) + memfs@4.56.10(tslib@2.8.1): + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 merge-descriptors@1.0.3: {} @@ -12694,8 +12386,6 @@ snapshots: merge-stream@2.0.0: {} - merge2@1.4.1: {} - methods@1.1.2: {} micromatch@4.0.8: @@ -12713,7 +12403,7 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -12729,23 +12419,23 @@ snapshots: mimic-response@3.1.0: optional: true - mini-css-extract-plugin@2.9.2(webpack@5.99.8(esbuild@0.25.5)): + mini-css-extract-plugin@2.9.4(webpack@5.104.1(esbuild@0.27.2)): dependencies: - schema-utils: 4.3.2 - tapable: 2.2.3 - webpack: 5.99.8(esbuild@0.25.5) + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.104.1(esbuild@0.27.2) minimalistic-assert@1.0.1: {} - minimatch@10.0.3: + minimatch@10.2.4: dependencies: - '@isaacs/brace-expansion': 5.0.0 + brace-expansion: 5.0.4 - minimatch@3.1.2: + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 @@ -12753,15 +12443,15 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 - minipass-fetch@4.0.1: + minipass-fetch@5.0.2: dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 + minipass: 7.1.3 + minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: - encoding: 0.1.13 + iconv-lite: 0.7.2 minipass-flush@1.0.5: dependencies: @@ -12771,26 +12461,19 @@ snapshots: dependencies: minipass: 3.3.6 - minipass-sized@1.0.3: + minipass-sized@2.0.0: dependencies: - minipass: 3.3.6 + minipass: 7.1.3 minipass@3.3.6: dependencies: yallist: 4.0.0 - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass@7.1.3: {} minizlib@3.1.0: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 mkdirp-classic@0.5.3: optional: true @@ -12817,7 +12500,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.5: + msgpackr@1.11.8: optionalDependencies: msgpackr-extract: 3.0.3 optional: true @@ -12831,17 +12514,17 @@ snapshots: nanoid@3.3.11: {} - napi-build-utils@1.0.2: + napi-build-utils@2.0.0: optional: true - napi-postinstall@0.3.3: {} + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.4.1 + sax: 1.4.4 optional: true negotiator@0.6.3: {} @@ -12852,59 +12535,54 @@ snapshots: neo-async@2.6.2: {} - ng2-pdf-viewer@10.4.0: + ngx-bootstrap-icons@1.9.3(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - pdfjs-dist: 4.8.69 + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-bootstrap-icons@1.9.3(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)): + ngx-color@10.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - tslib: 2.8.1 - - ngx-color@10.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)): - dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) '@ctrl/tinycolor': 4.2.0 material-colors: 1.2.6 tslib: 2.8.1 - ngx-cookie-service@20.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)): + ngx-cookie-service@21.1.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-device-detector@10.1.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)): + ngx-device-detector@11.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)): dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - ngx-ui-tour-core@15.0.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/router@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(rxjs@7.8.2): + ngx-ui-tour-core@16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2): dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/router': 20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/router': 21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 - ngx-ui-tour-ng-bootstrap@17.0.1(a51ec0d773a3e93ac3d51d20ca771021): + ngx-ui-tour-ng-bootstrap@18.0.0(f247d97663488c516a027bc34de144d4): dependencies: - '@angular/common': 20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) - '@ng-bootstrap/ng-bootstrap': 19.0.1(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/localize@20.3.2(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2))(@popperjs/core@2.11.8)(rxjs@7.8.2) - ngx-ui-tour-core: 15.0.0(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/router@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/common': 21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1) + '@ng-bootstrap/ng-bootstrap': 20.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/forms@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(@angular/localize@21.2.4(@angular/compiler-cli@21.2.4(@angular/compiler@21.2.4)(typescript@5.9.3))(@angular/compiler@21.2.4))(@popperjs/core@2.11.8)(rxjs@7.8.2) + ngx-ui-tour-core: 16.0.0(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/router@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.4(@angular/common@21.2.4(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.4(@angular/compiler@21.2.4)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2))(rxjs@7.8.2) tslib: 2.8.1 transitivePeerDependencies: - '@angular/router' - rxjs - node-abi@3.71.0: + node-abi@3.89.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 optional: true node-addon-api@6.1.0: @@ -12913,86 +12591,80 @@ snapshots: node-addon-api@7.1.1: optional: true - node-forge@1.3.1: {} + node-forge@1.3.3: {} node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.1.1 + detect-libc: 2.1.2 optional: true - node-gyp@11.4.2: + node-gyp@12.2.0: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.2 + exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 14.0.3 - nopt: 8.1.0 - proc-log: 5.0.0 - semver: 7.7.2 - tar: 7.5.1 + make-fetch-happen: 15.0.4 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.7.4 + tar: 7.5.9 tinyglobby: 0.2.15 - which: 5.0.0 + which: 6.0.1 transitivePeerDependencies: - supports-color node-int64@0.4.0: {} - node-releases@2.0.21: {} + node-readable-to-web-readable-stream@0.4.2: + optional: true + + node-releases@2.0.27: {} - nopt@8.1.0: + nopt@9.0.0: dependencies: - abbrev: 3.0.1 + abbrev: 4.0.0 normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - - npm-bundled@4.0.0: + npm-bundled@5.0.0: dependencies: - npm-normalize-package-bin: 4.0.0 + npm-normalize-package-bin: 5.0.0 - npm-install-checks@7.1.2: + npm-install-checks@8.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 - npm-normalize-package-bin@4.0.0: {} - - npm-package-arg@12.0.2: - dependencies: - hosted-git-info: 8.1.0 - proc-log: 5.0.0 - semver: 7.7.2 - validate-npm-package-name: 6.0.2 + npm-normalize-package-bin@5.0.0: {} - npm-package-arg@13.0.0: + npm-package-arg@13.0.2: dependencies: - hosted-git-info: 9.0.0 - proc-log: 5.0.0 - semver: 7.7.2 - validate-npm-package-name: 6.0.2 + hosted-git-info: 9.0.2 + proc-log: 6.1.0 + semver: 7.7.4 + validate-npm-package-name: 7.0.2 - npm-packlist@10.0.2: + npm-packlist@10.0.4: dependencies: ignore-walk: 8.0.0 - proc-log: 5.0.0 + proc-log: 6.1.0 - npm-pick-manifest@10.0.0: + npm-pick-manifest@11.0.3: dependencies: - npm-install-checks: 7.1.2 - npm-normalize-package-bin: 4.0.0 - npm-package-arg: 12.0.2 - semver: 7.7.2 + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.2 + semver: 7.7.4 - npm-registry-fetch@18.0.2: + npm-registry-fetch@19.1.1: dependencies: - '@npmcli/redact': 3.2.2 + '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 14.0.3 - minipass: 7.1.2 - minipass-fetch: 4.0.1 + make-fetch-happen: 15.0.4 + minipass: 7.1.3 + minipass-fetch: 5.0.2 minizlib: 3.1.0 - npm-package-arg: 12.0.2 - proc-log: 5.0.0 + npm-package-arg: 13.0.2 + proc-log: 6.1.0 transitivePeerDependencies: - supports-color @@ -13004,7 +12676,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.22: {} + nwsapi@2.2.23: {} object-assign@4.1.1: {} @@ -13016,7 +12688,7 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} + on-headers@1.1.0: {} once@1.4.0: dependencies: @@ -13030,12 +12702,21 @@ snapshots: dependencies: mimic-function: 5.0.1 - open@10.1.2: + open@10.2.0: dependencies: - default-browser: 5.2.1 + default-browser: 5.4.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 - is-wsl: 3.1.0 + wsl-utils: 0.1.0 + + open@11.0.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 optionator@0.9.4: dependencies: @@ -13046,19 +12727,30 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@8.2.0: + ora@9.0.0: dependencies: chalk: 5.6.2 cli-cursor: 5.0.0 - cli-spinners: 2.9.2 + cli-spinners: 3.4.0 is-interactive: 2.0.0 is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 + log-symbols: 7.0.1 stdin-discarder: 0.2.2 - string-width: 7.2.0 + string-width: 8.2.0 strip-ansi: 7.1.2 - ordered-binary@1.6.0: + ora@9.3.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.1 + string-width: 8.2.0 + + ordered-binary@1.6.1: optional: true p-limit@2.3.0: @@ -13077,37 +12769,37 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.3: {} + p-map@7.0.4: {} p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.1.0 + is-network-error: 1.3.0 retry: 0.13.1 p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - pacote@21.0.0: + pacote@21.3.1: dependencies: - '@npmcli/git': 6.0.3 - '@npmcli/installed-package-contents': 3.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.3 - '@npmcli/run-script': 9.1.0 - cacache: 19.0.1 + '@npmcli/git': 7.0.2 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + '@npmcli/run-script': 10.0.4 + cacache: 20.0.3 fs-minipass: 3.0.3 - minipass: 7.1.2 - npm-package-arg: 12.0.2 - npm-packlist: 10.0.2 - npm-pick-manifest: 10.0.0 - npm-registry-fetch: 18.0.2 - proc-log: 5.0.0 + minipass: 7.1.3 + npm-package-arg: 13.0.2 + npm-packlist: 10.0.4 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + proc-log: 6.1.0 promise-retry: 2.0.1 - sigstore: 3.1.0 - ssri: 12.0.0 - tar: 6.2.1 + sigstore: 4.1.0 + ssri: 13.0.1 + tar: 7.5.9 transitivePeerDependencies: - supports-color @@ -13119,29 +12811,19 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-node-version@1.0.1: {} - parse5-html-rewriting-stream@7.1.0: - dependencies: - entities: 6.0.1 - parse5: 7.3.0 - parse5-sax-parser: 7.0.0 - parse5-html-rewriting-stream@8.0.0: dependencies: entities: 6.0.1 parse5: 8.0.0 parse5-sax-parser: 8.0.0 - parse5-sax-parser@7.0.0: - dependencies: - parse5: 7.3.0 - parse5-sax-parser@8.0.0: dependencies: parse5: 8.0.0 @@ -13167,26 +12849,26 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.3 path-to-regexp@0.1.12: {} path-to-regexp@8.3.0: {} - path2d@0.2.2: - optional: true - - pdfjs-dist@4.8.69: + pdfjs-dist@5.4.624: optionalDependencies: - canvas: 3.0.0 - path2d: 0.2.2 + '@napi-rs/canvas': 0.1.90 + node-readable-to-web-readable-stream: 0.4.2 picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pify@4.0.1: @@ -13194,103 +12876,99 @@ snapshots: pirates@4.0.7: {} - piscina@5.1.1: - optionalDependencies: - '@napi-rs/nice': 1.1.1 - - piscina@5.1.3: + piscina@5.1.4: optionalDependencies: '@napi-rs/nice': 1.1.1 - pkce-challenge@5.0.0: {} + pkce-challenge@5.0.1: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - playwright-core@1.55.1: {} + playwright-core@1.58.2: {} - playwright@1.55.1: + playwright@1.58.2: dependencies: - playwright-core: 1.55.1 + playwright-core: 1.58.2 optionalDependencies: fsevents: 2.3.2 - postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.8.3)(webpack@5.99.8(esbuild@0.25.5)): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)): dependencies: - cosmiconfig: 9.0.0(typescript@5.8.3) - jiti: 1.21.7 - postcss: 8.5.3 - semver: 7.7.2 + cosmiconfig: 9.0.0(typescript@5.9.3) + jiti: 2.6.1 + postcss: 8.5.6 + semver: 7.7.4 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - typescript postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.3): + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-modules-local-by-default@4.2.0(postcss@8.5.3): + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-selector-parser: 7.1.0 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.3): + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 - postcss-selector-parser: 7.1.0 + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 - postcss-modules-values@4.0.0(postcss@8.5.3): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + postcss: 8.5.6 - postcss-selector-parser@7.1.0: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.5.3: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + powershell-utils@0.1.0: {} + + prebuild-install@7.1.3: dependencies: - detect-libc: 2.1.1 + detect-libc: 2.1.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.71.0 - pump: 3.0.2 + napi-build-utils: 2.0.0 + node-abi: 3.89.0 + pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.4 tunnel-agent: 0.6.0 optional: true prelude-ls@1.2.1: {} - prettier-plugin-organize-imports@4.3.0(prettier@3.4.2)(typescript@5.8.3): + prettier-plugin-organize-imports@4.3.0(prettier@3.4.2)(typescript@5.9.3): dependencies: prettier: 3.4.2 - typescript: 5.8.3 + typescript: 5.9.3 prettier@3.4.2: {} @@ -13312,7 +12990,13 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - proc-log@5.0.0: {} + pretty-format@30.3.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + proc-log@6.1.0: {} process-nextick-args@2.0.1: {} @@ -13329,11 +13013,9 @@ snapshots: prr@1.0.1: optional: true - psl@1.9.0: {} - - pump@3.0.2: + pump@3.0.4: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 optional: true @@ -13341,36 +13023,32 @@ snapshots: pure-rand@7.0.1: {} - qs@6.13.0: + qs@6.14.2: dependencies: side-channel: 1.1.0 - qs@6.14.0: + qs@6.15.0: dependencies: side-channel: 1.1.0 - querystringify@2.2.0: {} - - queue-microtask@1.2.3: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@2.5.3: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.1: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.7.0 + http-errors: 2.0.1 + iconv-lite: 0.7.2 unpipe: 1.0.0 rc@1.2.8: @@ -13405,9 +13083,11 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.0.0: {} + reflect-metadata@0.2.2: {} - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -13415,20 +13095,20 @@ snapshots: regex-parser@2.3.1: {} - regexpu-core@6.2.0: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 + regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.12.0: + regjsparser@0.13.0: dependencies: - jsesc: 3.0.2 + jsesc: 3.1.0 require-directory@2.1.1: {} @@ -13449,10 +13129,10 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.3 + postcss: 8.5.6 source-map: 0.6.1 - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -13467,83 +13147,75 @@ snapshots: retry@0.13.1: {} - reusify@1.1.0: {} - rfdc@1.4.1: {} - rolldown@1.0.0-beta.38: + rolldown@1.0.0-beta.58: dependencies: - '@oxc-project/types': 0.89.0 - '@rolldown/pluginutils': 1.0.0-beta.38 - ansis: 4.2.0 + '@oxc-project/types': 0.106.0 + '@rolldown/pluginutils': 1.0.0-beta.58 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.38 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.38 - '@rolldown/binding-darwin-x64': 1.0.0-beta.38 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.38 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.38 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.38 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.38 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.38 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.38 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.38 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.38 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.38 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.38 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.38 - - rollup@4.40.2: - dependencies: - '@types/estree': 1.0.7 + '@rolldown/binding-android-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-x64': 1.0.0-beta.58 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 + + rolldown@1.0.0-rc.4: + dependencies: + '@oxc-project/types': 0.113.0 + '@rolldown/pluginutils': 1.0.0-rc.4 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 - fsevents: 2.3.3 - - rollup@4.52.3: + '@rolldown/binding-android-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-x64': 1.0.0-rc.4 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 + + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.3 - '@rollup/rollup-android-arm64': 4.52.3 - '@rollup/rollup-darwin-arm64': 4.52.3 - '@rollup/rollup-darwin-x64': 4.52.3 - '@rollup/rollup-freebsd-arm64': 4.52.3 - '@rollup/rollup-freebsd-x64': 4.52.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.3 - '@rollup/rollup-linux-arm-musleabihf': 4.52.3 - '@rollup/rollup-linux-arm64-gnu': 4.52.3 - '@rollup/rollup-linux-arm64-musl': 4.52.3 - '@rollup/rollup-linux-loong64-gnu': 4.52.3 - '@rollup/rollup-linux-ppc64-gnu': 4.52.3 - '@rollup/rollup-linux-riscv64-gnu': 4.52.3 - '@rollup/rollup-linux-riscv64-musl': 4.52.3 - '@rollup/rollup-linux-s390x-gnu': 4.52.3 - '@rollup/rollup-linux-x64-gnu': 4.52.3 - '@rollup/rollup-linux-x64-musl': 4.52.3 - '@rollup/rollup-openharmony-arm64': 4.52.3 - '@rollup/rollup-win32-arm64-msvc': 4.52.3 - '@rollup/rollup-win32-ia32-msvc': 4.52.3 - '@rollup/rollup-win32-x64-gnu': 4.52.3 - '@rollup/rollup-win32-x64-msvc': 4.52.3 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 router@2.2.0: @@ -13558,11 +13230,7 @@ snapshots: rrweb-cssom@0.8.0: {} - run-applescript@7.0.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 + run-applescript@7.1.0: {} rxjs@7.8.2: dependencies: @@ -13574,84 +13242,86 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.5(sass@1.88.0)(webpack@5.99.8(esbuild@0.25.5)): + sass-loader@16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.88.0 - webpack: 5.99.8(esbuild@0.25.5) + sass: 1.97.1 + webpack: 5.104.1(esbuild@0.27.2) - sass@1.88.0: + sass@1.97.1: dependencies: chokidar: 4.0.3 - immutable: 5.1.3 + immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 - sass@1.90.0: + sass@1.97.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.3 + immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 - sax@1.4.1: + sax@1.4.4: optional: true saxes@6.0.0: dependencies: xmlchars: 2.2.0 - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 2.1.1(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.18.0) select-hose@2.0.0: {} selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 + '@types/node-forge': 1.3.14 + node-forge: 1.3.3 semver@5.7.2: optional: true semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} + + semver@7.7.4: {} - send@0.19.0: + send@0.19.2: dependencies: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - send@1.2.0: + send@1.2.1: dependencies: debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 + http-errors: 2.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 @@ -13663,38 +13333,36 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-index@1.9.1: + serve-index@1.9.2: dependencies: accepts: 1.3.8 batch: 0.6.1 debug: 2.6.9 escape-html: 1.0.3 - http-errors: 1.6.3 + http-errors: 1.8.1 mime-types: 2.1.35 parseurl: 1.3.3 transitivePeerDependencies: - supports-color - serve-static@1.16.2: + serve-static@1.16.3: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 0.19.2 transitivePeerDependencies: - supports-color - serve-static@2.2.0: + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.0 + send: 1.2.1 transitivePeerDependencies: - supports-color - setprototypeof@1.1.0: {} - setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -13741,14 +13409,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@3.1.0: + sigstore@4.1.0: dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - '@sigstore/sign': 3.1.0 - '@sigstore/tuf': 3.1.1 - '@sigstore/verify': 2.1.1 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/sign': 4.1.0 + '@sigstore/tuf': 4.0.1 + '@sigstore/verify': 3.1.0 transitivePeerDependencies: - supports-color @@ -13771,12 +13439,12 @@ snapshots: slash@3.0.0: {} - slice-ansi@5.0.0: + slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 - is-fullwidth-code-point: 4.0.0 + is-fullwidth-code-point: 5.1.0 - slice-ansi@7.1.2: + slice-ansi@8.0.0: dependencies: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 @@ -13799,16 +13467,16 @@ snapshots: socks@2.8.7: dependencies: - ip-address: 10.0.1 + ip-address: 10.1.0 smart-buffer: 4.2.0 source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.99.8(esbuild@0.25.5)): + source-map-loader@5.0.0(webpack@5.104.1(esbuild@0.27.2)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) source-map-support@0.5.13: dependencies: @@ -13822,23 +13490,16 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} - source-map@0.7.6: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 - spdx-exceptions@2.5.0: {} - spdx-expression-parse@3.0.1: + spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + spdx-license-ids: 3.0.23 - spdx-license-ids@3.0.22: {} + spdx-license-ids@3.0.23: {} spdy-transport@3.0.0: dependencies: @@ -13863,9 +13524,9 @@ snapshots: sprintf-js@1.0.3: {} - ssri@12.0.0: + ssri@13.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 stack-utils@2.0.6: dependencies: @@ -13873,12 +13534,12 @@ snapshots: statuses@1.5.0: {} - statuses@2.0.1: {} - statuses@2.0.2: {} stdin-discarder@0.2.2: {} + stdin-discarder@0.3.1: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -13894,13 +13555,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + emoji-regex: 10.6.0 + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 string_decoder@1.1.1: dependencies: @@ -13918,6 +13584,10 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -13941,77 +13611,68 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.11: + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 - tapable@2.2.3: {} + tapable@2.3.0: {} - tar-fs@2.1.1: + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.2 + pump: 3.0.4 tar-stream: 2.2.0 optional: true tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 optional: true - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - tar@7.5.1: + tar@7.5.9: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 - minipass: 7.1.2 + minipass: 7.1.3 minizlib: 3.1.0 yallist: 5.0.0 - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5)): + terser-webpack-plugin@5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.99.8(esbuild@0.25.5) + terser: 5.46.0 + webpack: 5.104.1(esbuild@0.27.2) optionalDependencies: - esbuild: 0.25.5 + esbuild: 0.27.2 - terser-webpack-plugin@5.3.14(webpack@5.102.0): + terser-webpack-plugin@5.3.16(webpack@5.105.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.102.0 + terser: 5.46.0 + webpack: 5.105.3 - terser@5.39.1: + terser@5.44.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 - terser@5.44.0: + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -14019,24 +13680,14 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 - minimatch: 3.1.2 + minimatch: 3.1.5 - thingies@1.21.0(tslib@2.8.1): + thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 thunky@1.1.0: {} - tinyglobby@0.2.13: - dependencies: - fdir: 6.5.0(picomatch@4.0.2) - picomatch: 4.0.2 - - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -14056,92 +13707,60 @@ snapshots: toidentifier@1.0.1: {} - tough-cookie@4.1.4: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - tough-cookie@5.1.2: dependencies: tldts: 6.1.86 - tr46@3.0.0: - dependencies: - punycode: 2.3.1 - tr46@5.1.1: dependencies: punycode: 2.3.1 - tree-dump@1.0.3(tslib@2.8.1): + tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 - - ts-jest@29.4.4(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest-util@29.7.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(typescript@5.8.3): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.8 - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.2 - type-fest: 4.41.0 - typescript: 5.8.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.28.4 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.28.4) - esbuild: 0.25.10 - jest-util: 29.7.0 + typescript: 5.9.3 - ts-jest@29.4.4(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest-util@30.2.0)(jest@30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(esbuild@0.27.3)(jest-util@30.2.0)(jest@30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.2.0(@types/node@24.6.1)(ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3)) + jest: 30.3.0(@types/node@25.4.0)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.2 + semver: 7.7.4 type-fest: 4.41.0 - typescript: 5.8.3 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.28.4 - '@jest/transform': 30.2.0 - '@jest/types': 30.2.0 - babel-jest: 30.2.0(@babel/core@7.28.4) - esbuild: 0.25.10 + '@babel/core': 7.29.0 + '@jest/transform': 30.3.0 + '@jest/types': 30.3.0 + babel-jest: 30.3.0(@babel/core@7.29.0) + esbuild: 0.27.3 jest-util: 30.2.0 - ts-node@10.9.2(@types/node@24.6.1)(typescript@5.8.3): + ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.6.1 + '@types/node': 25.4.0 acorn: 8.14.0 acorn-walk: 8.3.1 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.3 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -14153,11 +13772,11 @@ snapshots: tslib@2.8.1: {} - tuf-js@3.1.0: + tuf-js@4.1.0: dependencies: - '@tufjs/models': 3.0.1 + '@tufjs/models': 4.1.0 debug: 4.4.3 - make-fetch-happen: 14.0.3 + make-fetch-happen: 15.0.4 transitivePeerDependencies: - supports-color @@ -14187,54 +13806,56 @@ snapshots: dependencies: content-type: 1.0.5 media-typer: 1.1.0 - mime-types: 3.0.1 + mime-types: 3.0.2 typed-assert@1.0.9: {} - typescript@5.8.3: {} + typescript@5.9.3: {} uglify-js@3.19.3: optional: true - undici-types@7.13.0: {} + undici-types@7.18.2: {} undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 + undici@7.18.2: {} + + undici@7.22.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 + unicode-property-aliases-ecmascript: 2.2.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@2.2.0: {} - unique-filename@4.0.0: + unique-filename@5.0.0: dependencies: - unique-slug: 5.0.0 + unique-slug: 6.0.0 - unique-slug@5.0.0: + unique-slug@6.0.0: dependencies: imurmurhash: 0.1.4 universal-user-agent@6.0.1: {} - universalify@0.2.0: {} - unpipe@1.0.0: {} unplugin@1.16.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 webpack-virtual-modules: 0.6.2 unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.3 + napi-postinstall: 0.3.4 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -14256,9 +13877,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.3(browserslist@4.26.3): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.26.3 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -14266,11 +13887,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - utif@3.1.0: dependencies: pako: 1.0.11 @@ -14291,53 +13907,44 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - validate-npm-package-name@6.0.2: {} + validate-npm-package-name@7.0.2: {} vary@1.1.2: {} - vite@6.3.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(yaml@2.7.0): + vite@7.3.0(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(yaml@2.7.0): dependencies: - esbuild: 0.25.5 - fdir: 6.5.0(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.2 - tinyglobby: 0.2.13 + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.59.0 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 fsevents: 2.3.3 - jiti: 1.21.7 - less: 4.3.0 - sass: 1.88.0 - terser: 5.39.1 + jiti: 2.6.1 + less: 4.4.2 + sass: 1.97.1 + terser: 5.44.1 yaml: 2.7.0 - vite@7.1.5(@types/node@24.6.1)(jiti@1.21.7)(less@4.3.0)(sass@1.90.0)(terser@5.39.1)(yaml@2.7.0): + vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(less@4.4.2)(sass@1.97.3)(terser@5.44.1)(yaml@2.7.0): dependencies: - esbuild: 0.25.9 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 25.4.0 fsevents: 2.3.3 - jiti: 1.21.7 - less: 4.3.0 - sass: 1.90.0 - terser: 5.39.1 + jiti: 2.6.1 + less: 4.4.2 + sass: 1.97.3 + terser: 5.44.1 yaml: 2.7.0 - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -14346,12 +13953,12 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.2: + watchpack@2.5.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - watchpack@2.4.4: + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -14365,102 +13972,108 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@7.4.2(webpack@5.102.0): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)): dependencies: colorette: 2.0.20 - memfs: 4.17.2 - mime-types: 2.1.35 + memfs: 4.56.10(tslib@2.8.1) + mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.102.0 + webpack: 5.104.1(esbuild@0.27.2) + transitivePeerDependencies: + - tslib - webpack-dev-middleware@7.4.2(webpack@5.99.8(esbuild@0.25.5)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.3): dependencies: colorette: 2.0.20 - memfs: 4.17.2 - mime-types: 2.1.35 + memfs: 4.56.10(tslib@2.8.1) + mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.105.3 + transitivePeerDependencies: + - tslib - webpack-dev-server@5.2.1(webpack@5.102.0): + webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.8.0 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 - express: 4.21.2 + express: 4.22.1 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + launch-editor: 2.12.0 + open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.102.0) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) + ws: 8.19.0 optionalDependencies: - webpack: 5.102.0 + webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - bufferutil - debug - supports-color + - tslib - utf-8-validate - webpack-dev-server@5.2.1(webpack@5.99.8(esbuild@0.25.5)): + webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.3): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.8.0 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 - express: 4.21.2 + express: 4.22.1 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + launch-editor: 2.12.0 + open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.8(esbuild@0.25.5)) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.3) + ws: 8.19.0 optionalDependencies: - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.105.3 transitivePeerDependencies: - bufferutil - debug - supports-color + - tslib - utf-8-validate webpack-merge@6.0.1: @@ -14469,16 +14082,16 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.3.3: {} + webpack-sources@3.3.4: {} - webpack-subresource-integrity@5.1.0(webpack@5.99.8(esbuild@0.25.5)): + webpack-subresource-integrity@5.1.0(webpack@5.104.1(esbuild@0.27.2)): dependencies: typed-assert: 1.0.9 - webpack: 5.99.8(esbuild@0.25.5) + webpack: 5.104.1(esbuild@0.27.2) webpack-virtual-modules@0.6.2: {} - webpack@5.102.0: + webpack@5.104.1(esbuild@0.27.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -14486,31 +14099,31 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.3 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.20.0 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(webpack@5.102.0) - watchpack: 2.4.4 - webpack-sources: 3.3.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)) + watchpack: 2.5.1 + webpack-sources: 3.3.4 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.99.8(esbuild@0.25.5): + webpack@5.105.3: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -14518,24 +14131,25 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.26.3 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.20.0 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.99.8(esbuild@0.25.5)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(webpack@5.105.3) + watchpack: 2.5.1 + webpack-sources: 3.3.4 transitivePeerDependencies: - '@swc/core' - esbuild @@ -14549,23 +14163,12 @@ snapshots: websocket-extensions@0.1.4: {} - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: {} - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - whatwg-url@14.2.0: dependencies: tr46: 5.1.1 @@ -14575,9 +14178,9 @@ snapshots: dependencies: isexe: 2.0.0 - which@5.0.0: + which@6.0.1: dependencies: - isexe: 3.1.1 + isexe: 4.0.0 wildcard@2.0.1: {} @@ -14601,13 +14204,13 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrappy@1.0.2: {} @@ -14616,9 +14219,16 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.3: {} + ws@8.19.0: {} - xml-name-validator@4.0.0: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 xml-name-validator@5.0.0: {} @@ -14666,10 +14276,14 @@ snapshots: yoctocolors-cjs@2.1.3: {} - zod-to-json-schema@3.24.6(zod@3.25.76): + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.1(zod@4.3.6): dependencies: - zod: 3.25.76 + zod: 4.3.6 zod@3.25.76: {} - zone.js@0.15.1: {} + zod@4.3.6: {} + + zone.js@0.16.1: {} diff --git a/src-ui/setup-jest.ts b/src-ui/setup-jest.ts index c7bcabddb5..86e447b599 100644 --- a/src-ui/setup-jest.ts +++ b/src-ui/setup-jest.ts @@ -28,6 +28,7 @@ import localeFa from '@angular/common/locales/fa' import localeFi from '@angular/common/locales/fi' import localeFr from '@angular/common/locales/fr' import localeHu from '@angular/common/locales/hu' +import localeId from '@angular/common/locales/id' import localeIt from '@angular/common/locales/it' import localeJa from '@angular/common/locales/ja' import localeKo from '@angular/common/locales/ko' @@ -63,6 +64,7 @@ registerLocaleData(localeFa) registerLocaleData(localeFi) registerLocaleData(localeFr) registerLocaleData(localeHu) +registerLocaleData(localeId) registerLocaleData(localeIt) registerLocaleData(localeJa) registerLocaleData(localeKo) @@ -98,10 +100,10 @@ const mock = () => { } } -Object.defineProperty(window, 'open', { value: jest.fn() }) -Object.defineProperty(window, 'localStorage', { value: mock() }) -Object.defineProperty(window, 'sessionStorage', { value: mock() }) -Object.defineProperty(window, 'getComputedStyle', { +Object.defineProperty(globalThis, 'open', { value: jest.fn() }) +Object.defineProperty(globalThis, 'localStorage', { value: mock() }) +Object.defineProperty(globalThis, 'sessionStorage', { value: mock() }) +Object.defineProperty(globalThis, 'getComputedStyle', { value: () => ['-webkit-appearance'], }) Object.defineProperty(navigator, 'clipboard', { @@ -113,13 +115,33 @@ Object.defineProperty(navigator, 'canShare', { value: () => true }) if (!navigator.share) { Object.defineProperty(navigator, 'share', { value: jest.fn() }) } -if (!URL.createObjectURL) { - Object.defineProperty(window.URL, 'createObjectURL', { value: jest.fn() }) +if (!globalThis.URL.createObjectURL) { + Object.defineProperty(globalThis.URL, 'createObjectURL', { value: jest.fn() }) } -if (!URL.revokeObjectURL) { - Object.defineProperty(window.URL, 'revokeObjectURL', { value: jest.fn() }) +if (!globalThis.URL.revokeObjectURL) { + Object.defineProperty(globalThis.URL, 'revokeObjectURL', { value: jest.fn() }) } -Object.defineProperty(window, 'ResizeObserver', { value: mock() }) +class MockResizeObserver { + private readonly callback: ResizeObserverCallback + + constructor(callback: ResizeObserverCallback) { + this.callback = callback + } + + observe = jest.fn() + unobserve = jest.fn() + disconnect = jest.fn() + + trigger = (entries: ResizeObserverEntry[] = []) => { + this.callback(entries, this) + } +} + +Object.defineProperty(globalThis, 'ResizeObserver', { + writable: true, + configurable: true, + value: MockResizeObserver, +}) if (typeof IntersectionObserver === 'undefined') { class MockIntersectionObserver { @@ -134,7 +156,7 @@ if (typeof IntersectionObserver === 'undefined') { takeRecords = jest.fn() } - Object.defineProperty(window, 'IntersectionObserver', { + Object.defineProperty(globalThis, 'IntersectionObserver', { writable: true, configurable: true, value: MockIntersectionObserver, @@ -145,6 +167,10 @@ HTMLCanvasElement.prototype.getContext = < typeof HTMLCanvasElement.prototype.getContext >jest.fn() +if (!HTMLElement.prototype.scrollTo) { + HTMLElement.prototype.scrollTo = jest.fn() +} + jest.mock('uuid', () => ({ v4: jest.fn(() => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char: string) => { diff --git a/src-ui/src/app/app-routing.module.ts b/src-ui/src/app/app-routing.module.ts index f65514f744..66864a0d54 100644 --- a/src-ui/src/app/app-routing.module.ts +++ b/src-ui/src/app/app-routing.module.ts @@ -11,13 +11,9 @@ import { DashboardComponent } from './components/dashboard/dashboard.component' import { DocumentAsnComponent } from './components/document-asn/document-asn.component' import { DocumentDetailComponent } from './components/document-detail/document-detail.component' import { DocumentListComponent } from './components/document-list/document-list.component' -import { CorrespondentListComponent } from './components/manage/correspondent-list/correspondent-list.component' -import { CustomFieldsComponent } from './components/manage/custom-fields/custom-fields.component' -import { DocumentTypeListComponent } from './components/manage/document-type-list/document-type-list.component' +import { DocumentAttributesComponent } from './components/manage/document-attributes/document-attributes.component' import { MailComponent } from './components/manage/mail/mail.component' import { SavedViewsComponent } from './components/manage/saved-views/saved-views.component' -import { StoragePathListComponent } from './components/manage/storage-path-list/storage-path-list.component' -import { TagListComponent } from './components/manage/tag-list/tag-list.component' import { WorkflowsComponent } from './components/manage/workflows/workflows.component' import { NotFoundComponent } from './components/not-found/not-found.component' import { DirtyDocGuard } from './guards/dirty-doc.guard' @@ -106,52 +102,76 @@ export const routes: Routes = [ }, }, { - path: 'tags', - component: TagListComponent, + path: 'attributes', + component: DocumentAttributesComponent, canActivate: [PermissionsGuard], data: { - requiredPermission: { - action: PermissionAction.View, - type: PermissionType.Tag, - }, - componentName: 'TagListComponent', + requiredPermissionAny: [ + { action: PermissionAction.View, type: PermissionType.Tag }, + { + action: PermissionAction.View, + type: PermissionType.Correspondent, + }, + { + action: PermissionAction.View, + type: PermissionType.DocumentType, + }, + { action: PermissionAction.View, type: PermissionType.StoragePath }, + { action: PermissionAction.View, type: PermissionType.CustomField }, + ], + componentName: 'DocumentAttributesComponent', }, }, { - path: 'documenttypes', - component: DocumentTypeListComponent, + path: 'attributes/:section', + component: DocumentAttributesComponent, canActivate: [PermissionsGuard], data: { - requiredPermission: { - action: PermissionAction.View, - type: PermissionType.DocumentType, - }, - componentName: 'DocumentTypeListComponent', + requiredPermissionAny: [ + { action: PermissionAction.View, type: PermissionType.Tag }, + { + action: PermissionAction.View, + type: PermissionType.Correspondent, + }, + { + action: PermissionAction.View, + type: PermissionType.DocumentType, + }, + { action: PermissionAction.View, type: PermissionType.StoragePath }, + { action: PermissionAction.View, type: PermissionType.CustomField }, + ], + componentName: 'DocumentAttributesComponent', }, }, + { + path: 'documentproperties', + redirectTo: '/attributes', + pathMatch: 'full', + }, + { + path: 'documentproperties/:section', + redirectTo: '/attributes/:section', + pathMatch: 'full', + }, + { + path: 'tags', + redirectTo: '/attributes/tags', + pathMatch: 'full', + }, { path: 'correspondents', - component: CorrespondentListComponent, - canActivate: [PermissionsGuard], - data: { - requiredPermission: { - action: PermissionAction.View, - type: PermissionType.Correspondent, - }, - componentName: 'CorrespondentListComponent', - }, + redirectTo: '/attributes/correspondents', + pathMatch: 'full', + }, + { + path: 'documenttypes', + redirectTo: '/attributes/documenttypes', + pathMatch: 'full', }, { path: 'storagepaths', - component: StoragePathListComponent, - canActivate: [PermissionsGuard], - data: { - requiredPermission: { - action: PermissionAction.View, - type: PermissionType.StoragePath, - }, - componentName: 'StoragePathListComponent', - }, + redirectTo: '/attributes/storagepaths', + pathMatch: 'full', }, { path: 'logs', @@ -239,15 +259,8 @@ export const routes: Routes = [ }, { path: 'customfields', - component: CustomFieldsComponent, - canActivate: [PermissionsGuard], - data: { - requiredPermission: { - action: PermissionAction.View, - type: PermissionType.CustomField, - }, - componentName: 'CustomFieldsComponent', - }, + redirectTo: '/attributes/customfields', + pathMatch: 'full', }, { path: 'workflows', diff --git a/src-ui/src/app/app.component.spec.ts b/src-ui/src/app/app.component.spec.ts index 0591217cac..0d23d4feb5 100644 --- a/src-ui/src/app/app.component.spec.ts +++ b/src-ui/src/app/app.component.spec.ts @@ -9,7 +9,11 @@ import { import { Router, RouterModule } from '@angular/router' import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap' import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { TourNgBootstrapModule, TourService } from 'ngx-ui-tour-ng-bootstrap' +import { + provideUiTour, + TourNgBootstrap, + TourService, +} from 'ngx-ui-tour-ng-bootstrap' import { Subject } from 'rxjs' import { routes } from './app-routing.module' import { AppComponent } from './app.component' @@ -40,12 +44,12 @@ describe('AppComponent', () => { beforeEach(async () => { TestBed.configureTestingModule({ imports: [ - TourNgBootstrapModule, RouterModule.forRoot(routes), NgbModalModule, AppComponent, ToastsComponent, FileDropComponent, + TourNgBootstrap, NgxBootstrapIconsModule.pick(allIcons), ], providers: [ @@ -53,6 +57,7 @@ describe('AppComponent', () => { DirtySavedViewGuard, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), + provideUiTour(), ], }).compileComponents() diff --git a/src-ui/src/app/app.component.ts b/src-ui/src/app/app.component.ts index b782e62b51..543d2ecaaa 100644 --- a/src-ui/src/app/app.component.ts +++ b/src-ui/src/app/app.component.ts @@ -1,6 +1,6 @@ import { Component, inject, OnDestroy, OnInit, Renderer2 } from '@angular/core' import { Router, RouterOutlet } from '@angular/router' -import { TourNgBootstrapModule, TourService } from 'ngx-ui-tour-ng-bootstrap' +import { TourNgBootstrap, TourService } from 'ngx-ui-tour-ng-bootstrap' import { first, Subscription } from 'rxjs' import { ToastsComponent } from './components/common/toasts/toasts.component' import { FileDropComponent } from './components/file-drop/file-drop.component' @@ -21,12 +21,7 @@ import { WebsocketStatusService } from './services/websocket-status.service' selector: 'pngx-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], - imports: [ - FileDropComponent, - ToastsComponent, - TourNgBootstrapModule, - RouterOutlet, - ], + imports: [FileDropComponent, ToastsComponent, TourNgBootstrap, RouterOutlet], }) export class AppComponent implements OnInit, OnDestroy { private settings = inject(SettingsService) @@ -167,108 +162,91 @@ export class AppComponent implements OnInit, OnDestroy { }) } - const prevBtnTitle = $localize`Prev` - const nextBtnTitle = $localize`Next` - const endBtnTitle = $localize`End` - - this.tourService.initialize( - [ - { - anchorId: 'tour.dashboard', - content: $localize`The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some.`, - route: '/dashboard', - delayAfterNavigation: 500, - isOptional: false, - }, - { - anchorId: 'tour.upload-widget', - content: $localize`Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms.`, - route: '/dashboard', - }, - { - anchorId: 'tour.documents', - content: $localize`The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar.`, - route: '/documents?sort=created&reverse=1&page=1', - delayAfterNavigation: 500, - placement: 'bottom', - }, - { - anchorId: 'tour.documents-filter-editor', - content: $localize`The filtering tools allow you to quickly find documents using various searches, dates, tags, etc.`, - route: '/documents?sort=created&reverse=1&page=1', - placement: 'bottom', - }, - { - anchorId: 'tour.documents-views', - content: $localize`Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar.`, - route: '/documents?sort=created&reverse=1&page=1', - }, - { - anchorId: 'tour.tags', - content: $localize`Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view.`, - route: '/tags', - backdropConfig: { - offset: 0, - }, - }, - { - anchorId: 'tour.mail', - content: $localize`Manage e-mail accounts and rules for automatically importing documents.`, - route: '/mail', - backdropConfig: { - offset: 0, - }, + this.tourService.initialize([ + { + anchorId: 'tour.dashboard', + content: $localize`The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some.`, + route: '/dashboard', + delayAfterNavigation: 500, + isOptional: false, + }, + { + anchorId: 'tour.upload-widget', + content: $localize`Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms.`, + route: '/dashboard', + }, + { + anchorId: 'tour.documents', + content: $localize`The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar.`, + route: '/documents?sort=created&reverse=1&page=1', + delayAfterNavigation: 500, + placement: 'bottom', + }, + { + anchorId: 'tour.documents-filter-editor', + content: $localize`The filtering tools allow you to quickly find documents using various searches, dates, tags, etc.`, + route: '/documents?sort=created&reverse=1&page=1', + placement: 'bottom', + }, + { + anchorId: 'tour.documents-views', + content: $localize`Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar.`, + route: '/documents?sort=created&reverse=1&page=1', + }, + { + anchorId: 'tour.tags', + content: $localize`Attributes like tags, correspondents, document types, storage paths and custom fields can all be managed here. They can also be created from the document edit view.`, + route: '/attributes/tags', + backdropConfig: { + offset: 0, }, - { - anchorId: 'tour.workflows', - content: $localize`Workflows give you more control over the document pipeline.`, - route: '/workflows', - backdropConfig: { - offset: 0, - }, + }, + { + anchorId: 'tour.mail', + content: $localize`Manage e-mail accounts and rules for automatically importing documents.`, + route: '/mail', + backdropConfig: { + offset: 0, }, - { - anchorId: 'tour.file-tasks', - content: $localize`File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process.`, - route: '/tasks', - backdropConfig: { - offset: 0, - }, + }, + { + anchorId: 'tour.workflows', + content: $localize`Workflows give you more control over the document pipeline.`, + route: '/workflows', + backdropConfig: { + offset: 0, }, - { - anchorId: 'tour.settings', - content: $localize`Check out the settings for various tweaks to the web app.`, - route: '/settings', - backdropConfig: { - offset: 0, - }, + }, + { + anchorId: 'tour.file-tasks', + content: $localize`File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process.`, + route: '/tasks', + backdropConfig: { + offset: 0, }, - { - anchorId: 'tour.outro', - title: $localize`Thank you! 🙏`, - content: - $localize`There are tons more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues.` + - '

' + - $localize`Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx!`, - route: '/dashboard', - isOptional: false, - backdropConfig: { - offset: 0, - }, + }, + { + anchorId: 'tour.settings', + content: $localize`Check out the settings for various tweaks to the web app.`, + route: '/settings', + backdropConfig: { + offset: 0, }, - ], + }, { - enableBackdrop: true, + anchorId: 'tour.outro', + title: $localize`Thank you! 🙏`, + content: + $localize`There are tons more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues.` + + '

' + + $localize`Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx!`, + route: '/dashboard', + isOptional: false, backdropConfig: { - offset: 10, + offset: 0, }, - prevBtnTitle, - nextBtnTitle, - endBtnTitle, - isOptional: true, - useLegacyTitle: true, - } - ) + }, + ]) this.tourService.start$.subscribe(() => { this.renderer.addClass(document.body, 'tour-active') diff --git a/src-ui/src/app/components/admin/config/config.component.html b/src-ui/src/app/components/admin/config/config.component.html index e1d7340a64..38ddbf3a76 100644 --- a/src-ui/src/app/components/admin/config/config.component.html +++ b/src-ui/src/app/components/admin/config/config.component.html @@ -19,13 +19,18 @@
-
-
- {{option.title}} - - - +
+
+ {{option.title}}
+ + + + @if (isSet(option.key)) { + + }
@switch (option.type) { @@ -35,8 +40,12 @@
@case (ConfigOptionType.String) { } @case (ConfigOptionType.JSON) { } @case (ConfigOptionType.File) { } + @case (ConfigOptionType.Password) { } }
+ @if (option.note) { +
{{option.note}}
+ }
@@ -50,7 +59,7 @@
+
+
+
Global search
+
+
+ +
+
+ +
+
+ Full search links to +
+
+ +
+
-
Update checking
+
Update checking
@@ -179,11 +183,33 @@
Saved Views
-
-
-
Document editing
+
+ + + + +
  • + Documents + +
    +
    +
    Documents
    +
    +
    + Items per page +
    +
    + +
    +
    +
    Document editing
    @@ -196,8 +222,8 @@
    Document editing

    Only applies to the Paperless-ngx PDF viewer.

    @@ -209,31 +235,32 @@
    Document editing
    -
    -
    - -
    -
    - -
    Global search
    - +
    -
    - Full search links to -
    -
    - +
    +

    Built-in fields to show:

    + @for (option of documentDetailFieldOptions; track option.id) { +
    + + +
    + } +

    Uncheck fields to hide them on the document details page.

    +
    +
    Bulk editing
    @@ -242,16 +269,27 @@
    Bulk editing
    +
    PDF Editor
    +
    +
    + Default editing mode +
    +
    + +
    +
    +
    Notes
    -
    -
  • diff --git a/src-ui/src/app/components/admin/settings/settings.component.spec.ts b/src-ui/src/app/components/admin/settings/settings.component.spec.ts index 300067d1b9..7e369c8c3f 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.spec.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.spec.ts @@ -16,6 +16,7 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { NgSelectModule } from '@ng-select/ng-select' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { of, throwError } from 'rxjs' import { routes } from 'src/app/app-routing.module' import { @@ -28,7 +29,6 @@ import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { PermissionsService } from 'src/app/services/permissions.service' import { GroupService } from 'src/app/services/rest/group.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' @@ -92,6 +92,9 @@ const status: SystemStatus = { sanity_check_status: SystemStatusItemStatus.ERROR, sanity_check_last_run: new Date().toISOString(), sanity_check_error: 'Error running sanity check.', + llmindex_status: SystemStatusItemStatus.DISABLED, + llmindex_last_modified: new Date().toISOString(), + llmindex_error: null, }, } @@ -129,7 +132,6 @@ describe('SettingsComponent', () => { ConfirmDialogComponent, CheckComponent, ColorComponent, - SafeHtmlPipe, SelectComponent, TextComponent, NumberComponent, @@ -146,6 +148,7 @@ describe('SettingsComponent', () => { PermissionsGuard, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), + provideUiTour(), ], }).compileComponents() @@ -200,9 +203,9 @@ describe('SettingsComponent', () => { const navigateSpy = jest.spyOn(router, 'navigate') const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavLink)) tabButtons[1].nativeElement.dispatchEvent(new MouseEvent('click')) - expect(navigateSpy).toHaveBeenCalledWith(['settings', 'permissions']) + expect(navigateSpy).toHaveBeenCalledWith(['settings', 'documents']) tabButtons[2].nativeElement.dispatchEvent(new MouseEvent('click')) - expect(navigateSpy).toHaveBeenCalledWith(['settings', 'notifications']) + expect(navigateSpy).toHaveBeenCalledWith(['settings', 'permissions']) const initSpy = jest.spyOn(component, 'initialize') component.isDirty = true // mock dirty @@ -212,8 +215,8 @@ describe('SettingsComponent', () => { expect(initSpy).not.toHaveBeenCalled() navigateSpy.mockResolvedValueOnce(true) // nav accepted even though dirty - tabButtons[1].nativeElement.dispatchEvent(new MouseEvent('click')) - expect(navigateSpy).toHaveBeenCalledWith(['settings', 'notifications']) + tabButtons[2].nativeElement.dispatchEvent(new MouseEvent('click')) + expect(navigateSpy).toHaveBeenCalledWith(['settings', 'permissions']) expect(initSpy).toHaveBeenCalled() }) @@ -225,7 +228,7 @@ describe('SettingsComponent', () => { activatedRoute.snapshot.fragment = '#notifications' const scrollSpy = jest.spyOn(viewportScroller, 'scrollToAnchor') component.ngOnInit() - expect(component.activeNavID).toEqual(3) // Notifications + expect(component.activeNavID).toEqual(4) // Notifications component.ngAfterViewInit() expect(scrollSpy).toHaveBeenCalledWith('#notifications') }) @@ -250,7 +253,7 @@ describe('SettingsComponent', () => { expect(toastErrorSpy).toHaveBeenCalled() expect(storeSpy).toHaveBeenCalled() expect(appearanceSettingsSpy).not.toHaveBeenCalled() - expect(setSpy).toHaveBeenCalledTimes(30) + expect(setSpy).toHaveBeenCalledTimes(32) // succeed storeSpy.mockReturnValueOnce(of(true)) @@ -365,4 +368,22 @@ describe('SettingsComponent', () => { settingsService.settingsSaved.emit(true) expect(maybeRefreshSpy).toHaveBeenCalled() }) + + it('should support toggling document detail fields', () => { + completeSetup() + const field = 'storage_path' + expect( + component.settingsForm.get('documentDetailsHiddenFields').value.length + ).toEqual(0) + component.toggleDocumentDetailField(field, false) + expect( + component.settingsForm.get('documentDetailsHiddenFields').value.length + ).toEqual(1) + expect(component.isDocumentDetailFieldShown(field)).toBeFalsy() + component.toggleDocumentDetailField(field, true) + expect( + component.settingsForm.get('documentDetailsHiddenFields').value.length + ).toEqual(0) + expect(component.isDocumentDetailFieldShown(field)).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/admin/settings/settings.component.ts b/src-ui/src/app/components/admin/settings/settings.component.ts index 614d2fcd0f..f548b71f43 100644 --- a/src-ui/src/app/components/admin/settings/settings.component.ts +++ b/src-ui/src/app/components/admin/settings/settings.component.ts @@ -64,15 +64,16 @@ import { PermissionsGroupComponent } from '../../common/input/permissions/permis import { PermissionsUserComponent } from '../../common/input/permissions/permissions-user/permissions-user.component' import { SelectComponent } from '../../common/input/select/select.component' import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { PdfEditorEditMode } from '../../common/pdf-editor/pdf-editor-edit-mode' +import { PdfZoomScale } from '../../common/pdf-viewer/pdf-viewer.types' import { SystemStatusDialogComponent } from '../../common/system-status-dialog/system-status-dialog.component' -import { ZoomSetting } from '../../document-detail/document-detail.component' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' enum SettingsNavIDs { General = 1, - Permissions = 2, - Notifications = 3, - SavedViews = 4, + Documents = 2, + Permissions = 3, + Notifications = 4, } const systemLanguage = { code: '', name: $localize`Use system language` } @@ -81,6 +82,25 @@ const systemDateFormat = { name: $localize`Use date format of display language`, } +export enum DocumentDetailFieldID { + ArchiveSerialNumber = 'archive_serial_number', + Correspondent = 'correspondent', + DocumentType = 'document_type', + StoragePath = 'storage_path', + Tags = 'tags', +} + +const documentDetailFieldOptions = [ + { + id: DocumentDetailFieldID.ArchiveSerialNumber, + label: $localize`Archive serial number`, + }, + { id: DocumentDetailFieldID.Correspondent, label: $localize`Correspondent` }, + { id: DocumentDetailFieldID.DocumentType, label: $localize`Document type` }, + { id: DocumentDetailFieldID.StoragePath, label: $localize`Storage path` }, + { id: DocumentDetailFieldID.Tags, label: $localize`Tags` }, +] + @Component({ selector: 'pngx-settings', templateUrl: './settings.component.html', @@ -144,8 +164,10 @@ export class SettingsComponent defaultPermsEditGroups: new FormControl(null), useNativePdfViewer: new FormControl(null), pdfViewerDefaultZoom: new FormControl(null), + pdfEditorDefaultEditMode: new FormControl(null), documentEditingRemoveInboxTags: new FormControl(null), documentEditingOverlayThumbnail: new FormControl(null), + documentDetailsHiddenFields: new FormControl([]), searchDbOnly: new FormControl(null), searchLink: new FormControl(null), @@ -174,7 +196,11 @@ export class SettingsComponent public readonly GlobalSearchType = GlobalSearchType - public readonly ZoomSetting = ZoomSetting + public readonly PdfZoomScale = PdfZoomScale + + public readonly PdfEditorEditMode = PdfEditorEditMode + + public readonly documentDetailFieldOptions = documentDetailFieldOptions get systemStatusHasErrors(): boolean { return ( @@ -292,6 +318,9 @@ export class SettingsComponent pdfViewerDefaultZoom: this.settings.get( SETTINGS_KEYS.PDF_VIEWER_ZOOM_SETTING ), + pdfEditorDefaultEditMode: this.settings.get( + SETTINGS_KEYS.PDF_EDITOR_DEFAULT_EDIT_MODE + ), displayLanguage: this.settings.getLanguage(), dateLocale: this.settings.get(SETTINGS_KEYS.DATE_LOCALE), dateFormat: this.settings.get(SETTINGS_KEYS.DATE_FORMAT), @@ -336,6 +365,9 @@ export class SettingsComponent documentEditingOverlayThumbnail: this.settings.get( SETTINGS_KEYS.DOCUMENT_EDITING_OVERLAY_THUMBNAIL ), + documentDetailsHiddenFields: this.settings.get( + SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS + ), searchDbOnly: this.settings.get(SETTINGS_KEYS.SEARCH_DB_ONLY), searchLink: this.settings.get(SETTINGS_KEYS.SEARCH_FULL_TYPE), } @@ -458,6 +490,10 @@ export class SettingsComponent SETTINGS_KEYS.PDF_VIEWER_ZOOM_SETTING, this.settingsForm.value.pdfViewerDefaultZoom ) + this.settings.set( + SETTINGS_KEYS.PDF_EDITOR_DEFAULT_EDIT_MODE, + this.settingsForm.value.pdfEditorDefaultEditMode + ) this.settings.set( SETTINGS_KEYS.DATE_LOCALE, this.settingsForm.value.dateLocale @@ -526,6 +562,10 @@ export class SettingsComponent SETTINGS_KEYS.DOCUMENT_EDITING_OVERLAY_THUMBNAIL, this.settingsForm.value.documentEditingOverlayThumbnail ) + this.settings.set( + SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS, + this.settingsForm.value.documentDetailsHiddenFields + ) this.settings.set( SETTINGS_KEYS.SEARCH_DB_ONLY, this.settingsForm.value.searchDbOnly @@ -587,6 +627,26 @@ export class SettingsComponent this.settingsForm.get('themeColor').patchValue('') } + isDocumentDetailFieldShown(fieldId: string): boolean { + const hiddenFields = + this.settingsForm.value.documentDetailsHiddenFields || [] + return !hiddenFields.includes(fieldId) + } + + toggleDocumentDetailField(fieldId: string, checked: boolean) { + const hiddenFields = new Set( + this.settingsForm.value.documentDetailsHiddenFields || [] + ) + if (checked) { + hiddenFields.delete(fieldId) + } else { + hiddenFields.add(fieldId) + } + this.settingsForm + .get('documentDetailsHiddenFields') + .setValue(Array.from(hiddenFields)) + } + showSystemStatus() { const modal: NgbModalRef = this.modalService.open( SystemStatusDialogComponent, diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.html b/src-ui/src/app/components/admin/tasks/tasks.component.html index 084195221c..418dfa8fa4 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.html +++ b/src-ui/src/app/components/admin/tasks/tasks.component.html @@ -6,10 +6,10 @@ >
    @@ -97,6 +97,12 @@
    (click for full output) } + @if (task.duplicate_documents?.length > 0) { +
    + + Duplicate(s) detected +
    + } } @@ -107,12 +113,12 @@
    @if (task.related_document) { } diff --git a/src-ui/src/app/components/admin/trash/trash.component.html b/src-ui/src/app/components/admin/trash/trash.component.html index 55388d4cdd..c729d26f21 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.html +++ b/src-ui/src/app/components/admin/trash/trash.component.html @@ -5,16 +5,16 @@ i18n-info infoLink="usage/#document-trash"> @@ -75,10 +75,10 @@
    diff --git a/src-ui/src/app/components/admin/trash/trash.component.spec.ts b/src-ui/src/app/components/admin/trash/trash.component.spec.ts index aa5a8af0f6..215b0b253d 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.spec.ts +++ b/src-ui/src/app/components/admin/trash/trash.component.spec.ts @@ -11,7 +11,6 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { of, throwError } from 'rxjs' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { ToastService } from 'src/app/services/toast.service' import { TrashService } from 'src/app/services/trash.service' import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' @@ -53,7 +52,6 @@ describe('TrashComponent', () => { TrashComponent, PageHeaderComponent, ConfirmDialogComponent, - SafeHtmlPipe, ], }).compileComponents() diff --git a/src-ui/src/app/components/admin/users-groups/users-groups.component.html b/src-ui/src/app/components/admin/users-groups/users-groups.component.html index 2cf92f94f9..a13bb66337 100644 --- a/src-ui/src/app/components/admin/users-groups/users-groups.component.html +++ b/src-ui/src/app/components/admin/users-groups/users-groups.component.html @@ -11,7 +11,7 @@

    Users

      @@ -26,16 +26,16 @@

      @for (user of users; track user) {
    • -
      +
      {{user.first_name}} {{user.last_name}}
      {{user.groups?.map(getGroupName, this).join(', ')}}
      @@ -49,7 +49,7 @@

      Groups

        @@ -70,10 +70,10 @@

        diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index 673eaf03b8..d876e28eae 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -30,6 +30,9 @@

    @@ -148,7 +150,7 @@ @@ -254,21 +272,21 @@
    diff --git a/src-ui/src/app/components/common/input/document-link/document-link.component.html b/src-ui/src/app/components/common/input/document-link/document-link.component.html index e2219a8fc3..ecc301608b 100644 --- a/src-ui/src/app/components/common/input/document-link/document-link.component.html +++ b/src-ui/src/app/components/common/input/document-link/document-link.component.html @@ -9,7 +9,7 @@ } @if (removable) { }
    @@ -44,11 +44,11 @@ } @if (document.title) { -  {{document.title}} + {{document.title}} } @else { -  Not found + Not found }
    diff --git a/src-ui/src/app/components/common/input/entries/entries.component.html b/src-ui/src/app/components/common/input/entries/entries.component.html index c75007c25d..7204bfcce6 100644 --- a/src-ui/src/app/components/common/input/entries/entries.component.html +++ b/src-ui/src/app/components/common/input/entries/entries.component.html @@ -5,7 +5,7 @@ }
    @@ -19,7 +19,7 @@
    } @if (hint) { - + }
    {{error}} diff --git a/src-ui/src/app/components/common/input/file/file.component.html b/src-ui/src/app/components/common/input/file/file.component.html index 4e780781c8..8657423335 100644 --- a/src-ui/src/app/components/common/input/file/file.component.html +++ b/src-ui/src/app/components/common/input/file/file.component.html @@ -6,7 +6,7 @@ } @if (removable) { }
    @@ -24,7 +24,7 @@ } @if (hint) { - + }
    {{error}} diff --git a/src-ui/src/app/components/common/input/monetary/monetary.component.html b/src-ui/src/app/components/common/input/monetary/monetary.component.html index a21932c59b..b82fed7f51 100644 --- a/src-ui/src/app/components/common/input/monetary/monetary.component.html +++ b/src-ui/src/app/components/common/input/monetary/monetary.component.html @@ -6,7 +6,7 @@ } @if (removable) { }
    diff --git a/src-ui/src/app/components/common/input/number/number.component.html b/src-ui/src/app/components/common/input/number/number.component.html index c3d435ffa9..2e0e3f8bc1 100644 --- a/src-ui/src/app/components/common/input/number/number.component.html +++ b/src-ui/src/app/components/common/input/number/number.component.html @@ -6,7 +6,7 @@ } @if (removable) { } diff --git a/src-ui/src/app/components/common/input/password/password.component.html b/src-ui/src/app/components/common/input/password/password.component.html index 1a70ff4f68..b5d88f79c5 100644 --- a/src-ui/src/app/components/common/input/password/password.component.html +++ b/src-ui/src/app/components/common/input/password/password.component.html @@ -1,17 +1,24 @@ -
    - -
    - - @if (showReveal) { - +
    +
    +
    + @if (title) { + + } +
    +
    +
    + + @if (showReveal) { + + } +
    +
    + {{error}} +
    + @if (hint) { + }
    -
    - {{error}} -
    - @if (hint) { - - }
    diff --git a/src-ui/src/app/components/common/input/select/select.component.html b/src-ui/src/app/components/common/input/select/select.component.html index 3cfbfe3302..42fb446487 100644 --- a/src-ui/src/app/components/common/input/select/select.component.html +++ b/src-ui/src/app/components/common/input/select/select.component.html @@ -7,7 +7,7 @@ } @if (removable) { }
    diff --git a/src-ui/src/app/components/common/input/switch/switch.component.html b/src-ui/src/app/components/common/input/switch/switch.component.html index 5acef7a757..c8032987f9 100644 --- a/src-ui/src/app/components/common/input/switch/switch.component.html +++ b/src-ui/src/app/components/common/input/switch/switch.component.html @@ -10,7 +10,7 @@ @if (removable) { }
    @@ -22,7 +22,7 @@ } diff --git a/src-ui/src/app/components/common/input/tags/tags.component.html b/src-ui/src/app/components/common/input/tags/tags.component.html index f04863f402..9602459846 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.html +++ b/src-ui/src/app/components/common/input/tags/tags.component.html @@ -28,7 +28,7 @@ -
    +
    @if (item.id && tags) { @if (getTag(item.id)?.parent) { diff --git a/src-ui/src/app/components/common/input/tags/tags.component.scss b/src-ui/src/app/components/common/input/tags/tags.component.scss index 52292d5cbc..2f06247bd3 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.scss +++ b/src-ui/src/app/components/common/input/tags/tags.component.scss @@ -22,8 +22,8 @@ } // Dropdown hierarchy reveal for ng-select options -::ng-deep .ng-dropdown-panel .ng-option { - overflow-x: scroll; +:host ::ng-deep .ng-dropdown-panel .ng-option { + overflow-x: auto !important; .tag-option-row { font-size: 1rem; @@ -41,12 +41,12 @@ } } -::ng-deep .ng-dropdown-panel .ng-option:hover .hierarchy-reveal, -::ng-deep .ng-dropdown-panel .ng-option.ng-option-marked .hierarchy-reveal { +:host ::ng-deep .ng-dropdown-panel .ng-option:hover .hierarchy-reveal, +:host ::ng-deep .ng-dropdown-panel .ng-option.ng-option-marked .hierarchy-reveal { max-width: 1000px; } ::ng-deep .ng-dropdown-panel .ng-option:hover .hierarchy-indicator, -::ng-deep .ng-dropdown-panel .ng-option.ng-option-marked .hierarchy-indicator { +:host ::ng-deep .ng-dropdown-panel .ng-option.ng-option-marked .hierarchy-indicator { background: transparent; } diff --git a/src-ui/src/app/components/common/input/text/text.component.html b/src-ui/src/app/components/common/input/text/text.component.html index 29e5698ad0..2403934410 100644 --- a/src-ui/src/app/components/common/input/text/text.component.html +++ b/src-ui/src/app/components/common/input/text/text.component.html @@ -6,14 +6,20 @@ } @if (removable) { }
    @if (hint) { - + + } + @if (getSuggestion()?.length > 0) { + + Suggestion:  + {{getSuggestion()}}  + }
    {{error}} diff --git a/src-ui/src/app/components/common/input/text/text.component.spec.ts b/src-ui/src/app/components/common/input/text/text.component.spec.ts index c5662b3412..539c1eb6b6 100644 --- a/src-ui/src/app/components/common/input/text/text.component.spec.ts +++ b/src-ui/src/app/components/common/input/text/text.component.spec.ts @@ -26,10 +26,20 @@ describe('TextComponent', () => { it('should support use of input field', () => { expect(component.value).toBeUndefined() - // TODO: why doesn't this work? - // input.value = 'foo' - // input.dispatchEvent(new Event('change')) - // fixture.detectChanges() - // expect(component.value).toEqual('foo') + input.value = 'foo' + input.dispatchEvent(new Event('input')) + fixture.detectChanges() + expect(component.value).toBe('foo') + }) + + it('should support suggestion', () => { + component.value = 'foo' + component.suggestion = 'foo' + expect(component.getSuggestion()).toBe('') + component.value = 'bar' + expect(component.getSuggestion()).toBe('foo') + component.applySuggestion() + fixture.detectChanges() + expect(component.value).toBe('foo') }) }) diff --git a/src-ui/src/app/components/common/input/text/text.component.ts b/src-ui/src/app/components/common/input/text/text.component.ts index cc06d5bc01..22b1fed4a4 100644 --- a/src-ui/src/app/components/common/input/text/text.component.ts +++ b/src-ui/src/app/components/common/input/text/text.component.ts @@ -4,8 +4,8 @@ import { NG_VALUE_ACCESSOR, ReactiveFormsModule, } from '@angular/forms' +import { RouterLink } from '@angular/router' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { AbstractInputComponent } from '../abstract-input' @Component({ @@ -22,8 +22,8 @@ import { AbstractInputComponent } from '../abstract-input' imports: [ FormsModule, ReactiveFormsModule, - SafeHtmlPipe, NgxBootstrapIconsModule, + RouterLink, ], }) export class TextComponent extends AbstractInputComponent { @@ -33,7 +33,19 @@ export class TextComponent extends AbstractInputComponent { @Input() placeholder: string = '' + @Input() + suggestion: string = '' + constructor() { super() } + + getSuggestion() { + return this.value !== this.suggestion ? this.suggestion : '' + } + + applySuggestion() { + this.value = this.suggestion + this.onChange(this.value) + } } diff --git a/src-ui/src/app/components/common/input/textarea/textarea.component.html b/src-ui/src/app/components/common/input/textarea/textarea.component.html index d92a8aa4f8..32a3bce88f 100644 --- a/src-ui/src/app/components/common/input/textarea/textarea.component.html +++ b/src-ui/src/app/components/common/input/textarea/textarea.component.html @@ -6,7 +6,7 @@ } @if (removable) { }
    @@ -23,7 +23,7 @@ rows="4"> @if (hint) { - + }
    {{error}} diff --git a/src-ui/src/app/components/common/input/textarea/textarea.component.ts b/src-ui/src/app/components/common/input/textarea/textarea.component.ts index 733c3f18aa..527afda925 100644 --- a/src-ui/src/app/components/common/input/textarea/textarea.component.ts +++ b/src-ui/src/app/components/common/input/textarea/textarea.component.ts @@ -5,7 +5,6 @@ import { ReactiveFormsModule, } from '@angular/forms' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { AbstractInputComponent } from '../abstract-input' @Component({ @@ -19,12 +18,7 @@ import { AbstractInputComponent } from '../abstract-input' selector: 'pngx-input-textarea', templateUrl: './textarea.component.html', styleUrls: ['./textarea.component.scss'], - imports: [ - FormsModule, - ReactiveFormsModule, - SafeHtmlPipe, - NgxBootstrapIconsModule, - ], + imports: [FormsModule, ReactiveFormsModule, NgxBootstrapIconsModule], }) export class TextAreaComponent extends AbstractInputComponent { @Input() diff --git a/src-ui/src/app/components/common/input/url/url.component.html b/src-ui/src/app/components/common/input/url/url.component.html index 0885b3786b..f305d66209 100644 --- a/src-ui/src/app/components/common/input/url/url.component.html +++ b/src-ui/src/app/components/common/input/url/url.component.html @@ -4,7 +4,7 @@ @if (removable) { }
    @@ -19,7 +19,7 @@
    @if (hint) { - + }
    diff --git a/src-ui/src/app/components/common/page-header/page-header.component.html b/src-ui/src/app/components/common/page-header/page-header.component.html index 2832182199..6ee0388cdc 100644 --- a/src-ui/src/app/components/common/page-header/page-header.component.html +++ b/src-ui/src/app/components/common/page-header/page-header.component.html @@ -1,12 +1,21 @@
    -

    - {{title}} +

    + {{title}} + @if (id) { + + @if (copied) { + Copied! + } @else { + ID: {{id}} + } + + } @if (subTitle) { - {{subTitle}} + {{subTitle}} } @if (info) { - @@ -17,6 +26,9 @@

    } } + @if (loading) { + + }

    diff --git a/src-ui/src/app/components/common/page-header/page-header.component.scss b/src-ui/src/app/components/common/page-header/page-header.component.scss index ee373a8e27..d8d3311bbb 100644 --- a/src-ui/src/app/components/common/page-header/page-header.component.scss +++ b/src-ui/src/app/components/common/page-header/page-header.component.scss @@ -1,5 +1,10 @@ h3 { min-height: calc(1.325rem + 0.9vw); + + .badge { + font-size: 0.65rem; + line-height: 1; + } } @media (min-width: 1200px) { diff --git a/src-ui/src/app/components/common/page-header/page-header.component.spec.ts b/src-ui/src/app/components/common/page-header/page-header.component.spec.ts index 8b307b10df..8fa9ad3695 100644 --- a/src-ui/src/app/components/common/page-header/page-header.component.spec.ts +++ b/src-ui/src/app/components/common/page-header/page-header.component.spec.ts @@ -1,3 +1,4 @@ +import { Clipboard } from '@angular/cdk/clipboard' import { ComponentFixture, TestBed } from '@angular/core/testing' import { Title } from '@angular/platform-browser' import { environment } from 'src/environments/environment' @@ -7,6 +8,7 @@ describe('PageHeaderComponent', () => { let component: PageHeaderComponent let fixture: ComponentFixture let titleService: Title + let clipboard: Clipboard beforeEach(async () => { TestBed.configureTestingModule({ @@ -15,6 +17,7 @@ describe('PageHeaderComponent', () => { }).compileComponents() titleService = TestBed.inject(Title) + clipboard = TestBed.inject(Clipboard) fixture = TestBed.createComponent(PageHeaderComponent) component = fixture.componentInstance fixture.detectChanges() @@ -24,7 +27,8 @@ describe('PageHeaderComponent', () => { component.title = 'Foo' component.subTitle = 'Bar' fixture.detectChanges() - expect(fixture.nativeElement.textContent).toContain('Foo Bar') + expect(fixture.nativeElement.textContent).toContain('Foo') + expect(fixture.nativeElement.textContent).toContain('Bar') }) it('should set html title', () => { @@ -32,4 +36,16 @@ describe('PageHeaderComponent', () => { component.title = 'Foo Bar' expect(titleSpy).toHaveBeenCalledWith(`Foo Bar - ${environment.appTitle}`) }) + + it('should copy id to clipboard, reset after 3 seconds', () => { + jest.useFakeTimers() + component.id = 42 as any + jest.spyOn(clipboard, 'copy').mockReturnValue(true) + component.copyID() + expect(clipboard.copy).toHaveBeenCalledWith('42') + expect(component.copied).toBe(true) + + jest.advanceTimersByTime(3000) + expect(component.copied).toBe(false) + }) }) diff --git a/src-ui/src/app/components/common/page-header/page-header.component.ts b/src-ui/src/app/components/common/page-header/page-header.component.ts index d5d3976414..ec0525b4bb 100644 --- a/src-ui/src/app/components/common/page-header/page-header.component.ts +++ b/src-ui/src/app/components/common/page-header/page-header.component.ts @@ -1,20 +1,24 @@ +import { Clipboard } from '@angular/cdk/clipboard' import { Component, Input, inject } from '@angular/core' import { Title } from '@angular/platform-browser' import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { TourNgBootstrapModule } from 'ngx-ui-tour-ng-bootstrap' +import { TourNgBootstrap } from 'ngx-ui-tour-ng-bootstrap' import { environment } from 'src/environments/environment' @Component({ selector: 'pngx-page-header', templateUrl: './page-header.component.html', styleUrls: ['./page-header.component.scss'], - imports: [NgbPopoverModule, NgxBootstrapIconsModule, TourNgBootstrapModule], + imports: [NgbPopoverModule, NgxBootstrapIconsModule, TourNgBootstrap], }) export class PageHeaderComponent { private titleService = inject(Title) + private clipboard = inject(Clipboard) - _title = '' + private _title = '' + public copied: boolean = false + private copyTimeout: any @Input() set title(title: string) { @@ -26,6 +30,9 @@ export class PageHeaderComponent { return this._title } + @Input() + id: number + @Input() subTitle: string = '' @@ -34,4 +41,15 @@ export class PageHeaderComponent { @Input() infoLink: string + + @Input() + loading: boolean = false + + public copyID() { + this.copied = this.clipboard.copy(this.id.toString()) + clearTimeout(this.copyTimeout) + this.copyTimeout = setTimeout(() => { + this.copied = false + }, 3000) + } } diff --git a/src-ui/src/app/components/common/pdf-editor/pdf-editor-edit-mode.ts b/src-ui/src/app/components/common/pdf-editor/pdf-editor-edit-mode.ts new file mode 100644 index 0000000000..461a7e5578 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-editor/pdf-editor-edit-mode.ts @@ -0,0 +1,4 @@ +export enum PdfEditorEditMode { + Update = 'update', + Create = 'create', +} diff --git a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.html b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.html index 2d1d01ca71..057ab07719 100644 --- a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.html +++ b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.html @@ -1,4 +1,4 @@ - + } - + } @placeholder {
    @@ -84,7 +84,7 @@
    @if (editMode === PdfEditorEditMode.Create) { diff --git a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.scss b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.scss index c2e29463b5..e9eba0fc23 100644 --- a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.scss +++ b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.scss @@ -15,13 +15,13 @@ background-color: gray; height: 240px; - pdf-viewer { + pngx-pdf-viewer { width: 100%; height: 100%; } } -::ng-deep .ng2-pdf-viewer-container { +::ng-deep .pngx-pdf-viewer-container { overflow: hidden; } diff --git a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.spec.ts b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.spec.ts index 434deb11d3..0e9abafbbf 100644 --- a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.spec.ts +++ b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.spec.ts @@ -3,6 +3,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing' import { ComponentFixture, TestBed } from '@angular/core/testing' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { DocumentService } from 'src/app/services/rest/document.service' import { PDFEditorComponent } from './pdf-editor.component' describe('PDFEditorComponent', () => { @@ -139,4 +140,16 @@ describe('PDFEditorComponent', () => { expect(component.pages[1].page).toBe(2) expect(component.pages[2].page).toBe(3) }) + + it('should include selected version in preview source when provided', () => { + const documentService = TestBed.inject(DocumentService) + const previewSpy = jest + .spyOn(documentService, 'getPreviewUrl') + .mockReturnValue('preview-version') + component.documentID = 3 + component.versionID = 10 + + expect(component.pdfSrc).toBe('preview-version') + expect(previewSpy).toHaveBeenCalledWith(3, false, 10) + }) }) diff --git a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.ts b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.ts index 25eaf42f15..5ea624aef0 100644 --- a/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.ts +++ b/src-ui/src/app/components/common/pdf-editor/pdf-editor.component.ts @@ -6,10 +6,17 @@ import { import { Component, inject } from '@angular/core' import { FormsModule } from '@angular/forms' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' -import { PDFDocumentProxy, PdfViewerModule } from 'ng2-pdf-viewer' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { DocumentService } from 'src/app/services/rest/document.service' +import { SettingsService } from 'src/app/services/settings.service' import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component' +import { PngxPdfViewerComponent } from '../pdf-viewer/pdf-viewer.component' +import { + PdfRenderMode, + PngxPdfDocumentProxy, +} from '../pdf-viewer/pdf-viewer.types' +import { PdfEditorEditMode } from './pdf-editor-edit-mode' interface PageOperation { page: number @@ -19,11 +26,6 @@ interface PageOperation { loaded?: boolean } -export enum PdfEditorEditMode { - Update = 'update', - Create = 'create', -} - @Component({ selector: 'pngx-pdf-editor', templateUrl: './pdf-editor.component.html', @@ -31,28 +33,37 @@ export enum PdfEditorEditMode { imports: [ DragDropModule, FormsModule, - PdfViewerModule, NgxBootstrapIconsModule, + PngxPdfViewerComponent, ], }) export class PDFEditorComponent extends ConfirmDialogComponent { + PdfRenderMode = PdfRenderMode public PdfEditorEditMode = PdfEditorEditMode private documentService = inject(DocumentService) + private readonly settingsService = inject(SettingsService) activeModal: NgbActiveModal = inject(NgbActiveModal) documentID: number + versionID?: number pages: PageOperation[] = [] totalPages = 0 - editMode: PdfEditorEditMode = PdfEditorEditMode.Create + editMode: PdfEditorEditMode = this.settingsService.get( + SETTINGS_KEYS.PDF_EDITOR_DEFAULT_EDIT_MODE + ) deleteOriginal: boolean = false includeMetadata: boolean = true get pdfSrc(): string { - return this.documentService.getPreviewUrl(this.documentID) + return this.documentService.getPreviewUrl( + this.documentID, + false, + this.versionID + ) } - pdfLoaded(pdf: PDFDocumentProxy) { + pdfLoaded(pdf: PngxPdfDocumentProxy) { this.totalPages = pdf.numPages this.pages = Array.from({ length: this.totalPages }, (_, i) => ({ page: i + 1, diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html new file mode 100644 index 0000000000..edc8efa8a3 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.html @@ -0,0 +1,3 @@ +
    +
    +
    diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss new file mode 100644 index 0000000000..6863f54630 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.scss @@ -0,0 +1,157 @@ +:host { + display: block; + width: 100%; + height: 100%; + position: relative; +} + +:host ::ng-deep .pngx-pdf-viewer-container { + position: absolute; + inset: 0; + overflow: auto; +} + +:host ::ng-deep .pdfViewer { + --scale-factor: 1; + --page-bg-color: unset; + padding-bottom: 0; +} + +:host ::ng-deep .pdfViewer .page { + --user-unit: 1; + --total-scale-factor: calc(var(--scale-factor) * var(--user-unit)); + --scale-round-x: 1px; + --scale-round-y: 1px; + direction: ltr; + margin: 0 auto 10px; + border: 0; + position: relative; + overflow: visible; + background-clip: content-box; + background-color: var(--page-bg-color, rgb(255 255 255)); +} + +:host ::ng-deep .pdfViewer > .page:last-of-type { + margin-bottom: 0; +} + +:host ::ng-deep .pdfViewer.singlePageView { + display: inline-block; +} + +:host ::ng-deep .pdfViewer.singlePageView .page { + margin: 0; + border: none; +} + +:host ::ng-deep .pdfViewer .canvasWrapper { + overflow: hidden; + width: 100%; + height: 100%; +} + +:host ::ng-deep .pdfViewer .canvasWrapper canvas { + position: absolute; + top: 0; + left: 0; + margin: 0; + display: block; + width: 100%; + height: 100%; + contain: content; +} + +:host ::ng-deep .textLayer { + position: absolute; + text-align: initial; + inset: 0; + overflow: clip; + opacity: 1; + line-height: 1; + text-size-adjust: none; + transform-origin: 0 0; + caret-color: CanvasText; + z-index: 0; + user-select: text; + --min-font-size: 1; + --text-scale-factor: calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv: calc(1 / var(--min-font-size)); +} + +:host ::ng-deep .textLayer.highlighting { + touch-action: none; +} + +:host ::ng-deep .textLayer :is(span, br) { + position: absolute; + white-space: pre; + color: transparent; + cursor: text; + transform-origin: 0% 0%; +} + +:host ::ng-deep .textLayer > :not(.markedContent), +:host ::ng-deep .textLayer .markedContent span:not(.markedContent) { + z-index: 1; + --font-height: 0; + font-size: calc(var(--text-scale-factor) * var(--font-height)); + --scale-x: 1; + --rotate: 0deg; + transform: rotate(var(--rotate)) scaleX(var(--scale-x)) + scale(var(--min-font-size-inv)); +} + +:host ::ng-deep .textLayer .markedContent { + display: contents; +} + +:host ::ng-deep .textLayer span[role='img'] { + user-select: none; + cursor: default; +} + +:host ::ng-deep .textLayer .highlight { + --highlight-bg-color: rgb(180 0 170 / 0.25); + --highlight-selected-bg-color: rgb(0 100 0 / 0.25); + --highlight-backdrop-filter: none; + --highlight-selected-backdrop-filter: none; + margin: -1px; + padding: 1px; + background-color: var(--highlight-bg-color); + backdrop-filter: var(--highlight-backdrop-filter); + border-radius: 4px; +} + +:host ::ng-deep .appended:is(.textLayer .highlight) { + position: initial; +} + +:host ::ng-deep .begin:is(.textLayer .highlight) { + border-radius: 4px 0 0 4px; +} + +:host ::ng-deep .end:is(.textLayer .highlight) { + border-radius: 0 4px 4px 0; +} + +:host ::ng-deep .middle:is(.textLayer .highlight) { + border-radius: 0; +} + +:host ::ng-deep .selected:is(.textLayer .highlight) { + background-color: var(--highlight-selected-bg-color); +} + +:host ::ng-deep .textLayer ::selection { + background: rgba(30, 100, 255, 0.35); +} + +:host ::ng-deep .annotationLayer { + position: absolute; + inset: 0; + pointer-events: none; + + & .annotationTextContent { + opacity: 0; + } +} diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts new file mode 100644 index 0000000000..4e239a2a81 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.spec.ts @@ -0,0 +1,326 @@ +import { SimpleChange } from '@angular/core' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import * as pdfjs from 'pdfjs-dist/legacy/build/pdf.mjs' +import { PDFSinglePageViewer, PDFViewer } from 'pdfjs-dist/web/pdf_viewer.mjs' +import { PngxPdfViewerComponent } from './pdf-viewer.component' +import { PdfRenderMode, PdfZoomLevel, PdfZoomScale } from './pdf-viewer.types' + +describe('PngxPdfViewerComponent', () => { + let fixture: ComponentFixture + let component: PngxPdfViewerComponent + + const initComponent = async (src = 'test.pdf') => { + component.src = src + fixture.detectChanges() + await fixture.whenStable() + } + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PngxPdfViewerComponent], + }).compileComponents() + + fixture = TestBed.createComponent(PngxPdfViewerComponent) + component = fixture.componentInstance + }) + + it('loads a document and emits events', async () => { + const loadSpy = jest.fn() + const renderedSpy = jest.fn() + component.afterLoadComplete.subscribe(loadSpy) + component.rendered.subscribe(renderedSpy) + + await initComponent() + + expect(pdfjs.GlobalWorkerOptions.workerSrc).toBe( + '/assets/js/pdf.worker.min.mjs' + ) + const isVisible = (component as any).findController.onIsPageVisible as + | (() => boolean) + | undefined + expect(isVisible?.()).toBe(true) + expect(loadSpy).toHaveBeenCalledWith( + expect.objectContaining({ numPages: 1 }) + ) + expect(renderedSpy).toHaveBeenCalled() + expect((component as any).pdfViewer).toBeInstanceOf(PDFViewer) + }) + + it('initializes single-page viewer and disables text layer', async () => { + component.renderMode = PdfRenderMode.Single + component.selectable = false + + await initComponent() + + const viewer = (component as any).pdfViewer as PDFSinglePageViewer & { + options: Record + } + expect(viewer).toBeInstanceOf(PDFSinglePageViewer) + expect(viewer.options.textLayerMode).toBe(0) + }) + + it('applies zoom, rotation, and page changes', async () => { + await initComponent() + + const pageSpy = jest.fn() + component.pageChange.subscribe(pageSpy) + + // In real usage the viewer may have multiple pages; our pdfjs mock defaults + // to a single page, so explicitly simulate a multi-page document here. + const pdf = (component as any).pdf as { numPages: number } + pdf.numPages = 3 + const viewer = (component as any).pdfViewer as PDFViewer + viewer.setDocument(pdf) + + component.zoomScale = PdfZoomScale.PageFit + component.zoom = PdfZoomLevel.Two + component.rotation = 90 + component.page = 2 + + component.ngOnChanges({ + zoomScale: new SimpleChange( + PdfZoomScale.PageWidth, + PdfZoomScale.PageFit, + false + ), + zoom: new SimpleChange(PdfZoomLevel.One, PdfZoomLevel.Two, false), + rotation: new SimpleChange(undefined, 90, false), + page: new SimpleChange(undefined, 2, false), + }) + + expect(viewer.pagesRotation).toBe(90) + expect(viewer.currentPageNumber).toBe(2) + expect(pageSpy).toHaveBeenCalledWith(2) + + viewer.currentScale = 1 + ;(component as any).applyScale() + expect(viewer.currentScaleValue).toBe(PdfZoomScale.PageFit) + expect(viewer.currentScale).toBe(2) + + const applyScaleSpy = jest.spyOn(component as any, 'applyScale') + component.page = 2 + ;(component as any).lastViewerPage = 2 + ;(component as any).applyViewerState() + expect((component as any).lastViewerPage).toBeUndefined() + expect(applyScaleSpy).toHaveBeenCalled() + }) + + it('dispatches find when search query changes after render', async () => { + await initComponent() + + const eventBus = (component as any).eventBus as { dispatch: jest.Mock } + const dispatchSpy = jest.spyOn(eventBus, 'dispatch') + + ;(component as any).hasRenderedPage = true + component.searchQuery = 'needle' + component.ngOnChanges({ + searchQuery: new SimpleChange('', 'needle', false), + }) + + expect(dispatchSpy).toHaveBeenCalledWith('find', { + query: 'needle', + caseSensitive: false, + highlightAll: true, + phraseSearch: true, + }) + + component.ngOnChanges({ + searchQuery: new SimpleChange('needle', 'needle', false), + }) + expect(dispatchSpy).toHaveBeenCalledTimes(1) + }) + + it('emits error when document load fails', async () => { + const errorSpy = jest.fn() + component.loadError.subscribe(errorSpy) + + jest.spyOn(pdfjs, 'getDocument').mockImplementationOnce(() => { + return { + promise: Promise.reject(new Error('boom')), + destroy: jest.fn(), + } as any + }) + + await initComponent('bad.pdf') + + expect(errorSpy).toHaveBeenCalled() + }) + + it('cleans up resources on destroy', async () => { + await initComponent() + + const viewer = (component as any).pdfViewer as { cleanup: jest.Mock } + const loadingTask = (component as any).loadingTask as unknown as { + destroy: jest.Mock + } + const resizeObserver = (component as any).resizeObserver as unknown as { + disconnect: jest.Mock + } + const eventBus = (component as any).eventBus as { off: jest.Mock } + + jest.spyOn(viewer, 'cleanup') + jest.spyOn(loadingTask, 'destroy') + jest.spyOn(resizeObserver, 'disconnect') + jest.spyOn(eventBus, 'off') + + component.ngOnDestroy() + + expect(eventBus.off).toHaveBeenCalledWith( + 'pagerendered', + expect.any(Function) + ) + expect(eventBus.off).toHaveBeenCalledWith('pagesinit', expect.any(Function)) + expect(eventBus.off).toHaveBeenCalledWith( + 'pagechanging', + expect.any(Function) + ) + expect(resizeObserver.disconnect).toHaveBeenCalled() + expect(loadingTask.destroy).toHaveBeenCalled() + expect(viewer.cleanup).toHaveBeenCalled() + expect((component as any).pdfViewer).toBeUndefined() + }) + + it('skips work when viewer is missing or has no pages', () => { + const eventBus = (component as any).eventBus as { dispatch: jest.Mock } + const dispatchSpy = jest.spyOn(eventBus, 'dispatch') + ;(component as any).dispatchFindIfReady() + expect(dispatchSpy).not.toHaveBeenCalled() + ;(component as any).applyViewerState() + ;(component as any).applyScale() + + const viewer = new PDFViewer({ eventBus: undefined }) + viewer.pagesCount = 0 + ;(component as any).pdfViewer = viewer + viewer.currentScale = 5 + ;(component as any).applyScale() + expect(viewer.currentScale).toBe(5) + }) + + it('returns early on src change in ngOnChanges', () => { + const loadSpy = jest.spyOn(component as any, 'loadDocument') + const initSpy = jest.spyOn(component as any, 'initViewer') + const scaleSpy = jest.spyOn(component as any, 'applyViewerState') + const resizeSpy = jest.spyOn(component as any, 'setupResizeObserver') + + // Angular sets the input value before calling ngOnChanges; mirror that here. + component.src = 'test.pdf' + component.ngOnChanges({ + src: new SimpleChange(undefined, 'test.pdf', true), + zoomScale: new SimpleChange( + PdfZoomScale.PageWidth, + PdfZoomScale.PageFit, + false + ), + }) + + expect(loadSpy).toHaveBeenCalled() + expect(resizeSpy).not.toHaveBeenCalled() + expect(initSpy).not.toHaveBeenCalled() + expect(scaleSpy).not.toHaveBeenCalled() + }) + + it('resets viewer state on src change', () => { + const mockViewer = { + setDocument: jest.fn(), + currentPageNumber: 7, + cleanup: jest.fn(), + } + ;(component as any).pdfViewer = mockViewer + ;(component as any).loadingTask = { destroy: jest.fn() } + jest.spyOn(component as any, 'loadDocument').mockImplementation(() => {}) + + component.src = 'test.pdf' + component.ngOnChanges({ + src: new SimpleChange(undefined, 'test.pdf', true), + }) + + expect(mockViewer.setDocument).toHaveBeenCalledWith(null) + expect(mockViewer.currentPageNumber).toBe(1) + }) + + it('applies viewer state after view init when already loaded', () => { + const applySpy = jest.spyOn(component as any, 'applyViewerState') + ;(component as any).hasLoaded = true + ;(component as any).pdf = { numPages: 1 } + + fixture.detectChanges() + + expect(applySpy).toHaveBeenCalled() + }) + + it('skips viewer state after view init when no pdf is available', () => { + const applySpy = jest.spyOn(component as any, 'applyViewerState') + ;(component as any).hasLoaded = true + + fixture.detectChanges() + + expect(applySpy).not.toHaveBeenCalled() + }) + + it('does not reload when already loaded', async () => { + await initComponent() + + const getDocumentSpy = jest.spyOn(pdfjs, 'getDocument') + const callCount = getDocumentSpy.mock.calls.length + await (component as any).loadDocument() + + expect(getDocumentSpy).toHaveBeenCalledTimes(callCount) + }) + + it('runs applyScale on resize observer notifications', async () => { + await initComponent() + + const applySpy = jest.spyOn(component as any, 'applyScale') + const resizeObserver = (component as any).resizeObserver as { + trigger: () => void + } + resizeObserver.trigger() + + expect(applySpy).toHaveBeenCalled() + }) + + it('skips page work when no pages are available', async () => { + await initComponent() + + const viewer = (component as any).pdfViewer as PDFViewer + viewer.pagesCount = 0 + const applyScaleSpy = jest.spyOn(component as any, 'applyScale') + + component.page = undefined + ;(component as any).lastViewerPage = 1 + ;(component as any).applyViewerState() + + expect(applyScaleSpy).not.toHaveBeenCalled() + expect((component as any).lastViewerPage).toBe(1) + }) + + it('falls back to a default zoom when input is invalid', async () => { + await initComponent() + + const viewer = (component as any).pdfViewer as PDFViewer + viewer.currentScale = 3 + component.zoom = 'not-a-number' as PdfZoomLevel + ;(component as any).applyScale() + + expect(viewer.currentScale).toBe(3) + }) + + it('re-initializes viewer on selectable or render mode changes', async () => { + await initComponent() + + const initSpy = jest.spyOn(component as any, 'initViewer') + component.selectable = false + component.renderMode = PdfRenderMode.Single + + component.ngOnChanges({ + selectable: new SimpleChange(true, false, false), + renderMode: new SimpleChange( + PdfRenderMode.All, + PdfRenderMode.Single, + false + ), + }) + + expect(initSpy).toHaveBeenCalled() + }) +}) diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts new file mode 100644 index 0000000000..032ccd3e07 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.component.ts @@ -0,0 +1,287 @@ +import { + AfterViewInit, + Component, + ElementRef, + EventEmitter, + Input, + OnChanges, + OnDestroy, + Output, + SimpleChanges, + ViewChild, +} from '@angular/core' +import { + getDocument, + GlobalWorkerOptions, + PDFDocumentLoadingTask, + PDFDocumentProxy, +} from 'pdfjs-dist/legacy/build/pdf.mjs' +import { + EventBus, + PDFFindController, + PDFLinkService, + PDFSinglePageViewer, + PDFViewer, +} from 'pdfjs-dist/web/pdf_viewer.mjs' +import { + PdfRenderMode, + PdfSource, + PdfZoomLevel, + PdfZoomScale, + PngxPdfDocumentProxy, +} from './pdf-viewer.types' + +@Component({ + selector: 'pngx-pdf-viewer', + templateUrl: './pdf-viewer.component.html', + styleUrl: './pdf-viewer.component.scss', +}) +export class PngxPdfViewerComponent + implements AfterViewInit, OnChanges, OnDestroy +{ + @Input() src!: PdfSource + @Input() page?: number + @Output() pageChange = new EventEmitter() + @Input() rotation?: number + @Input() renderMode: PdfRenderMode = PdfRenderMode.All + @Input() selectable = true + @Input() searchQuery = '' + @Input() zoom: PdfZoomLevel = PdfZoomLevel.One + @Input() zoomScale: PdfZoomScale = PdfZoomScale.PageWidth + + @Output() afterLoadComplete = new EventEmitter() + @Output() rendered = new EventEmitter() + @Output() loadError = new EventEmitter() + + @ViewChild('container', { static: true }) + private readonly container!: ElementRef + + @ViewChild('viewer', { static: true }) + private readonly viewer!: ElementRef + + private hasLoaded = false + private loadingTask?: PDFDocumentLoadingTask + private resizeObserver?: ResizeObserver + private pdf?: PDFDocumentProxy + private pdfViewer?: PDFViewer | PDFSinglePageViewer + private hasRenderedPage = false + private lastFindQuery = '' + private lastViewerPage?: number + + private readonly eventBus = new EventBus() + private readonly linkService = new PDFLinkService({ eventBus: this.eventBus }) + private readonly findController = new PDFFindController({ + eventBus: this.eventBus, + linkService: this.linkService, + updateMatchesCountOnProgress: false, + }) + + private readonly onPageRendered = () => { + this.hasRenderedPage = true + this.dispatchFindIfReady() + this.rendered.emit() + } + private readonly onPagesInit = () => this.applyViewerState() + private readonly onPageChanging = (evt: { pageNumber: number }) => { + // Avoid [(page)] two-way binding re-triggers navigation + this.lastViewerPage = evt.pageNumber + this.pageChange.emit(evt.pageNumber) + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes['src']) { + this.resetViewerState() + if (this.src) { + this.loadDocument() + } + return + } + + if (changes['zoomScale']) { + this.setupResizeObserver() + } + + if (changes['selectable'] || changes['renderMode']) { + this.initViewer() + } + + if ( + changes['page'] || + changes['zoom'] || + changes['zoomScale'] || + changes['rotation'] + ) { + this.applyViewerState() + } + + if (changes['searchQuery']) { + this.dispatchFindIfReady() + } + } + + ngAfterViewInit(): void { + this.setupResizeObserver() + this.initViewer() + if (!this.hasLoaded) { + this.loadDocument() + return + } + if (this.pdf) { + this.applyViewerState() + } + } + + ngOnDestroy(): void { + this.eventBus.off('pagerendered', this.onPageRendered) + this.eventBus.off('pagesinit', this.onPagesInit) + this.eventBus.off('pagechanging', this.onPageChanging) + this.resizeObserver?.disconnect() + this.loadingTask?.destroy() + this.pdfViewer?.cleanup() + this.pdfViewer = undefined + } + + private resetViewerState(): void { + this.hasLoaded = false + this.hasRenderedPage = false + this.lastFindQuery = '' + this.lastViewerPage = undefined + this.loadingTask?.destroy() + this.loadingTask = undefined + this.pdf = undefined + this.linkService.setDocument(null) + if (this.pdfViewer) { + this.pdfViewer.setDocument(null) + this.pdfViewer.currentPageNumber = 1 + } + } + + private async loadDocument(): Promise { + if (this.hasLoaded) { + return + } + + this.hasLoaded = true + this.hasRenderedPage = false + this.lastFindQuery = '' + this.loadingTask?.destroy() + + GlobalWorkerOptions.workerSrc = '/assets/js/pdf.worker.min.mjs' + this.loadingTask = getDocument(this.src) + + try { + const pdf = await this.loadingTask.promise + this.pdf = pdf + this.linkService.setDocument(pdf) + this.findController.onIsPageVisible = () => true + this.pdfViewer?.setDocument(pdf) + this.applyViewerState() + this.afterLoadComplete.emit(pdf) + } catch (err) { + this.loadError.emit(err) + } + } + + private setupResizeObserver(): void { + this.resizeObserver?.disconnect() + this.resizeObserver = new ResizeObserver(() => { + this.applyScale() + }) + this.resizeObserver.observe(this.container.nativeElement) + } + + private initViewer(): void { + this.viewer.nativeElement.innerHTML = '' + this.pdfViewer?.cleanup() + this.hasRenderedPage = false + this.lastFindQuery = '' + + const textLayerMode = this.selectable === false ? 0 : 1 + const options = { + container: this.container.nativeElement, + viewer: this.viewer.nativeElement, + eventBus: this.eventBus, + linkService: this.linkService, + findController: this.findController, + textLayerMode, + removePageBorders: true, + } + + this.pdfViewer = + this.renderMode === PdfRenderMode.Single + ? new PDFSinglePageViewer(options) + : new PDFViewer(options) + this.linkService.setViewer(this.pdfViewer) + + this.eventBus.off('pagerendered', this.onPageRendered) + this.eventBus.off('pagesinit', this.onPagesInit) + this.eventBus.off('pagechanging', this.onPageChanging) + this.eventBus.on('pagerendered', this.onPageRendered) + this.eventBus.on('pagesinit', this.onPagesInit) + this.eventBus.on('pagechanging', this.onPageChanging) + + if (this.pdf) { + this.pdfViewer.setDocument(this.pdf) + this.applyViewerState() + } + } + + private applyViewerState(): void { + if (!this.pdfViewer) { + return + } + const hasPages = this.pdfViewer.pagesCount > 0 + if (typeof this.rotation === 'number' && hasPages) { + this.pdfViewer.pagesRotation = this.rotation + } + if ( + typeof this.page === 'number' && + hasPages && + this.page !== this.lastViewerPage + ) { + const nextPage = Math.min( + Math.max(Math.trunc(this.page), 1), + this.pdfViewer.pagesCount + ) + this.pdfViewer.currentPageNumber = nextPage + } + if (this.page === this.lastViewerPage) { + this.lastViewerPage = undefined + } + if (hasPages) { + this.applyScale() + } + this.dispatchFindIfReady() + } + + private applyScale(): void { + if (!this.pdfViewer) { + return + } + if (this.pdfViewer.pagesCount === 0) { + return + } + const zoomFactor = Number(this.zoom) || 1 + this.pdfViewer.currentScaleValue = this.zoomScale + if (zoomFactor !== 1) { + this.pdfViewer.currentScale = this.pdfViewer.currentScale * zoomFactor + } + } + + private dispatchFindIfReady(): void { + if (!this.hasRenderedPage) { + return + } + const query = this.searchQuery.trim() + if (query === this.lastFindQuery) { + return + } + this.lastFindQuery = query + this.eventBus.dispatch('find', { + query, + caseSensitive: false, + highlightAll: query.length > 0, + phraseSearch: true, + }) + } +} diff --git a/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.types.ts b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.types.ts new file mode 100644 index 0000000000..edce9a7e73 --- /dev/null +++ b/src-ui/src/app/components/common/pdf-viewer/pdf-viewer.types.ts @@ -0,0 +1,25 @@ +export type PngxPdfDocumentProxy = { + numPages: number +} + +export type PdfSource = string | { url: string; password?: string } + +export enum PdfRenderMode { + Single = 'single', + All = 'all', +} + +export enum PdfZoomScale { + PageFit = 'page-fit', + PageWidth = 'page-width', +} + +export enum PdfZoomLevel { + Quarter = '.25', + Half = '.5', + ThreeQuarters = '.75', + One = '1', + OneAndHalf = '1.5', + Two = '2', + Three = '3', +} diff --git a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.html b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.html index fd88002baa..f11fc97609 100644 --- a/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.html +++ b/src-ui/src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -16,6 +16,12 @@
    + @if (note) { +
    + {{ note }} +
    + } +
    @@ -276,10 +313,10 @@
    Error:
    diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts index 1785459f46..0fd331b10d 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts @@ -68,6 +68,9 @@ const status: SystemStatus = { sanity_check_status: SystemStatusItemStatus.OK, sanity_check_last_run: new Date().toISOString(), sanity_check_error: null, + llmindex_status: SystemStatusItemStatus.OK, + llmindex_last_modified: new Date().toISOString(), + llmindex_error: null, }, } diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts index f88d56ff6e..d53bb74bf9 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts @@ -13,9 +13,11 @@ import { SystemStatus, SystemStatusItemStatus, } from 'src/app/data/system-status' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { FileSizePipe } from 'src/app/pipes/file-size.pipe' import { PermissionsService } from 'src/app/services/permissions.service' +import { SettingsService } from 'src/app/services/settings.service' import { SystemStatusService } from 'src/app/services/system-status.service' import { TasksService } from 'src/app/services/tasks.service' import { ToastService } from 'src/app/services/toast.service' @@ -44,6 +46,7 @@ export class SystemStatusDialogComponent implements OnInit, OnDestroy { private toastService = inject(ToastService) private permissionsService = inject(PermissionsService) private websocketStatusService = inject(WebsocketStatusService) + private settingsService = inject(SettingsService) public SystemStatusItemStatus = SystemStatusItemStatus public PaperlessTaskName = PaperlessTaskName @@ -60,6 +63,10 @@ export class SystemStatusDialogComponent implements OnInit, OnDestroy { return this.permissionsService.isSuperUser() } + get aiEnabled(): boolean { + return this.settingsService.get(SETTINGS_KEYS.AI_ENABLED) + } + public ngOnInit() { this.versionMismatch = environment.production && diff --git a/src-ui/src/app/components/common/toast/toast.component.html b/src-ui/src/app/components/common/toast/toast.component.html index f8b2d47419..3fec3899ef 100644 --- a/src-ui/src/app/components/common/toast/toast.component.html +++ b/src-ui/src/app/components/common/toast/toast.component.html @@ -35,10 +35,10 @@
    diff --git a/src-ui/src/app/components/dashboard/dashboard.component.spec.ts b/src-ui/src/app/components/dashboard/dashboard.component.spec.ts index ac2823182f..a23eefb2b9 100644 --- a/src-ui/src/app/components/dashboard/dashboard.component.spec.ts +++ b/src-ui/src/app/components/dashboard/dashboard.component.spec.ts @@ -5,8 +5,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing' import { By } from '@angular/platform-browser' import { RouterTestingModule } from '@angular/router/testing' import { NgbAlertModule } from '@ng-bootstrap/ng-bootstrap' -import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' -import { TourNgBootstrapModule, TourService } from 'ngx-ui-tour-ng-bootstrap' +import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { + provideUiTour, + TourNgBootstrap, + TourService, +} from 'ngx-ui-tour-ng-bootstrap' import { of, throwError } from 'rxjs' import { SavedView } from 'src/app/data/saved-view' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' @@ -75,7 +79,7 @@ describe('DashboardComponent', () => { imports: [ NgbAlertModule, RouterTestingModule, - TourNgBootstrapModule, + TourNgBootstrap, DragDropModule, NgxBootstrapIconsModule.pick(allIcons), DashboardComponent, @@ -111,6 +115,7 @@ describe('DashboardComponent', () => { }, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), + provideUiTour(), ], }).compileComponents() diff --git a/src-ui/src/app/components/dashboard/dashboard.component.ts b/src-ui/src/app/components/dashboard/dashboard.component.ts index b70acaad68..2d7e9445e1 100644 --- a/src-ui/src/app/components/dashboard/dashboard.component.ts +++ b/src-ui/src/app/components/dashboard/dashboard.component.ts @@ -8,7 +8,7 @@ import { import { Component, inject } from '@angular/core' import { RouterModule } from '@angular/router' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { TourNgBootstrapModule, TourService } from 'ngx-ui-tour-ng-bootstrap' +import { TourNgBootstrap, TourService } from 'ngx-ui-tour-ng-bootstrap' import { SavedView } from 'src/app/data/saved-view' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SavedViewService } from 'src/app/services/rest/saved-view.service' @@ -36,7 +36,7 @@ import { WelcomeWidgetComponent } from './widgets/welcome-widget/welcome-widget. WelcomeWidgetComponent, IfPermissionsDirective, DragDropModule, - TourNgBootstrapModule, + TourNgBootstrap, NgxBootstrapIconsModule, RouterModule, ], diff --git a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html index 1f278df16b..08ec0b453d 100644 --- a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html @@ -2,7 +2,7 @@
    diff --git a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.spec.ts b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.spec.ts index 2ed91ab135..c27cadbda4 100644 --- a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.spec.ts +++ b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.spec.ts @@ -9,6 +9,7 @@ import { import { By } from '@angular/platform-browser' import { RouterTestingModule } from '@angular/router/testing' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { routes } from 'src/app/app-routing.module' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { PermissionsService } from 'src/app/services/permissions.service' @@ -61,6 +62,7 @@ describe('UploadFileWidgetComponent', () => { }, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), + provideUiTour(), ], }).compileComponents() diff --git a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts index c440f4b213..945673e142 100644 --- a/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts +++ b/src-ui/src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts @@ -7,7 +7,7 @@ import { NgbProgressbarModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { TourNgBootstrapModule } from 'ngx-ui-tour-ng-bootstrap' +import { TourNgBootstrap } from 'ngx-ui-tour-ng-bootstrap' import { ComponentWithPermissions } from 'src/app/components/with-permissions/with-permissions.component' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' @@ -33,7 +33,7 @@ import { WidgetFrameComponent } from '../widget-frame/widget-frame.component' NgbAlertModule, NgbProgressbarModule, NgxBootstrapIconsModule, - TourNgBootstrapModule, + TourNgBootstrap, ], }) export class UploadFileWidgetComponent extends ComponentWithPermissions { diff --git a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.spec.ts b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.spec.ts index c721c7b51a..961b9eb901 100644 --- a/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.spec.ts +++ b/src-ui/src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing' import { By } from '@angular/platform-browser' import { NgbAlert, NgbAlertModule } from '@ng-bootstrap/ng-bootstrap' +import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { WidgetFrameComponent } from '../widget-frame/widget-frame.component' import { WelcomeWidgetComponent } from './welcome-widget.component' @@ -11,7 +12,7 @@ describe('WelcomeWidgetComponent', () => { beforeEach(async () => { TestBed.configureTestingModule({ - providers: [PermissionsGuard], + providers: [PermissionsGuard, provideUiTour()], imports: [NgbAlertModule, WelcomeWidgetComponent, WidgetFrameComponent], }).compileComponents() diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index d8cd2d756a..b1b8a35bad 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -1,7 +1,7 @@ - + @if (archiveContentRenderType === ContentRenderType.PDF && !useNativePdfViewer) { @if (previewNumPages) { -
    +
    Page
    of {{previewNumPages}}
    @@ -24,6 +24,16 @@ Delete + +
    - @if (metadata?.has_archive_version) { -
    - -
    + + @if (userIsOwner && (requiresPassword || password)) { + + }
    - - - -
    @if (emailEnabled) { }
    @@ -98,7 +109,7 @@
    -
    +
    @@ -115,6 +126,32 @@
    + +
    + + +
    + +
    + + +
    +
    +
    @@ -123,17 +160,27 @@ Details
    - - + + @if (!isFieldHidden(DocumentDetailFieldID.ArchiveSerialNumber)) { + + } - - - - + @if (!isFieldHidden(DocumentDetailFieldID.Correspondent)) { + + } + @if (!isFieldHidden(DocumentDetailFieldID.DocumentType)) { + + } + @if (!isFieldHidden(DocumentDetailFieldID.StoragePath)) { + + } + @if (!isFieldHidden(DocumentDetailFieldID.Tags)) { + + } @for (fieldInstance of document?.custom_fields; track fieldInstance.field; let i = $index) {
    @switch (getCustomFieldFromInstance(fieldInstance)?.data_type) { @@ -348,6 +395,37 @@ } + + @if (document?.duplicate_documents?.length) { +
  • + + Duplicates + {{ document.duplicate_documents.length }} + + +
    +
    Duplicate documents detected:
    + +
    +
    +
  • + }
    @@ -355,14 +433,14 @@
    -
    +
    -
    +
    @if (hasNext()) { @@ -379,7 +457,7 @@
    @if (showThumbnailOverlay) { - Document loading... + Document loading... }
    @@ -393,17 +471,15 @@ @case (ContentRenderType.PDF) { @if (!useNativePdfViewer) {
    - - + (loadError)="onError($event)" + (afterLoadComplete)="pdfPreviewLoaded($event)"> +
    } @else { @@ -414,7 +490,7 @@ } @case (ContentRenderType.Image) {
    - {{title}} + {{title}}
    } @case (ContentRenderType.TIFF) { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.scss b/src-ui/src/app/components/document-detail/document-detail.component.scss index 3fc009020f..3986f2cbc1 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.scss +++ b/src-ui/src/app/components/document-detail/document-detail.component.scss @@ -5,20 +5,15 @@ } .pdf-viewer-container { - padding-top: 10px; + padding: 8px; background-color: gray; - pdf-viewer { + pngx-pdf-viewer { width: 100%; height: 100%; } } -::ng-deep .ng2-pdf-viewer-container .page { - --page-margin: 0 auto 10px; - --page-border: 0; -} - .btn-group .dropdown-toggle-split { border-top-right-radius: inherit; border-bottom-right-radius: inherit; diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index dada600743..5b7d7ef134 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -48,6 +48,7 @@ import { } from 'src/app/data/filter-rule-type' import { StoragePath } from 'src/app/data/storage-path' import { Tag } from 'src/app/data/tag' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { DocumentTitlePipe } from 'src/app/pipes/document-title.pipe' @@ -64,13 +65,16 @@ import { TagService } from 'src/app/services/rest/tag.service' import { UserService } from 'src/app/services/rest/user.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' +import { WebsocketStatusService } from 'src/app/services/websocket-status.service' import { environment } from 'src/environments/environment' import { ConfirmDialogComponent } from '../common/confirm-dialog/confirm-dialog.component' +import { PasswordRemovalConfirmDialogComponent } from '../common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component' import { CustomFieldsDropdownComponent } from '../common/custom-fields-dropdown/custom-fields-dropdown.component' import { - DocumentDetailComponent, - ZoomSetting, -} from './document-detail.component' + PdfZoomLevel, + PdfZoomScale, +} from '../common/pdf-viewer/pdf-viewer.types' +import { DocumentDetailComponent } from './document-detail.component' const doc: Document = { id: 3, @@ -80,9 +84,9 @@ const doc: Document = { storage_path: 31, tags: [41, 42, 43], content: 'text content', - added: new Date('May 4, 2014 03:24:00'), - created: new Date('May 4, 2014 03:24:00'), - modified: new Date('May 4, 2014 03:24:00'), + added: new Date('May 4, 2014 03:24:00').toISOString(), + created: new Date('May 4, 2014 03:24:00').toISOString(), + modified: new Date('May 4, 2014 03:24:00').toISOString(), archive_serial_number: null, original_file_name: 'file.pdf', owner: null, @@ -156,6 +160,16 @@ describe('DocumentDetailComponent', () => { { provide: TagService, useValue: { + getCachedMany: (ids: number[]) => + of( + ids.map((id) => ({ + id, + name: `Tag${id}`, + is_inbox_tag: true, + color: '#ff0000', + text_color: '#000000', + })) + ), listAll: () => of({ count: 3, @@ -281,6 +295,27 @@ describe('DocumentDetailComponent', () => { component = fixture.componentInstance }) + function initNormally() { + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' }))) + jest + .spyOn(documentService, 'get') + .mockReturnValueOnce(of(Object.assign({}, doc))) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + jest + .spyOn(openDocumentsService, 'openDocument') + .mockReturnValueOnce(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + fixture.detectChanges() + } + it('should load four tabs via url params', () => { jest .spyOn(activatedRoute, 'paramMap', 'get') @@ -290,16 +325,39 @@ describe('DocumentDetailComponent', () => { .spyOn(openDocumentsService, 'openDocument') .mockReturnValueOnce(of(true)) fixture.detectChanges() - expect(component.activeNavID).toEqual(5) // DocumentDetailNavIDs.Notes + expect(component.activeNavID).toEqual(component.DocumentDetailNavIDs.Notes) + }) + + it('should switch from preview to details when pdf preview enters the DOM', fakeAsync(() => { + component.nav = { + activeId: component.DocumentDetailNavIDs.Preview, + select: jest.fn(), + } as any + ;(component as any).pdfPreview = { + nativeElement: { offsetParent: {} }, + } + + tick() + expect(component.nav.select).toHaveBeenCalledWith( + component.DocumentDetailNavIDs.Details + ) + })) + + it('should forward title key up value to titleSubject', () => { + const subjectSpy = jest.spyOn(component.titleSubject, 'next') + + component.titleKeyUp({ target: { value: 'Updated title' } }) + + expect(subjectSpy).toHaveBeenCalledWith('Updated title') }) it('should change url on tab switch', () => { initNormally() const navigateSpy = jest.spyOn(router, 'navigate') - component.nav.select(5) + component.nav.select(component.DocumentDetailNavIDs.Notes) component.nav.navChange.next({ activeId: 1, - nextId: 5, + nextId: component.DocumentDetailNavIDs.Notes, preventDefault: () => {}, }) fixture.detectChanges() @@ -341,6 +399,129 @@ describe('DocumentDetailComponent', () => { expect(component.document).toEqual(doc) }) + it('should redirect to root when opening a version document id', () => { + const navigateSpy = jest.spyOn(router, 'navigate') + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 10, section: 'details' }))) + jest + .spyOn(documentService, 'get') + .mockReturnValueOnce(throwError(() => ({ status: 404 }) as any)) + const getRootSpy = jest + .spyOn(documentService, 'getRootId') + .mockReturnValue(of({ root_id: 3 })) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + jest + .spyOn(openDocumentsService, 'openDocument') + .mockReturnValueOnce(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + + fixture.detectChanges() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + expect(getRootSpy).toHaveBeenCalledWith(10) + expect(navigateSpy).toHaveBeenCalledWith(['documents', 3, 'details'], { + replaceUrl: true, + }) + }) + + it('should navigate to 404 when root lookup fails', () => { + const navigateSpy = jest.spyOn(router, 'navigate') + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 10, section: 'details' }))) + jest + .spyOn(documentService, 'get') + .mockReturnValueOnce(throwError(() => ({ status: 404 }) as any)) + jest + .spyOn(documentService, 'getRootId') + .mockReturnValue(throwError(() => new Error('boom'))) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + jest + .spyOn(openDocumentsService, 'openDocument') + .mockReturnValueOnce(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + + fixture.detectChanges() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + expect(navigateSpy).toHaveBeenCalledWith(['404'], { replaceUrl: true }) + }) + + it('should not render a delete button for the root/original version', () => { + const docWithVersions = { + ...doc, + versions: [ + { + id: doc.id, + added: new Date('2024-01-01T00:00:00Z'), + version_label: 'Original', + checksum: 'aaaa', + is_root: true, + }, + { + id: 10, + added: new Date('2024-01-02T00:00:00Z'), + version_label: 'Edited', + checksum: 'bbbb', + is_root: false, + }, + ], + } as Document + + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' }))) + jest.spyOn(documentService, 'get').mockReturnValueOnce(of(docWithVersions)) + jest + .spyOn(documentService, 'getMetadata') + .mockReturnValue(of({ has_archive_version: true } as any)) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + jest + .spyOn(openDocumentsService, 'openDocument') + .mockReturnValueOnce(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + + fixture.detectChanges() + httpTestingController.expectOne(component.previewUrl).flush('preview') + fixture.detectChanges() + + const deleteButtons = fixture.debugElement.queryAll( + By.css('pngx-confirm-button') + ) + expect(deleteButtons.length).toEqual(1) + }) + + it('should fall back to details tab when duplicates tab is active but no duplicates', () => { + initNormally() + component.activeNavID = component.DocumentDetailNavIDs.Duplicates + const noDupDoc = { ...doc, duplicate_documents: [] } + + component.updateComponent(noDupDoc) + + expect(component.activeNavID).toEqual( + component.DocumentDetailNavIDs.Details + ) + }) + it('should load already-opened document via param', () => { initNormally() jest.spyOn(documentService, 'get').mockReturnValueOnce(of(doc)) @@ -356,6 +537,38 @@ describe('DocumentDetailComponent', () => { expect(component.document).toEqual(doc) }) + it('should update cached open document duplicates when reloading an open doc', () => { + const openDoc = { ...doc, duplicate_documents: [{ id: 1, title: 'Old' }] } + const updatedDuplicates = [ + { id: 2, title: 'Newer duplicate', deleted_at: null }, + ] + jest + .spyOn(activatedRoute, 'paramMap', 'get') + .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' }))) + jest.spyOn(documentService, 'get').mockReturnValue( + of({ + ...doc, + modified: '2024-01-02T00:00:00Z', + duplicate_documents: updatedDuplicates, + }) + ) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(openDoc) + const saveSpy = jest.spyOn(openDocumentsService, 'save') + jest.spyOn(openDocumentsService, 'openDocument').mockReturnValue(of(true)) + jest.spyOn(customFieldsService, 'listAll').mockReturnValue( + of({ + count: customFields.length, + all: customFields.map((f) => f.id), + results: customFields, + }) + ) + + fixture.detectChanges() + + expect(openDoc.duplicate_documents).toEqual(updatedDuplicates) + expect(saveSpy).toHaveBeenCalled() + }) + it('should disable form if user cannot edit', () => { currentUserHasObjectPermissions = false initNormally() @@ -382,8 +595,32 @@ describe('DocumentDetailComponent', () => { currentUserCan = true }) - it('should support creating document type', () => { + it('should support creating tag, remove from suggestions', () => { + initNormally() + component.suggestions = { + suggested_tags: ['Tag1', 'NewTag12'], + } + let openModal: NgbModalRef + modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) + const modalSpy = jest.spyOn(modalService, 'open') + component.createTag('NewTag12') + expect(modalSpy).toHaveBeenCalled() + openModal.componentInstance.succeeded.next({ + id: 12, + name: 'NewTag12', + is_inbox_tag: true, + color: '#ff0000', + text_color: '#000000', + }) + expect(component.tagsInput.value).toContain(12) + expect(component.suggestions.suggested_tags).not.toContain('NewTag12') + }) + + it('should support creating document type, remove from suggestions', () => { initNormally() + component.suggestions = { + suggested_document_types: ['DocumentType1', 'NewDocType2'], + } let openModal: NgbModalRef modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) const modalSpy = jest.spyOn(modalService, 'open') @@ -391,10 +628,16 @@ describe('DocumentDetailComponent', () => { expect(modalSpy).toHaveBeenCalled() openModal.componentInstance.succeeded.next({ id: 12, name: 'NewDocType12' }) expect(component.documentForm.get('document_type').value).toEqual(12) + expect(component.suggestions.suggested_document_types).not.toContain( + 'NewDocType2' + ) }) - it('should support creating correspondent', () => { + it('should support creating correspondent, remove from suggestions', () => { initNormally() + component.suggestions = { + suggested_correspondents: ['Correspondent1', 'NewCorrrespondent12'], + } let openModal: NgbModalRef modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) const modalSpy = jest.spyOn(modalService, 'open') @@ -405,6 +648,9 @@ describe('DocumentDetailComponent', () => { name: 'NewCorrrespondent12', }) expect(component.documentForm.get('correspondent').value).toEqual(12) + expect(component.suggestions.suggested_correspondents).not.toContain( + 'NewCorrrespondent12' + ) }) it('should support creating storage path', () => { @@ -442,6 +688,18 @@ describe('DocumentDetailComponent', () => { expect(navigateSpy).toHaveBeenCalledWith(['404'], { replaceUrl: true }) }) + it('discard should request the currently selected version', () => { + initNormally() + const getSpy = jest.spyOn(documentService, 'get') + getSpy.mockClear() + getSpy.mockReturnValueOnce(of(doc)) + + component.selectedVersionId = 10 + component.discard() + + expect(getSpy).toHaveBeenCalledWith(component.documentId, 10) + }) + it('should 404 on invalid id', () => { const navigateSpy = jest.spyOn(router, 'navigate') jest @@ -494,6 +752,18 @@ describe('DocumentDetailComponent', () => { ) }) + it('save should target currently selected version', () => { + initNormally() + component.selectedVersionId = 10 + const patchSpy = jest.spyOn(documentService, 'patch') + patchSpy.mockReturnValue(of(doc)) + + component.save() + + expect(patchSpy).toHaveBeenCalled() + expect(patchSpy.mock.calls[0][1]).toEqual(10) + }) + it('should show toast error on save if error occurs', () => { currentUserHasObjectPermissions = true initNormally() @@ -680,8 +950,8 @@ describe('DocumentDetailComponent', () => { it('should support reprocess, confirm and close modal after started', () => { initNormally() - const bulkEditSpy = jest.spyOn(documentService, 'bulkEdit') - bulkEditSpy.mockReturnValue(of(true)) + const reprocessSpy = jest.spyOn(documentService, 'reprocessDocuments') + reprocessSpy.mockReturnValue(of(true)) let openModal: NgbModalRef modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) const modalSpy = jest.spyOn(modalService, 'open') @@ -689,7 +959,7 @@ describe('DocumentDetailComponent', () => { component.reprocess() const modalCloseSpy = jest.spyOn(openModal, 'close') openModal.componentInstance.confirmClicked.next() - expect(bulkEditSpy).toHaveBeenCalledWith([doc.id], 'reprocess', {}) + expect(reprocessSpy).toHaveBeenCalledWith([doc.id]) expect(modalSpy).toHaveBeenCalled() expect(toastSpy).toHaveBeenCalled() expect(modalCloseSpy).toHaveBeenCalled() @@ -697,13 +967,13 @@ describe('DocumentDetailComponent', () => { it('should show error if redo ocr call fails', () => { initNormally() - const bulkEditSpy = jest.spyOn(documentService, 'bulkEdit') + const reprocessSpy = jest.spyOn(documentService, 'reprocessDocuments') let openModal: NgbModalRef modalService.activeInstances.subscribe((modal) => (openModal = modal[0])) const toastSpy = jest.spyOn(toastService, 'showError') component.reprocess() const modalCloseSpy = jest.spyOn(openModal, 'close') - bulkEditSpy.mockReturnValue(throwError(() => new Error('error occurred'))) + reprocessSpy.mockReturnValue(throwError(() => new Error('error occurred'))) openModal.componentInstance.confirmClicked.next() expect(toastSpy).toHaveBeenCalled() expect(modalCloseSpy).not.toHaveBeenCalled() @@ -773,7 +1043,7 @@ describe('DocumentDetailComponent', () => { it('should support zoom controls', () => { initNormally() - component.setZoom(ZoomSetting.One) // from select + component.setZoom(PdfZoomLevel.One) // from select expect(component.previewZoomSetting).toEqual('1') component.increaseZoom() expect(component.previewZoomSetting).toEqual('1.5') @@ -781,18 +1051,18 @@ describe('DocumentDetailComponent', () => { expect(component.previewZoomSetting).toEqual('2') component.decreaseZoom() expect(component.previewZoomSetting).toEqual('1.5') - component.setZoom(ZoomSetting.One) // from select + component.setZoom(PdfZoomLevel.One) // from select component.decreaseZoom() expect(component.previewZoomSetting).toEqual('.75') - component.setZoom(ZoomSetting.PageFit) // from select + component.setZoom(PdfZoomScale.PageFit) // from select expect(component.previewZoomScale).toEqual('page-fit') expect(component.previewZoomSetting).toEqual('1') component.increaseZoom() expect(component.previewZoomSetting).toEqual('1.5') expect(component.previewZoomScale).toEqual('page-width') - component.setZoom(ZoomSetting.PageFit) // from select + component.setZoom(PdfZoomScale.PageFit) // from select expect(component.previewZoomScale).toEqual('page-fit') expect(component.previewZoomSetting).toEqual('1') component.decreaseZoom() @@ -802,10 +1072,10 @@ describe('DocumentDetailComponent', () => { it('should select correct zoom setting in dropdown', () => { initNormally() - component.setZoom(ZoomSetting.PageFit) - expect(component.currentZoom).toEqual(ZoomSetting.PageFit) - component.setZoom(ZoomSetting.Quarter) - expect(component.currentZoom).toEqual(ZoomSetting.Quarter) + component.setZoom(PdfZoomScale.PageFit) + expect(component.currentZoom).toEqual(PdfZoomScale.PageFit) + component.setZoom(PdfZoomLevel.Quarter) + expect(component.currentZoom).toEqual(PdfZoomLevel.Quarter) }) it('should support updating notes dynamically', () => { @@ -927,16 +1197,16 @@ describe('DocumentDetailComponent', () => { it('should display built-in pdf viewer if not disabled', () => { initNormally() component.document.archived_file_name = 'file.pdf' - jest.spyOn(settingsService, 'get').mockReturnValue(false) + settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, false) expect(component.useNativePdfViewer).toBeFalsy() fixture.detectChanges() - expect(fixture.debugElement.query(By.css('pdf-viewer'))).not.toBeNull() + expect(fixture.debugElement.query(By.css('pngx-pdf-viewer'))).not.toBeNull() }) it('should display native pdf viewer if enabled', () => { initNormally() component.document.archived_file_name = 'file.pdf' - jest.spyOn(settingsService, 'get').mockReturnValue(true) + settingsService.set(SETTINGS_KEYS.USE_NATIVE_PDF_VIEWER, true) expect(component.useNativePdfViewer).toBeTruthy() fixture.detectChanges() expect(fixture.debugElement.query(By.css('object'))).not.toBeNull() @@ -946,7 +1216,32 @@ describe('DocumentDetailComponent', () => { const metadataSpy = jest.spyOn(documentService, 'getMetadata') metadataSpy.mockReturnValue(of({ has_archive_version: true })) initNormally() - expect(metadataSpy).toHaveBeenCalled() + expect(metadataSpy).toHaveBeenCalledWith(doc.id, null) + }) + + it('should pass metadata version only for non-latest selected versions', () => { + const metadataSpy = jest.spyOn(documentService, 'getMetadata') + metadataSpy.mockReturnValue(of({ has_archive_version: true })) + initNormally() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + expect(metadataSpy).toHaveBeenCalledWith(doc.id, null) + + metadataSpy.mockClear() + component.document.versions = [ + { id: doc.id, is_root: true }, + { id: 10, is_root: false }, + ] as any + jest.spyOn(documentService, 'getPreviewUrl').mockReturnValue('preview-root') + jest.spyOn(documentService, 'getThumbUrl').mockReturnValue('thumb-root') + jest + .spyOn(documentService, 'get') + .mockReturnValue(of({ content: 'root' } as Document)) + + component.selectVersion(doc.id) + httpTestingController.expectOne('preview-root').flush('root') + + expect(metadataSpy).toHaveBeenCalledWith(doc.id, doc.id) }) it('should show an error if failed metadata retrieval', () => { @@ -995,7 +1290,7 @@ describe('DocumentDetailComponent', () => { expect(component.document.custom_fields).toHaveLength(initialLength - 1) expect(component.customFieldFormFields).toHaveLength(initialLength - 1) expect( - fixture.debugElement.query(By.css('form')).nativeElement.textContent + fixture.debugElement.query(By.css('form ul')).nativeElement.textContent ).not.toContain('Field 1') const patchSpy = jest.spyOn(documentService, 'patch') component.save(true) @@ -1086,10 +1381,22 @@ describe('DocumentDetailComponent', () => { it('should get suggestions', () => { const suggestionsSpy = jest.spyOn(documentService, 'getSuggestions') - suggestionsSpy.mockReturnValue(of({ tags: [42, 43] })) + suggestionsSpy.mockReturnValue( + of({ + tags: [42, 43], + suggested_tags: [], + suggested_document_types: [], + suggested_correspondents: [], + }) + ) initNormally() expect(suggestionsSpy).toHaveBeenCalled() - expect(component.suggestions).toEqual({ tags: [42, 43] }) + expect(component.suggestions).toEqual({ + tags: [42, 43], + suggested_tags: [], + suggested_document_types: [], + suggested_correspondents: [], + }) }) it('should show error if needed for get suggestions', () => { @@ -1103,17 +1410,21 @@ describe('DocumentDetailComponent', () => { expect(errorSpy).toHaveBeenCalled() }) - it('should warn when open document does not match doc retrieved from backend on init', () => { + it('should show incoming update modal when open local draft is older than backend on init', () => { let openModal: NgbModalRef modalService.activeInstances.subscribe((modals) => (openModal = modals[0])) const modalSpy = jest.spyOn(modalService, 'open') - const openDoc = Object.assign({}, doc) + const openDoc = Object.assign({}, doc, { + __changedFields: ['title'], + }) // simulate a document being modified elsewhere and db updated - doc.modified = new Date() + const remoteDoc = Object.assign({}, doc, { + modified: new Date(new Date(doc.modified).getTime() + 1000).toISOString(), + }) jest .spyOn(activatedRoute, 'paramMap', 'get') .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' }))) - jest.spyOn(documentService, 'get').mockReturnValueOnce(of(doc)) + jest.spyOn(documentService, 'get').mockReturnValueOnce(of(remoteDoc)) jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(openDoc) jest.spyOn(customFieldsService, 'listAll').mockReturnValue( of({ @@ -1123,11 +1434,185 @@ describe('DocumentDetailComponent', () => { }) ) fixture.detectChanges() // calls ngOnInit - expect(modalSpy).toHaveBeenCalledWith(ConfirmDialogComponent) - const closeSpy = jest.spyOn(openModal, 'close') + expect(modalSpy).toHaveBeenCalledWith(ConfirmDialogComponent, { + backdrop: 'static', + }) const confirmDialog = openModal.componentInstance as ConfirmDialogComponent - confirmDialog.confirmClicked.next(confirmDialog) - expect(closeSpy).toHaveBeenCalled() + expect(confirmDialog.messageBold).toContain('Document was updated at') + }) + + it('should react to websocket document updated notifications', () => { + initNormally() + const updateMessage = { + document_id: component.documentId, + modified: '2026-02-17T00:00:00Z', + owner_id: 1, + } + const handleSpy = jest + .spyOn(component as any, 'handleIncomingDocumentUpdated') + .mockImplementation(() => {}) + const websocketStatusService = TestBed.inject(WebsocketStatusService) + + websocketStatusService.handleDocumentUpdated(updateMessage) + + expect(handleSpy).toHaveBeenCalledWith(updateMessage) + }) + + it('should queue incoming update while network is active and flush after', () => { + initNormally() + const loadSpy = jest.spyOn(component as any, 'loadDocument') + const toastSpy = jest.spyOn(toastService, 'showInfo') + + component.networkActive = true + ;(component as any).handleIncomingDocumentUpdated({ + document_id: component.documentId, + modified: '2026-02-17T00:00:00Z', + }) + + expect(loadSpy).not.toHaveBeenCalled() + + component.networkActive = false + ;(component as any).flushPendingIncomingUpdate() + + expect(loadSpy).toHaveBeenCalledWith(component.documentId, true) + expect(toastSpy).toHaveBeenCalledWith( + 'Document reloaded with latest changes.' + ) + }) + + it('should ignore queued incoming update matching local save modified', () => { + initNormally() + const loadSpy = jest.spyOn(component as any, 'loadDocument') + const toastSpy = jest.spyOn(toastService, 'showInfo') + + component.networkActive = true + ;(component as any).lastLocalSaveModified = '2026-02-17T00:00:00+00:00' + ;(component as any).handleIncomingDocumentUpdated({ + document_id: component.documentId, + modified: '2026-02-17T00:00:00+00:00', + }) + + component.networkActive = false + ;(component as any).flushPendingIncomingUpdate() + + expect(loadSpy).not.toHaveBeenCalled() + expect(toastSpy).not.toHaveBeenCalled() + }) + + it('should clear pdf source if preview URL is empty', () => { + component.pdfSource = { url: '/preview', password: 'secret' } as any + component.previewUrl = null + ;(component as any).updatePdfSource() + + expect(component.pdfSource).toEqual({ url: null, password: undefined }) + }) + + it('should close incoming update modal if one is open', () => { + const modalRef = { close: jest.fn() } as unknown as NgbModalRef + ;(component as any).incomingUpdateModal = modalRef + ;(component as any).closeIncomingUpdateModal() + + expect(modalRef.close).toHaveBeenCalled() + expect((component as any).incomingUpdateModal).toBeNull() + }) + + it('should reload remote version when incoming update modal is confirmed', async () => { + let openModal: NgbModalRef + modalService.activeInstances.subscribe((modals) => (openModal = modals[0])) + const reloadSpy = jest + .spyOn(component as any, 'reloadRemoteVersion') + .mockImplementation(() => {}) + + ;(component as any).showIncomingUpdateModal('2026-02-17T00:00:00Z') + + const dialog = openModal.componentInstance as ConfirmDialogComponent + dialog.confirmClicked.next() + await openModal.result + + expect(dialog.buttonsEnabled).toBe(false) + expect(reloadSpy).toHaveBeenCalled() + expect((component as any).incomingUpdateModal).toBeNull() + }) + + it('should overwrite open document state when loading remote version with force', () => { + const openDoc = Object.assign({}, doc, { + title: 'Locally edited title', + __changedFields: ['title'], + }) + const remoteDoc = Object.assign({}, doc, { + title: 'Remote title', + modified: '2026-02-17T00:00:00Z', + }) + jest.spyOn(documentService, 'get').mockReturnValue(of(remoteDoc)) + jest.spyOn(documentService, 'getMetadata').mockReturnValue( + of({ + has_archive_version: false, + original_mime_type: 'application/pdf', + }) + ) + jest.spyOn(documentService, 'getSuggestions').mockReturnValue( + of({ + suggested_tags: [], + suggested_document_types: [], + suggested_correspondents: [], + }) + ) + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(openDoc) + const setDirtySpy = jest.spyOn(openDocumentsService, 'setDirty') + const saveSpy = jest.spyOn(openDocumentsService, 'save') + + ;(component as any).loadDocument(doc.id, true) + + expect(openDoc.title).toEqual('Remote title') + expect(openDoc.__changedFields).toEqual([]) + expect(setDirtySpy).toHaveBeenCalledWith(openDoc, false) + expect(saveSpy).toHaveBeenCalled() + }) + + it('should ignore incoming update for a different document id', () => { + initNormally() + const loadSpy = jest.spyOn(component as any, 'loadDocument') + + ;(component as any).handleIncomingDocumentUpdated({ + document_id: component.documentId + 1, + modified: '2026-02-17T00:00:00Z', + }) + + expect(loadSpy).not.toHaveBeenCalled() + }) + + it('should show incoming update modal when local document has unsaved edits', () => { + initNormally() + jest.spyOn(openDocumentsService, 'isDirty').mockReturnValue(true) + const modalSpy = jest + .spyOn(component as any, 'showIncomingUpdateModal') + .mockImplementation(() => {}) + + ;(component as any).handleIncomingDocumentUpdated({ + document_id: component.documentId, + modified: '2026-02-17T00:00:00Z', + }) + + expect(modalSpy).toHaveBeenCalledWith('2026-02-17T00:00:00Z') + }) + + it('should reload current document and show toast when reloading remote version', () => { + component.documentId = doc.id + const closeModalSpy = jest + .spyOn(component as any, 'closeIncomingUpdateModal') + .mockImplementation(() => {}) + const loadSpy = jest + .spyOn(component as any, 'loadDocument') + .mockImplementation(() => {}) + const notifySpy = jest.spyOn(component.docChangeNotifier, 'next') + const toastSpy = jest.spyOn(toastService, 'showInfo') + + ;(component as any).reloadRemoteVersion() + + expect(closeModalSpy).toHaveBeenCalled() + expect(notifySpy).toHaveBeenCalledWith(doc.id) + expect(loadSpy).toHaveBeenCalledWith(doc.id, true) + expect(toastSpy).toHaveBeenCalledWith('Document reloaded.') }) it('should change preview element by render type', () => { @@ -1159,9 +1644,9 @@ describe('DocumentDetailComponent', () => { expect( fixture.debugElement.query(By.css('.preview-sticky img')) ).not.toBeUndefined() - ;(component.document.mime_type = + ;((component.document.mime_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'), - fixture.detectChanges() + fixture.detectChanges()) expect(component.archiveContentRenderType).toEqual( component.ContentRenderType.Other ) @@ -1176,23 +1661,23 @@ describe('DocumentDetailComponent', () => { const closeSpy = jest.spyOn(openDocumentsService, 'closeDocument') const errorSpy = jest.spyOn(toastService, 'showError') initNormally() + component.selectedVersionId = 10 component.editPdf() expect(modal).not.toBeUndefined() modal.componentInstance.documentID = doc.id + expect(modal.componentInstance.versionID).toBe(10) modal.componentInstance.pages = [{ page: 1, rotate: 0, splitAfter: false }] modal.componentInstance.confirm() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/edit_pdf/` ) expect(req.request.body).toEqual({ - documents: [doc.id], - method: 'edit_pdf', - parameters: { - operations: [{ page: 1, rotate: 0, doc: 0 }], - delete_original: false, - update_document: false, - include_metadata: true, - }, + documents: [10], + operations: [{ page: 1, rotate: 0, doc: 0 }], + delete_original: false, + update_document: false, + include_metadata: true, + source_mode: 'explicit_selection', }) req.error(new ErrorEvent('failed')) expect(errorSpy).toHaveBeenCalled() @@ -1203,12 +1688,93 @@ describe('DocumentDetailComponent', () => { modal.componentInstance.deleteOriginal = true modal.componentInstance.confirm() req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/edit_pdf/` ) req.flush(true) expect(closeSpy).toHaveBeenCalled() }) + it('should support removing password protection from pdfs', () => { + let modal: NgbModalRef + modalService.activeInstances.subscribe((m) => (modal = m[0])) + initNormally() + component.selectedVersionId = 10 + component.password = 'secret' + component.removePassword() + const dialog = + modal.componentInstance as PasswordRemovalConfirmDialogComponent + dialog.updateDocument = false + dialog.includeMetadata = false + dialog.deleteOriginal = true + dialog.confirm() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/remove_password/` + ) + expect(req.request.body).toEqual({ + documents: [10], + password: 'secret', + update_document: false, + include_metadata: false, + delete_original: true, + source_mode: 'explicit_selection', + }) + req.flush(true) + }) + + it('should require the current password before removing it', () => { + initNormally() + const errorSpy = jest.spyOn(toastService, 'showError') + component.requiresPassword = true + component.password = '' + + component.removePassword() + + expect(errorSpy).toHaveBeenCalled() + httpTestingController.expectNone( + `${environment.apiBaseUrl}documents/remove_password/` + ) + }) + + it('should handle failures when removing password protection', () => { + let modal: NgbModalRef + modalService.activeInstances.subscribe((m) => (modal = m[0])) + initNormally() + const errorSpy = jest.spyOn(toastService, 'showError') + component.password = 'secret' + + component.removePassword() + const dialog = + modal.componentInstance as PasswordRemovalConfirmDialogComponent + dialog.confirm() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/remove_password/` + ) + req.error(new ErrorEvent('failed')) + + expect(errorSpy).toHaveBeenCalled() + expect(component.networkActive).toBe(false) + expect(dialog.buttonsEnabled).toBe(true) + }) + + it('should refresh the document when removing password in update mode', () => { + let modal: NgbModalRef + modalService.activeInstances.subscribe((m) => (modal = m[0])) + const refreshSpy = jest.spyOn(openDocumentsService, 'refreshDocument') + initNormally() + component.password = 'secret' + + component.removePassword() + const dialog = + modal.componentInstance as PasswordRemovalConfirmDialogComponent + dialog.confirm() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/remove_password/` + ) + req.flush(true) + + expect(refreshSpy).toHaveBeenCalledWith(doc.id) + }) + it('should support keyboard shortcuts', () => { initNormally() @@ -1257,26 +1823,88 @@ describe('DocumentDetailComponent', () => { expect(closeSpy).toHaveBeenCalled() }) - function initNormally() { - jest - .spyOn(activatedRoute, 'paramMap', 'get') - .mockReturnValue(of(convertToParamMap({ id: 3, section: 'details' }))) + it('selectVersion should update preview and handle preview failures', () => { + const previewSpy = jest.spyOn(documentService, 'getPreviewUrl') + initNormally() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + previewSpy.mockReturnValueOnce('preview-version') + jest.spyOn(documentService, 'getThumbUrl').mockReturnValue('thumb-version') jest .spyOn(documentService, 'get') - .mockReturnValueOnce(of(Object.assign({}, doc))) - jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(null) + .mockReturnValue(of({ content: 'version-content' } as Document)) + + component.selectVersion(10) + httpTestingController.expectOne('preview-version').flush('version text') + + expect(component.previewUrl).toBe('preview-version') + expect(component.thumbUrl).toBe('thumb-version') + expect(component.previewText).toBe('version text') + expect(component.documentForm.get('content').value).toBe('version-content') + const pdfSource = component.pdfSource as { url: string; password?: string } + expect(pdfSource.url).toBe('preview-version') + expect(pdfSource.password).toBeUndefined() + + previewSpy.mockReturnValueOnce('preview-error') + component.selectVersion(11) + httpTestingController + .expectOne('preview-error') + .error(new ErrorEvent('fail')) + + expect(component.previewText).toContain('An error occurred loading content') + }) + + it('selectVersion should show toast if version content retrieval fails', () => { + initNormally() + httpTestingController.expectOne(component.previewUrl).flush('preview') + + jest.spyOn(documentService, 'getPreviewUrl').mockReturnValue('preview-ok') + jest.spyOn(documentService, 'getThumbUrl').mockReturnValue('thumb-ok') jest - .spyOn(openDocumentsService, 'openDocument') - .mockReturnValueOnce(of(true)) - jest.spyOn(customFieldsService, 'listAll').mockReturnValue( - of({ - count: customFields.length, - all: customFields.map((f) => f.id), - results: customFields, - }) + .spyOn(documentService, 'getMetadata') + .mockReturnValue(of({ has_archive_version: true } as any)) + const contentError = new Error('content failed') + jest + .spyOn(documentService, 'get') + .mockReturnValue(throwError(() => contentError)) + const toastSpy = jest.spyOn(toastService, 'showError') + + component.selectVersion(10) + httpTestingController.expectOne('preview-ok').flush('preview text') + + expect(toastSpy).toHaveBeenCalledWith( + 'Error retrieving version content', + contentError ) - fixture.detectChanges() - } + }) + + it('onVersionSelected should delegate to selectVersion', () => { + const selectVersionSpy = jest + .spyOn(component, 'selectVersion') + .mockImplementation(() => {}) + + component.onVersionSelected(42) + + expect(selectVersionSpy).toHaveBeenCalledWith(42) + }) + + it('onVersionsUpdated should sync open document versions and save', () => { + component.documentId = doc.id + component.document = { ...doc, versions: [] } as Document + const updatedVersions = [ + { id: doc.id, is_root: true }, + { id: 10, is_root: false }, + ] as any + const openDoc = { ...doc, versions: [] } as Document + jest.spyOn(openDocumentsService, 'getOpenDocument').mockReturnValue(openDoc) + const saveSpy = jest.spyOn(openDocumentsService, 'save') + + component.onVersionsUpdated(updatedVersions) + + expect(component.document.versions).toEqual(updatedVersions) + expect(openDoc.versions).toEqual(updatedVersions) + expect(saveSpy).toHaveBeenCalled() + }) it('createDisabled should return true if the user does not have permission to add the specified data type', () => { currentUserCan = false @@ -1294,6 +1922,14 @@ describe('DocumentDetailComponent', () => { expect(component.createDisabled(DataType.Tag)).toBeFalsy() }) + it('should expose add permission via userCanAdd getter', () => { + currentUserCan = true + expect(component.userCanAdd).toBeTruthy() + + currentUserCan = false + expect(component.userCanAdd).toBeFalsy() + }) + it('should call tryRenderTiff when no archive and file is tiff', () => { initNormally() const tiffRenderSpy = jest.spyOn( @@ -1370,6 +2006,88 @@ describe('DocumentDetailComponent', () => { expect(urlRevokeSpy).toHaveBeenCalled() }) + it('should include version in download and print only for non-latest selected version', () => { + initNormally() + component.document.versions = [ + { id: doc.id, is_root: true }, + { id: 10, is_root: false }, + ] as any + + const getDownloadUrlSpy = jest + .spyOn(documentService, 'getDownloadUrl') + .mockReturnValueOnce('download-latest') + .mockReturnValueOnce('print-latest') + .mockReturnValueOnce('download-non-latest') + .mockReturnValueOnce('print-non-latest') + + component.selectedVersionId = 10 + component.download() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith( + 1, + doc.id, + false, + null, + false + ) + httpTestingController + .expectOne('download-latest') + .error(new ProgressEvent('failed')) + + component.printDocument() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith(2, doc.id, false, null) + httpTestingController + .expectOne('print-latest') + .error(new ProgressEvent('failed')) + + component.selectedVersionId = doc.id + component.download() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith( + 3, + doc.id, + false, + doc.id, + false + ) + httpTestingController + .expectOne('download-non-latest') + .error(new ProgressEvent('failed')) + + component.printDocument() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith(4, doc.id, false, doc.id) + httpTestingController + .expectOne('print-non-latest') + .error(new ProgressEvent('failed')) + }) + + it('should omit version in download and print when no version is selected', () => { + initNormally() + component.document.versions = [] as any + ;(component as any).selectedVersionId = undefined + + const getDownloadUrlSpy = jest + .spyOn(documentService, 'getDownloadUrl') + .mockReturnValueOnce('download-no-version') + .mockReturnValueOnce('print-no-version') + + component.download() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith( + 1, + doc.id, + false, + null, + false + ) + httpTestingController + .expectOne('download-no-version') + .error(new ProgressEvent('failed')) + + component.printDocument() + expect(getDownloadUrlSpy).toHaveBeenNthCalledWith(2, doc.id, false, null) + httpTestingController + .expectOne('print-no-version') + .error(new ProgressEvent('failed')) + }) + it('should download a file with the correct filename', () => { const mockBlob = new Blob(['test content'], { type: 'text/plain' }) const mockResponse = new HttpResponse({ diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 9c0c845929..25c854e537 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -8,17 +8,17 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms' -import { ActivatedRoute, Router } from '@angular/router' +import { ActivatedRoute, Router, RouterModule } from '@angular/router' import { NgbDateStruct, NgbDropdownModule, NgbModal, + NgbModalRef, NgbNav, NgbNavChangeEvent, NgbNavModule, } from '@ng-bootstrap/ng-bootstrap' import { dirtyCheck, DirtyComponent } from '@ngneat/dirty-check-forms' -import { PDFDocumentProxy, PdfViewerModule } from 'ng2-pdf-viewer' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { DeviceDetectorService } from 'ngx-device-detector' import { BehaviorSubject, Observable, of, Subject, timer } from 'rxjs' @@ -31,12 +31,13 @@ import { map, switchMap, takeUntil, + tap, } from 'rxjs/operators' import { Correspondent } from 'src/app/data/correspondent' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' import { CustomFieldInstance } from 'src/app/data/custom-field-instance' import { DataType } from 'src/app/data/datatype' -import { Document } from 'src/app/data/document' +import { Document, DocumentVersionInfo } from 'src/app/data/document' import { DocumentMetadata } from 'src/app/data/document-metadata' import { DocumentNote } from 'src/app/data/document-note' import { DocumentSuggestions } from 'src/app/data/document-suggestions' @@ -73,21 +74,29 @@ import { import { CorrespondentService } from 'src/app/services/rest/correspondent.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' -import { DocumentService } from 'src/app/services/rest/document.service' +import { + BulkEditSourceMode, + DocumentService, +} from 'src/app/services/rest/document.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' +import { TagService } from 'src/app/services/rest/tag.service' import { UserService } from 'src/app/services/rest/user.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' +import { WebsocketStatusService } from 'src/app/services/websocket-status.service' import { getFilenameFromContentDisposition } from 'src/app/utils/http' import { ISODateAdapter } from 'src/app/utils/ngb-iso-date-adapter' import * as UTIF from 'utif' +import { DocumentDetailFieldID } from '../admin/settings/settings.component' import { ConfirmDialogComponent } from '../common/confirm-dialog/confirm-dialog.component' +import { PasswordRemovalConfirmDialogComponent } from '../common/confirm-dialog/password-removal-confirm-dialog/password-removal-confirm-dialog.component' import { CustomFieldsDropdownComponent } from '../common/custom-fields-dropdown/custom-fields-dropdown.component' import { CorrespondentEditDialogComponent } from '../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' import { DocumentTypeEditDialogComponent } from '../common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component' import { EditDialogMode } from '../common/edit-dialog/edit-dialog.component' import { StoragePathEditDialogComponent } from '../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component' +import { TagEditDialogComponent } from '../common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component' import { EmailDocumentDialogComponent } from '../common/email-document-dialog/email-document-dialog.component' import { CheckComponent } from '../common/input/check/check.component' import { DateComponent } from '../common/input/date/date.component' @@ -101,14 +110,22 @@ import { TextComponent } from '../common/input/text/text.component' import { TextAreaComponent } from '../common/input/textarea/textarea.component' import { UrlComponent } from '../common/input/url/url.component' import { PageHeaderComponent } from '../common/page-header/page-header.component' +import { PdfEditorEditMode } from '../common/pdf-editor/pdf-editor-edit-mode' +import { PDFEditorComponent } from '../common/pdf-editor/pdf-editor.component' +import { PngxPdfViewerComponent } from '../common/pdf-viewer/pdf-viewer.component' import { - PDFEditorComponent, - PdfEditorEditMode, -} from '../common/pdf-editor/pdf-editor.component' + PdfRenderMode, + PdfSource, + PdfZoomLevel, + PdfZoomScale, + PngxPdfDocumentProxy, +} from '../common/pdf-viewer/pdf-viewer.types' import { ShareLinksDialogComponent } from '../common/share-links-dialog/share-links-dialog.component' -import { DocumentHistoryComponent } from '../document-history/document-history.component' +import { SuggestionsDropdownComponent } from '../common/suggestions-dropdown/suggestions-dropdown.component' import { DocumentNotesComponent } from '../document-notes/document-notes.component' import { ComponentWithPermissions } from '../with-permissions/with-permissions.component' +import { DocumentHistoryComponent } from './document-history/document-history.component' +import { DocumentVersionDropdownComponent } from './document-version-dropdown/document-version-dropdown.component' import { MetadataCollapseComponent } from './metadata-collapse/metadata-collapse.component' enum DocumentDetailNavIDs { @@ -119,6 +136,7 @@ enum DocumentDetailNavIDs { Notes = 5, Permissions = 6, History = 7, + Duplicates = 8, } enum ContentRenderType { @@ -130,16 +148,9 @@ enum ContentRenderType { TIFF = 'tiff', } -export enum ZoomSetting { - PageFit = 'page-fit', - PageWidth = 'page-width', - Quarter = '.25', - Half = '.5', - ThreeQuarters = '.75', - One = '1', - OneAndHalf = '1.5', - Two = '2', - Three = '3', +interface IncomingDocumentUpdate { + document_id: number + modified: string } @Component({ @@ -162,6 +173,7 @@ export enum ZoomSetting { NumberComponent, MonetaryComponent, UrlComponent, + SuggestionsDropdownComponent, CustomDatePipe, FileSizePipe, IfPermissionsDirective, @@ -173,16 +185,21 @@ export enum ZoomSetting { NgbNavModule, NgbDropdownModule, NgxBootstrapIconsModule, - PdfViewerModule, TextAreaComponent, + RouterModule, + PngxPdfViewerComponent, + DocumentVersionDropdownComponent, ], }) export class DocumentDetailComponent extends ComponentWithPermissions implements OnInit, OnDestroy, DirtyComponent { - private documentsService = inject(DocumentService) + PdfRenderMode = PdfRenderMode + + documentsService = inject(DocumentService) private route = inject(ActivatedRoute) + private tagService = inject(TagService) private correspondentService = inject(CorrespondentService) private documentTypeService = inject(DocumentTypeService) private router = inject(Router) @@ -201,10 +218,13 @@ export class DocumentDetailComponent private componentRouterService = inject(ComponentRouterService) private deviceDetectorService = inject(DeviceDetectorService) private savedViewService = inject(SavedViewService) + private readonly websocketStatusService = inject(WebsocketStatusService) @ViewChild('inputTitle') titleInput: TextComponent + @ViewChild('tagsInput') tagsInput: TagsComponent + expandOriginalMetadata = false expandArchivedMetadata = false @@ -216,17 +236,22 @@ export class DocumentDetailComponent document: Document metadata: DocumentMetadata suggestions: DocumentSuggestions + suggestionsLoading: boolean = false users: User[] title: string titleSubject: Subject = new Subject() previewUrl: string + pdfSource?: PdfSource thumbUrl: string previewText: string previewLoaded: boolean = false tiffURL: string tiffError: string + // Versioning + selectedVersionId: number + correspondents: Correspondent[] documentTypes: DocumentType[] storagePaths: StoragePath[] @@ -246,13 +271,16 @@ export class DocumentDetailComponent previewCurrentPage: number = 1 previewNumPages: number - previewZoomSetting: ZoomSetting = ZoomSetting.One - previewZoomScale: ZoomSetting = ZoomSetting.PageWidth + previewZoomSetting: PdfZoomLevel = PdfZoomLevel.One + previewZoomScale: PdfZoomScale = PdfZoomScale.PageWidth store: BehaviorSubject isDirty$: Observable unsubscribeNotifier: Subject = new Subject() docChangeNotifier: Subject = new Subject() + private incomingUpdateModal: NgbModalRef + private pendingIncomingUpdate: IncomingDocumentUpdate + private lastLocalSaveModified: string | null = null requiresPassword: boolean = false password: string @@ -262,6 +290,7 @@ export class DocumentDetailComponent customFields: CustomField[] public downloading: boolean = false + public useFormattedFilename: boolean = false public readonly CustomFieldDataType = CustomFieldDataType @@ -269,16 +298,18 @@ export class DocumentDetailComponent public readonly DataType = DataType + public readonly DocumentDetailFieldID = DocumentDetailFieldID + @ViewChild('nav') nav: NgbNav @ViewChild('pdfPreview') set pdfPreview(element) { // this gets called when component added or removed from DOM if ( element && element.nativeElement.offsetParent !== null && - this.nav?.activeId == 4 + this.nav?.activeId == DocumentDetailNavIDs.Preview ) { // its visible - setTimeout(() => this.nav?.select(1)) + setTimeout(() => this.nav?.select(DocumentDetailNavIDs.Details)) } } @@ -297,20 +328,36 @@ export class DocumentDetailComponent return this.deviceDetectorService.isMobile() } + get aiEnabled(): boolean { + return this.settings.get(SETTINGS_KEYS.AI_ENABLED) + } + get archiveContentRenderType(): ContentRenderType { - return this.document?.archived_file_name + const hasArchiveVersion = + this.metadata?.has_archive_version ?? !!this.document?.archived_file_name + return hasArchiveVersion ? this.getRenderType('application/pdf') - : this.getRenderType(this.document?.mime_type) + : this.getRenderType( + this.metadata?.original_mime_type || this.document?.mime_type + ) } get originalContentRenderType(): ContentRenderType { - return this.getRenderType(this.document?.mime_type) + return this.getRenderType( + this.metadata?.original_mime_type || this.document?.mime_type + ) } get showThumbnailOverlay(): boolean { return this.settings.get(SETTINGS_KEYS.DOCUMENT_EDITING_OVERLAY_THUMBNAIL) } + isFieldHidden(fieldId: DocumentDetailFieldID): boolean { + return this.settings + .get(SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS) + .includes(fieldId) + } + private getRenderType(mimeType: string): ContentRenderType { if (!mimeType) return ContentRenderType.Unknown if (mimeType === 'application/pdf') { @@ -327,6 +374,47 @@ export class DocumentDetailComponent return ContentRenderType.Other } + private updatePdfSource() { + this.pdfSource = { + url: this.previewUrl, + password: this.password, + } + } + + private loadMetadataForSelectedVersion() { + const selectedVersionId = this.getSelectedNonLatestVersionId() + this.documentsService + .getMetadata(this.documentId, selectedVersionId) + .pipe( + first(), + takeUntil(this.unsubscribeNotifier), + takeUntil(this.docChangeNotifier) + ) + .subscribe({ + next: (result) => { + this.metadata = result + this.tiffURL = null + this.tiffError = null + if (this.archiveContentRenderType === ContentRenderType.TIFF) { + this.tryRenderTiff() + } + if ( + this.archiveContentRenderType !== ContentRenderType.PDF || + this.useNativePdfViewer + ) { + this.previewLoaded = true + } + }, + error: (error) => { + this.metadata = {} // allow display to fallback to tag + this.toastService.showError( + $localize`Error retrieving metadata`, + error + ) + }, + }) + } + get isRTL() { if (!this.metadata || !this.metadata.lang) return false else { @@ -401,8 +489,16 @@ export class DocumentDetailComponent ) } - private loadDocument(documentId: number): void { - this.previewUrl = this.documentsService.getPreviewUrl(documentId) + private loadDocument(documentId: number, forceRemote: boolean = false): void { + let redirectedToRoot = false + this.closeIncomingUpdateModal() + this.pendingIncomingUpdate = null + this.selectedVersionId = documentId + this.lastLocalSaveModified = null + this.previewUrl = this.documentsService.getPreviewUrl( + this.selectedVersionId + ) + this.updatePdfSource() this.http .get(this.previewUrl, { responseType: 'text' }) .pipe( @@ -417,11 +513,29 @@ export class DocumentDetailComponent err.message ?? err.toString() }`), }) - this.thumbUrl = this.documentsService.getThumbUrl(documentId) + this.thumbUrl = this.documentsService.getThumbUrl(this.selectedVersionId) this.documentsService .get(documentId) .pipe( - catchError(() => { + catchError((error) => { + if (error?.status === 404) { + // if not found, check if there's root document that exists and redirect if so + return this.documentsService.getRootId(documentId).pipe( + map((result) => { + const rootId = result?.root_id + if (rootId && rootId !== documentId) { + const section = + this.route.snapshot.paramMap.get('section') || 'details' + redirectedToRoot = true + this.router.navigate(['documents', rootId, section], { + replaceUrl: true, + }) + } + return null + }), + catchError(() => of(null)) + ) + } // 404 is handled in the subscribe below return of(null) }), @@ -432,6 +546,9 @@ export class DocumentDetailComponent .subscribe({ next: (doc) => { if (!doc) { + if (redirectedToRoot) { + return + } this.router.navigate(['404'], { replaceUrl: true }) return } @@ -440,21 +557,30 @@ export class DocumentDetailComponent const openDocument = this.openDocumentService.getOpenDocument( this.documentId ) - const useDoc = openDocument || doc - if (openDocument) { - if ( - new Date(doc.modified) > new Date(openDocument.modified) && - !this.modalService.hasOpenModals() - ) { - const modal = this.modalService.open(ConfirmDialogComponent) - modal.componentInstance.title = $localize`Document changes detected` - modal.componentInstance.messageBold = $localize`The version of this document in your browser session appears older than the existing version.` - modal.componentInstance.message = $localize`Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document.` - modal.componentInstance.cancelBtnClass = 'visually-hidden' - modal.componentInstance.btnCaption = $localize`Ok` - modal.componentInstance.confirmClicked.subscribe(() => - modal.close() - ) + // update duplicate documents if present + if (openDocument && doc?.duplicate_documents) { + openDocument.duplicate_documents = doc.duplicate_documents + this.openDocumentService.save() + } + let useDoc = openDocument || doc + if (openDocument && forceRemote) { + Object.assign(openDocument, doc) + openDocument.__changedFields = [] + this.openDocumentService.setDirty(openDocument, false) + this.openDocumentService.save() + useDoc = openDocument + } else if (openDocument) { + if (new Date(doc.modified) > new Date(openDocument.modified)) { + if (this.hasLocalEdits(openDocument)) { + this.showIncomingUpdateModal(doc.modified) + } else { + // No local edits to preserve, so keep the tab in sync automatically. + Object.assign(openDocument, doc) + openDocument.__changedFields = [] + this.openDocumentService.setDirty(openDocument, false) + this.openDocumentService.save() + useDoc = openDocument + } } } else { this.openDocumentService @@ -485,8 +611,102 @@ export class DocumentDetailComponent }) } + private hasLocalEdits(doc: Document): boolean { + return ( + this.openDocumentService.isDirty(doc) || !!doc.__changedFields?.length + ) + } + + private showIncomingUpdateModal(modified: string): void { + if (this.incomingUpdateModal) return + + const modal = this.modalService.open(ConfirmDialogComponent, { + backdrop: 'static', + }) + this.incomingUpdateModal = modal + + let formattedModified = null + const parsed = new Date(modified) + formattedModified = parsed.toLocaleString() + + modal.componentInstance.title = $localize`Document was updated` + modal.componentInstance.messageBold = $localize`Document was updated at ${formattedModified}.` + modal.componentInstance.message = $localize`Reload to discard your local unsaved edits and load the latest remote version.` + modal.componentInstance.btnClass = 'btn-warning' + modal.componentInstance.btnCaption = $localize`Reload` + modal.componentInstance.cancelBtnCaption = $localize`Dismiss` + + modal.componentInstance.confirmClicked.pipe(first()).subscribe(() => { + modal.componentInstance.buttonsEnabled = false + modal.close() + this.reloadRemoteVersion() + }) + modal.result.finally(() => { + this.incomingUpdateModal = null + }) + } + + private closeIncomingUpdateModal() { + if (!this.incomingUpdateModal) return + this.incomingUpdateModal.close() + this.incomingUpdateModal = null + } + + private flushPendingIncomingUpdate() { + if (!this.pendingIncomingUpdate || this.networkActive) return + const pendingUpdate = this.pendingIncomingUpdate + this.pendingIncomingUpdate = null + this.handleIncomingDocumentUpdated(pendingUpdate) + } + + private handleIncomingDocumentUpdated(data: IncomingDocumentUpdate): void { + if ( + !this.documentId || + !this.document || + data.document_id !== this.documentId + ) + return + if (this.networkActive) { + this.pendingIncomingUpdate = data + return + } + // If modified timestamp of the incoming update is the same as the last local save, + // we assume this update is from our own save and dont notify + const incomingModified = data.modified + if ( + incomingModified && + this.lastLocalSaveModified && + incomingModified === this.lastLocalSaveModified + ) { + this.lastLocalSaveModified = null + return + } + this.lastLocalSaveModified = null + + if (this.openDocumentService.isDirty(this.document)) { + this.showIncomingUpdateModal(data.modified) + } else { + this.docChangeNotifier.next(this.documentId) + this.loadDocument(this.documentId, true) + this.toastService.showInfo( + $localize`Document reloaded with latest changes.` + ) + } + } + + private reloadRemoteVersion() { + if (!this.documentId) return + + this.closeIncomingUpdateModal() + this.docChangeNotifier.next(this.documentId) + this.loadDocument(this.documentId, true) + this.toastService.showInfo($localize`Document reloaded.`) + } + ngOnInit(): void { - this.setZoom(this.settings.get(SETTINGS_KEYS.PDF_VIEWER_ZOOM_SETTING)) + this.setZoom( + this.settings.get(SETTINGS_KEYS.PDF_VIEWER_ZOOM_SETTING) as PdfZoomScale + ) this.documentForm.valueChanges .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe((values) => { @@ -541,6 +761,11 @@ export class DocumentDetailComponent this.getCustomFields() + this.websocketStatusService + .onDocumentUpdated() + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe((data) => this.handleIncomingDocumentUpdated(data)) + this.route.paramMap .pipe( filter( @@ -641,74 +866,176 @@ export class DocumentDetailComponent updateComponent(doc: Document) { this.document = doc + // Default selected version is the newest version + const versions = doc.versions ?? [] + this.selectedVersionId = versions.length + ? Math.max(...versions.map((version) => version.id)) + : doc.id + this.previewLoaded = false this.requiresPassword = false this.updateFormForCustomFields() - if (this.archiveContentRenderType === ContentRenderType.TIFF) { - this.tryRenderTiff() + this.loadMetadataForSelectedVersion() + if ( + this.permissionsService.currentUserHasObjectPermissions( + PermissionAction.Change, + doc + ) && + this.permissionsService.currentUserCan( + PermissionAction.Change, + PermissionType.Document + ) + ) { + this.tagService.getCachedMany(doc.tags).subscribe((tags) => { + // only show suggestions if document has inbox tags + if (tags.some((tag) => tag.is_inbox_tag)) { + this.getSuggestions() + } + }) } + this.title = this.documentTitlePipe.transform(doc.title) + this.prepareForm(doc) + + if ( + this.activeNavID === DocumentDetailNavIDs.Duplicates && + !doc?.duplicate_documents?.length + ) { + this.activeNavID = DocumentDetailNavIDs.Details + } + } + + // Update file preview and download target to a specific version (by document id) + selectVersion(versionId: number) { + this.selectedVersionId = versionId + this.previewLoaded = false + this.previewUrl = this.documentsService.getPreviewUrl( + this.documentId, + false, + this.selectedVersionId + ) + this.updatePdfSource() + this.thumbUrl = this.documentsService.getThumbUrl( + this.documentId, + this.selectedVersionId + ) + this.loadMetadataForSelectedVersion() this.documentsService - .getMetadata(doc.id) + .get(this.documentId, this.selectedVersionId, 'content') .pipe( first(), takeUntil(this.unsubscribeNotifier), takeUntil(this.docChangeNotifier) ) .subscribe({ - next: (result) => { - this.metadata = result - if ( - this.archiveContentRenderType !== ContentRenderType.PDF || - this.useNativePdfViewer - ) { - this.previewLoaded = true - } + next: (doc) => { + const content = doc?.content ?? '' + this.document.content = content + this.documentForm.patchValue( + { + content, + }, + { + emitEvent: false, + } + ) }, error: (error) => { - this.metadata = {} // allow display to fallback to tag this.toastService.showError( - $localize`Error retrieving metadata`, + $localize`Error retrieving version content`, error ) }, }) - if ( - this.permissionsService.currentUserHasObjectPermissions( - PermissionAction.Change, - doc - ) && - this.permissionsService.currentUserCan( - PermissionAction.Change, - PermissionType.Document + // For text previews, refresh content + this.http + .get(this.previewUrl, { responseType: 'text' }) + .pipe( + first(), + takeUntil(this.unsubscribeNotifier), + takeUntil(this.docChangeNotifier) ) - ) { - this.documentsService - .getSuggestions(doc.id) - .pipe( - first(), - takeUntil(this.unsubscribeNotifier), - takeUntil(this.docChangeNotifier) - ) - .subscribe({ - next: (result) => { - this.suggestions = result - }, - error: (error) => { - this.suggestions = null - this.toastService.showError( - $localize`Error retrieving suggestions.`, - error - ) - }, - }) + .subscribe({ + next: (res) => (this.previewText = res.toString()), + error: (err) => + (this.previewText = $localize`An error occurred loading content: ${ + err.message ?? err.toString() + }`), + }) + } + + onVersionSelected(versionId: number) { + this.selectVersion(versionId) + } + + onVersionsUpdated(versions: DocumentVersionInfo[]) { + this.document.versions = versions + const openDoc = this.openDocumentService.getOpenDocument(this.documentId) + if (openDoc) { + openDoc.versions = versions + this.openDocumentService.save() } - this.title = this.documentTitlePipe.transform(doc.title) - this.prepareForm(doc) } get customFieldFormFields(): FormArray { return this.documentForm.get('custom_fields') as FormArray } + getSuggestions() { + this.suggestionsLoading = true + this.documentsService + .getSuggestions(this.documentId) + .pipe( + first(), + takeUntil(this.unsubscribeNotifier), + takeUntil(this.docChangeNotifier) + ) + .subscribe({ + next: (result) => { + this.suggestions = result + this.suggestionsLoading = false + }, + error: (error) => { + this.suggestions = null + this.suggestionsLoading = false + this.toastService.showError( + $localize`Error retrieving suggestions.`, + error + ) + }, + }) + } + + createTag(newName: string) { + var modal = this.modalService.open(TagEditDialogComponent, { + backdrop: 'static', + }) + modal.componentInstance.dialogMode = EditDialogMode.CREATE + if (newName) modal.componentInstance.object = { name: newName } + modal.componentInstance.succeeded + .pipe( + tap((newTag: Tag) => { + // remove from suggestions if present + if (this.suggestions) { + this.suggestions = { + ...this.suggestions, + suggested_tags: this.suggestions.suggested_tags.filter( + (tag) => tag !== newTag.name + ), + } + } + }), + switchMap((newTag: Tag) => { + return this.tagService + .listAll() + .pipe(map((tags) => ({ newTag, tags }))) + }), + takeUntil(this.unsubscribeNotifier) + ) + .subscribe(({ newTag, tags }) => { + this.tagsInput.tags = tags.results + this.tagsInput.addTag(newTag.id) + }) + } + createDocumentType(newName: string) { var modal = this.modalService.open(DocumentTypeEditDialogComponent, { backdrop: 'static', @@ -728,6 +1055,12 @@ export class DocumentDetailComponent this.documentTypes = documentTypes.results this.documentForm.get('document_type').setValue(newDocumentType.id) this.documentForm.get('document_type').markAsDirty() + if (this.suggestions) { + this.suggestions.suggested_document_types = + this.suggestions.suggested_document_types.filter( + (dt) => dt !== newName + ) + } }) } @@ -752,6 +1085,12 @@ export class DocumentDetailComponent this.correspondents = correspondents.results this.documentForm.get('correspondent').setValue(newCorrespondent.id) this.documentForm.get('correspondent').markAsDirty() + if (this.suggestions) { + this.suggestions.suggested_correspondents = + this.suggestions.suggested_correspondents.filter( + (c) => c !== newName + ) + } }) } @@ -804,7 +1143,7 @@ export class DocumentDetailComponent discard() { this.documentsService - .get(this.documentId) + .get(this.documentId, this.selectedVersionId) .pipe( first(), takeUntil(this.unsubscribeNotifier), @@ -812,6 +1151,7 @@ export class DocumentDetailComponent ) .subscribe({ next: (doc) => { + this.closeIncomingUpdateModal() Object.assign(this.document, doc) doc['permissions_form'] = { owner: doc.owner, @@ -854,10 +1194,12 @@ export class DocumentDetailComponent this.networkActive = true ;(document.activeElement as HTMLElement)?.dispatchEvent(new Event('change')) this.documentsService - .patch(this.getChangedFields()) + .patch(this.getChangedFields(), this.selectedVersionId) .pipe(first()) .subscribe({ next: (docValues) => { + this.closeIncomingUpdateModal() + this.lastLocalSaveModified = docValues.modified ?? null // in case data changed while saving eg removing inbox_tags this.documentForm.patchValue(docValues) const newValues = Object.assign({}, this.documentForm.value) @@ -872,16 +1214,19 @@ export class DocumentDetailComponent this.networkActive = false this.error = null if (close) { + this.pendingIncomingUpdate = null this.close(() => this.openDocumentService.refreshDocument(this.documentId) ) } else { this.openDocumentService.refreshDocument(this.documentId) + this.flushPendingIncomingUpdate() } this.savedViewService.maybeRefreshDocumentCounts() }, error: (error) => { this.networkActive = false + this.lastLocalSaveModified = null const canEdit = this.permissionsService.currentUserHasObjectPermissions( PermissionAction.Change, @@ -901,6 +1246,7 @@ export class DocumentDetailComponent error ) } + this.flushPendingIncomingUpdate() }, }) } @@ -909,7 +1255,7 @@ export class DocumentDetailComponent this.networkActive = true this.store.next(this.documentForm.value) this.documentsService - .patch(this.getChangedFields()) + .patch(this.getChangedFields(), this.selectedVersionId) .pipe( switchMap((updateResult) => { this.savedViewService.maybeRefreshDocumentCounts() @@ -937,8 +1283,11 @@ export class DocumentDetailComponent .pipe(first()) .subscribe({ next: ({ updateResult, nextDocId, closeResult }) => { + this.closeIncomingUpdateModal() this.error = null this.networkActive = false + this.pendingIncomingUpdate = null + this.lastLocalSaveModified = null if (closeResult && updateResult && nextDocId) { this.router.navigate(['documents', nextDocId]) this.titleInput?.focus() @@ -946,8 +1295,10 @@ export class DocumentDetailComponent }, error: (error) => { this.networkActive = false + this.lastLocalSaveModified = null this.error = error.error this.toastService.showError($localize`Error saving document`, error) + this.flushPendingIncomingUpdate() }, }) } @@ -1028,35 +1379,47 @@ export class DocumentDetailComponent modal.componentInstance.btnCaption = $localize`Proceed` modal.componentInstance.confirmClicked.subscribe(() => { modal.componentInstance.buttonsEnabled = false - this.documentsService - .bulkEdit([this.document.id], 'reprocess', {}) - .subscribe({ - next: () => { - this.toastService.showInfo( - $localize`Reprocess operation for "${this.document.title}" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content.` - ) - if (modal) { - modal.close() - } - }, - error: (error) => { - if (modal) { - modal.componentInstance.buttonsEnabled = true - } - this.toastService.showError( - $localize`Error executing operation`, - error - ) - }, - }) + this.documentsService.reprocessDocuments([this.document.id]).subscribe({ + next: () => { + this.toastService.showInfo( + $localize`Reprocess operation for "${this.document.title}" will begin in the background.` + ) + if (modal) { + modal.close() + } + }, + error: (error) => { + if (modal) { + modal.componentInstance.buttonsEnabled = true + } + this.toastService.showError( + $localize`Error executing operation`, + error + ) + }, + }) }) } + private getSelectedNonLatestVersionId(): number | null { + const versions = this.document?.versions ?? [] + if (!versions.length || !this.selectedVersionId) { + return null + } + const latestVersionId = Math.max(...versions.map((version) => version.id)) + return this.selectedVersionId === latestVersionId + ? null + : this.selectedVersionId + } + download(original: boolean = false) { this.downloading = true + const selectedVersionId = this.getSelectedNonLatestVersionId() const downloadUrl = this.documentsService.getDownloadUrl( this.documentId, - original + original, + selectedVersionId, + this.useFormattedFilename ) this.http .get(downloadUrl, { observe: 'response', responseType: 'blob' }) @@ -1124,7 +1487,7 @@ export class DocumentDetailComponent }) } - pdfPreviewLoaded(pdf: PDFDocumentProxy) { + pdfPreviewLoaded(pdf: PngxPdfDocumentProxy) { this.previewNumPages = pdf.numPages if (this.password) this.requiresPassword = false setTimeout(() => { @@ -1142,34 +1505,37 @@ export class DocumentDetailComponent onPasswordKeyUp(event: KeyboardEvent) { if ('Enter' == event.key) { this.password = (event.target as HTMLInputElement).value + this.updatePdfSource() } } - setZoom(setting: ZoomSetting) { - if (ZoomSetting.PageFit === setting || ZoomSetting.PageWidth === setting) { + setZoom(setting: PdfZoomScale | PdfZoomLevel) { + if ( + setting === PdfZoomScale.PageFit || + setting === PdfZoomScale.PageWidth + ) { this.previewZoomScale = setting - this.previewZoomSetting = ZoomSetting.One - } else { - this.previewZoomSetting = setting - this.previewZoomScale = ZoomSetting.PageWidth + this.previewZoomSetting = PdfZoomLevel.One + return } + this.previewZoomSetting = setting + this.previewZoomScale = PdfZoomScale.PageWidth } get zoomSettings() { - return Object.values(ZoomSetting).filter( - (setting) => setting !== ZoomSetting.PageWidth - ) + return [PdfZoomScale.PageFit, ...Object.values(PdfZoomLevel)] } get currentZoom() { - if (this.previewZoomScale === ZoomSetting.PageFit) { - return ZoomSetting.PageFit - } else return this.previewZoomSetting + if (this.previewZoomScale === PdfZoomScale.PageFit) { + return PdfZoomScale.PageFit + } + return this.previewZoomSetting } - getZoomSettingTitle(setting: ZoomSetting): string { + getZoomSettingTitle(setting: PdfZoomScale | PdfZoomLevel): string { switch (setting) { - case ZoomSetting.PageFit: + case PdfZoomScale.PageFit: return $localize`Page Fit` default: return `${parseFloat(setting) * 100}%` @@ -1177,25 +1543,24 @@ export class DocumentDetailComponent } increaseZoom(): void { - let currentIndex = Object.values(ZoomSetting).indexOf( - this.previewZoomSetting - ) - if (this.previewZoomScale === ZoomSetting.PageFit) currentIndex = 5 - this.previewZoomScale = ZoomSetting.PageWidth + const zoomLevels = Object.values(PdfZoomLevel) + let currentIndex = zoomLevels.indexOf(this.previewZoomSetting) + if (this.previewZoomScale === PdfZoomScale.PageFit) { + currentIndex = zoomLevels.indexOf(PdfZoomLevel.One) + } + this.previewZoomScale = PdfZoomScale.PageWidth this.previewZoomSetting = - Object.values(ZoomSetting)[ - Math.min(Object.values(ZoomSetting).length - 1, currentIndex + 1) - ] + zoomLevels[Math.min(zoomLevels.length - 1, currentIndex + 1)] } decreaseZoom(): void { - let currentIndex = Object.values(ZoomSetting).indexOf( - this.previewZoomSetting - ) - if (this.previewZoomScale === ZoomSetting.PageFit) currentIndex = 4 - this.previewZoomScale = ZoomSetting.PageWidth - this.previewZoomSetting = - Object.values(ZoomSetting)[Math.max(2, currentIndex - 1)] + const zoomLevels = Object.values(PdfZoomLevel) + let currentIndex = zoomLevels.indexOf(this.previewZoomSetting) + if (this.previewZoomScale === PdfZoomScale.PageFit) { + currentIndex = zoomLevels.indexOf(PdfZoomLevel.ThreeQuarters) + } + this.previewZoomScale = PdfZoomScale.PageWidth + this.previewZoomSetting = zoomLevels[Math.max(0, currentIndex - 1)] } get showPermissions(): boolean { @@ -1389,20 +1754,23 @@ export class DocumentDetailComponent size: 'xl', scrollable: true, }) + const sourceDocumentId = this.selectedVersionId ?? this.document.id modal.componentInstance.title = $localize`PDF Editor` modal.componentInstance.btnCaption = $localize`Proceed` modal.componentInstance.documentID = this.document.id + modal.componentInstance.versionID = sourceDocumentId modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { modal.componentInstance.buttonsEnabled = false this.documentsService - .bulkEdit([this.document.id], 'edit_pdf', { + .editPdfDocuments([sourceDocumentId], { operations: modal.componentInstance.getOperations(), delete_original: modal.componentInstance.deleteOriginal, update_document: modal.componentInstance.editMode == PdfEditorEditMode.Update, include_metadata: modal.componentInstance.includeMetadata, + source_mode: BulkEditSourceMode.EXPLICIT_SELECTION, }) .pipe(first(), takeUntil(this.unsubscribeNotifier)) .subscribe({ @@ -1428,10 +1796,71 @@ export class DocumentDetailComponent }) } + removePassword() { + if (this.requiresPassword || !this.password) { + this.toastService.showError( + $localize`Please enter the current password before attempting to remove it.` + ) + return + } + const modal = this.modalService.open( + PasswordRemovalConfirmDialogComponent, + { + backdrop: 'static', + } + ) + modal.componentInstance.title = $localize`Remove password protection` + modal.componentInstance.message = $localize`Create an unprotected copy or replace the existing file.` + modal.componentInstance.btnCaption = $localize`Start` + + modal.componentInstance.confirmClicked + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe(() => { + const sourceDocumentId = this.selectedVersionId ?? this.document.id + const dialog = + modal.componentInstance as PasswordRemovalConfirmDialogComponent + dialog.buttonsEnabled = false + this.networkActive = true + this.documentsService + .removePasswordDocuments([sourceDocumentId], { + password: this.password, + update_document: dialog.updateDocument, + include_metadata: dialog.includeMetadata, + delete_original: dialog.deleteOriginal, + source_mode: BulkEditSourceMode.EXPLICIT_SELECTION, + }) + .pipe(first(), takeUntil(this.unsubscribeNotifier)) + .subscribe({ + next: () => { + this.toastService.showInfo( + $localize`Password removal operation for "${this.document.title}" will begin in the background.` + ) + this.networkActive = false + modal.close() + if (!dialog.updateDocument && dialog.deleteOriginal) { + this.openDocumentService.closeDocument(this.document) + } else if (dialog.updateDocument) { + this.openDocumentService.refreshDocument(this.documentId) + } + }, + error: (error) => { + dialog.buttonsEnabled = true + this.networkActive = false + this.toastService.showError( + $localize`Error executing password removal operation`, + error + ) + }, + }) + }) + } + printDocument() { + const selectedVersionId = this.getSelectedNonLatestVersionId() const printUrl = this.documentsService.getDownloadUrl( this.document.id, - false + false, + selectedVersionId ) this.http .get(printUrl, { responseType: 'blob' }) @@ -1479,7 +1908,7 @@ export class DocumentDetailComponent const modal = this.modalService.open(ShareLinksDialogComponent) modal.componentInstance.documentId = this.document.id modal.componentInstance.hasArchiveVersion = - !!this.document?.archived_file_name + this.metadata?.has_archive_version ?? !!this.document?.archived_file_name } get emailEnabled(): boolean { @@ -1492,7 +1921,7 @@ export class DocumentDetailComponent }) modal.componentInstance.documentIds = [this.document.id] modal.componentInstance.hasArchiveVersion = - !!this.document?.archived_file_name + this.metadata?.has_archive_version ?? !!this.document?.archived_file_name } private tryRenderTiff() { diff --git a/src-ui/src/app/components/document-history/document-history.component.html b/src-ui/src/app/components/document-detail/document-history/document-history.component.html similarity index 97% rename from src-ui/src/app/components/document-history/document-history.component.html rename to src-ui/src/app/components/document-detail/document-history/document-history.component.html index edb0453238..4defa96fd6 100644 --- a/src-ui/src/app/components/document-history/document-history.component.html +++ b/src-ui/src/app/components/document-detail/document-history/document-history.component.html @@ -1,6 +1,6 @@ @if (loading) {
    -
    +
    } @else {
      diff --git a/src-ui/src/app/components/document-detail/document-history/document-history.component.scss b/src-ui/src/app/components/document-detail/document-history/document-history.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src-ui/src/app/components/document-history/document-history.component.spec.ts b/src-ui/src/app/components/document-detail/document-history/document-history.component.spec.ts similarity index 81% rename from src-ui/src/app/components/document-history/document-history.component.spec.ts rename to src-ui/src/app/components/document-detail/document-history/document-history.component.spec.ts index 68b037b026..c1845c8e47 100644 --- a/src-ui/src/app/components/document-history/document-history.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-history/document-history.component.spec.ts @@ -83,8 +83,22 @@ describe('DocumentHistoryComponent', () => { expect(result).toBe(correspondentName) }) expect(getCachedSpy).toHaveBeenCalledWith(parseInt(correspondentId)) - // no correspondent found - getCachedSpy.mockReturnValue(of(null)) + }) + + it('getPrettyName should memoize results to avoid resubscribe loops', () => { + const correspondentId = '1' + const getCachedSpy = jest + .spyOn(correspondentService, 'getCached') + .mockReturnValue(of({ name: 'John Doe' })) + const a = component.getPrettyName(DataType.Correspondent, correspondentId) + const b = component.getPrettyName(DataType.Correspondent, correspondentId) + expect(a).toBe(b) + expect(getCachedSpy).toHaveBeenCalledTimes(1) + }) + + it('getPrettyName should fall back to the correspondent id when missing', () => { + const correspondentId = '1' + jest.spyOn(correspondentService, 'getCached').mockReturnValue(of(null)) component .getPrettyName(DataType.Correspondent, correspondentId) .subscribe((result) => { @@ -104,8 +118,11 @@ describe('DocumentHistoryComponent', () => { expect(result).toBe(documentTypeName) }) expect(getCachedSpy).toHaveBeenCalledWith(parseInt(documentTypeId)) - // no document type found - getCachedSpy.mockReturnValue(of(null)) + }) + + it('getPrettyName should fall back to the document type id when missing', () => { + const documentTypeId = '1' + jest.spyOn(documentTypeService, 'getCached').mockReturnValue(of(null)) component .getPrettyName(DataType.DocumentType, documentTypeId) .subscribe((result) => { @@ -125,8 +142,11 @@ describe('DocumentHistoryComponent', () => { expect(result).toBe(storagePath) }) expect(getCachedSpy).toHaveBeenCalledWith(parseInt(storagePathId)) - // no storage path found - getCachedSpy.mockReturnValue(of(null)) + }) + + it('getPrettyName should fall back to the storage path id when missing', () => { + const storagePathId = '1' + jest.spyOn(storagePathService, 'getCached').mockReturnValue(of(null)) component .getPrettyName(DataType.StoragePath, storagePathId) .subscribe((result) => { @@ -144,8 +164,11 @@ describe('DocumentHistoryComponent', () => { expect(result).toBe(ownerUsername) }) expect(getCachedSpy).toHaveBeenCalledWith(parseInt(ownerId)) - // no user found - getCachedSpy.mockReturnValue(of(null)) + }) + + it('getPrettyName should fall back to the owner id when missing', () => { + const ownerId = '1' + jest.spyOn(userService, 'getCached').mockReturnValue(of(null)) component.getPrettyName('owner', ownerId).subscribe((result) => { expect(result).toBe(ownerId) }) diff --git a/src-ui/src/app/components/document-detail/document-history/document-history.component.ts b/src-ui/src/app/components/document-detail/document-history/document-history.component.ts new file mode 100644 index 0000000000..a2bbede3cd --- /dev/null +++ b/src-ui/src/app/components/document-detail/document-history/document-history.component.ts @@ -0,0 +1,114 @@ +import { AsyncPipe, KeyValuePipe, TitleCasePipe } from '@angular/common' +import { Component, Input, OnInit, inject } from '@angular/core' +import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { Observable, first, map, of, shareReplay } from 'rxjs' +import { AuditLogAction, AuditLogEntry } from 'src/app/data/auditlog-entry' +import { DataType } from 'src/app/data/datatype' +import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' +import { CorrespondentService } from 'src/app/services/rest/correspondent.service' +import { DocumentTypeService } from 'src/app/services/rest/document-type.service' +import { DocumentService } from 'src/app/services/rest/document.service' +import { StoragePathService } from 'src/app/services/rest/storage-path.service' +import { UserService } from 'src/app/services/rest/user.service' + +@Component({ + selector: 'pngx-document-history', + templateUrl: './document-history.component.html', + styleUrl: './document-history.component.scss', + imports: [ + CustomDatePipe, + NgbTooltipModule, + AsyncPipe, + KeyValuePipe, + TitleCasePipe, + NgxBootstrapIconsModule, + ], +}) +export class DocumentHistoryComponent implements OnInit { + private documentService = inject(DocumentService) + private correspondentService = inject(CorrespondentService) + private storagePathService = inject(StoragePathService) + private documentTypeService = inject(DocumentTypeService) + private userService = inject(UserService) + + public AuditLogAction = AuditLogAction + + private _documentId: number + @Input() + set documentId(id: number) { + if (this._documentId !== id) { + this._documentId = id + this.prettyNameCache.clear() + this.loadHistory() + } + } + + public loading: boolean = true + public entries: AuditLogEntry[] = [] + + private readonly prettyNameCache = new Map>() + + ngOnInit(): void { + this.loadHistory() + } + + private loadHistory(): void { + if (this._documentId) { + this.loading = true + this.documentService.getHistory(this._documentId).subscribe((entries) => { + this.entries = entries + this.loading = false + }) + } + } + + getPrettyName(type: DataType | string, id: string): Observable { + const cacheKey = `${type}:${id}` + const cached = this.prettyNameCache.get(cacheKey) + if (cached) { + return cached + } + + const idInt = parseInt(id, 10) + const fallback$ = of(id) + + let result$: Observable + if (!Number.isFinite(idInt)) { + result$ = fallback$ + } else { + switch (type) { + case DataType.Correspondent: + result$ = this.correspondentService.getCached(idInt).pipe( + first(), + map((correspondent) => correspondent?.name ?? id) + ) + break + case DataType.DocumentType: + result$ = this.documentTypeService.getCached(idInt).pipe( + first(), + map((documentType) => documentType?.name ?? id) + ) + break + case DataType.StoragePath: + result$ = this.storagePathService.getCached(idInt).pipe( + first(), + map((storagePath) => storagePath?.path ?? id) + ) + break + case 'owner': + result$ = this.userService.getCached(idInt).pipe( + first(), + map((user) => user?.username ?? id) + ) + break + default: + result$ = fallback$ + } + } + + const shared$ = result$.pipe(shareReplay({ bufferSize: 1, refCount: true })) + this.prettyNameCache.set(cacheKey, shared$) + return shared$ + } +} diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html new file mode 100644 index 0000000000..43a71c0f18 --- /dev/null +++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html @@ -0,0 +1,134 @@ +
      + + +
      diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.scss b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.scss new file mode 100644 index 0000000000..213dca6047 --- /dev/null +++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.scss @@ -0,0 +1,17 @@ +.version-item { + .check { + width: 1rem; + height: 100%; + } + + > .version-link { + .flex-column { + width: 260px; + } + + .input-group .version-label, .input-group input { + width: 140px; + flex: 1 1 auto; + } + } +} diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts new file mode 100644 index 0000000000..c7075bbe06 --- /dev/null +++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts @@ -0,0 +1,324 @@ +import { DatePipe } from '@angular/common' +import { SimpleChange } from '@angular/core' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { Subject, of, throwError } from 'rxjs' +import { DocumentVersionInfo } from 'src/app/data/document' +import { DocumentService } from 'src/app/services/rest/document.service' +import { SettingsService } from 'src/app/services/settings.service' +import { ToastService } from 'src/app/services/toast.service' +import { + UploadState, + WebsocketStatusService, +} from 'src/app/services/websocket-status.service' +import { DocumentVersionDropdownComponent } from './document-version-dropdown.component' + +describe('DocumentVersionDropdownComponent', () => { + let component: DocumentVersionDropdownComponent + let fixture: ComponentFixture + let documentService: jest.Mocked< + Pick< + DocumentService, + 'deleteVersion' | 'getVersions' | 'uploadVersion' | 'updateVersionLabel' + > + > + let toastService: jest.Mocked> + let finished$: Subject<{ taskId: string }> + let failed$: Subject<{ taskId: string; message?: string }> + + beforeEach(async () => { + finished$ = new Subject<{ taskId: string }>() + failed$ = new Subject<{ taskId: string; message?: string }>() + documentService = { + deleteVersion: jest.fn(), + getVersions: jest.fn(), + uploadVersion: jest.fn(), + updateVersionLabel: jest.fn(), + } + toastService = { + showError: jest.fn(), + showInfo: jest.fn(), + } + + await TestBed.configureTestingModule({ + imports: [ + DocumentVersionDropdownComponent, + NgxBootstrapIconsModule.pick(allIcons), + ], + providers: [ + DatePipe, + { + provide: DocumentService, + useValue: documentService, + }, + { + provide: SettingsService, + useValue: { + get: () => null, + }, + }, + { + provide: ToastService, + useValue: toastService, + }, + { + provide: WebsocketStatusService, + useValue: { + onDocumentConsumptionFinished: () => finished$, + onDocumentConsumptionFailed: () => failed$, + }, + }, + ], + }).compileComponents() + + fixture = TestBed.createComponent(DocumentVersionDropdownComponent) + component = fixture.componentInstance + component.documentId = 3 + component.selectedVersionId = 3 + component.versions = [ + { + id: 3, + is_root: true, + checksum: 'aaaa', + }, + { + id: 10, + is_root: false, + checksum: 'bbbb', + }, + ] + fixture.detectChanges() + }) + + it('selectVersion should emit the selected id', () => { + const emitSpy = jest.spyOn(component.versionSelected, 'emit') + component.selectVersion(10) + expect(emitSpy).toHaveBeenCalledWith(10) + }) + + it('deleteVersion should refresh versions and select fallback when deleting current selection', () => { + const updatedVersions: DocumentVersionInfo[] = [ + { id: 3, is_root: true, checksum: 'aaaa' }, + { id: 20, is_root: false, checksum: 'cccc' }, + ] + component.selectedVersionId = 10 + documentService.deleteVersion.mockReturnValue( + of({ result: 'deleted', current_version_id: 3 }) + ) + documentService.getVersions.mockReturnValue( + of({ id: 3, versions: updatedVersions } as any) + ) + const versionsEmitSpy = jest.spyOn(component.versionsUpdated, 'emit') + const selectedEmitSpy = jest.spyOn(component.versionSelected, 'emit') + + component.deleteVersion(10) + + expect(documentService.deleteVersion).toHaveBeenCalledWith(3, 10) + expect(documentService.getVersions).toHaveBeenCalledWith(3) + expect(versionsEmitSpy).toHaveBeenCalledWith(updatedVersions) + expect(selectedEmitSpy).toHaveBeenCalledWith(3) + }) + + it('deleteVersion should show an error toast on failure', () => { + const error = new Error('delete failed') + documentService.deleteVersion.mockReturnValue(throwError(() => error)) + + component.deleteVersion(10) + + expect(toastService.showError).toHaveBeenCalledWith( + 'Error deleting version', + error + ) + }) + + it('beginEditingVersion should set active row and draft label', () => { + component.userCanEdit = true + component.userIsOwner = true + const version = { + id: 10, + is_root: false, + checksum: 'bbbb', + version_label: 'Current', + } as DocumentVersionInfo + + component.beginEditingVersion(version) + + expect(component.editingVersionId).toEqual(10) + expect(component.versionLabelDraft).toEqual('Current') + }) + + it('submitEditedVersionLabel should close editor without save if unchanged', () => { + const version = { + id: 10, + is_root: false, + checksum: 'bbbb', + version_label: 'Current', + } as DocumentVersionInfo + const saveSpy = jest.spyOn(component, 'saveVersionLabel') + component.editingVersionId = 10 + component.versionLabelDraft = ' Current ' + + component.submitEditedVersionLabel(version) + + expect(saveSpy).not.toHaveBeenCalled() + expect(component.editingVersionId).toBeNull() + expect(component.versionLabelDraft).toEqual('') + }) + + it('submitEditedVersionLabel should call saveVersionLabel when changed', () => { + const version = { + id: 10, + is_root: false, + checksum: 'bbbb', + version_label: 'Current', + } as DocumentVersionInfo + const saveSpy = jest + .spyOn(component, 'saveVersionLabel') + .mockImplementation(() => {}) + component.editingVersionId = 10 + component.versionLabelDraft = ' Updated ' + + component.submitEditedVersionLabel(version) + + expect(saveSpy).toHaveBeenCalledWith(10, 'Updated') + expect(component.editingVersionId).toBeNull() + }) + + it('saveVersionLabel should update the version and emit versionsUpdated', () => { + documentService.updateVersionLabel.mockReturnValue( + of({ + id: 10, + version_label: 'Updated', + is_root: false, + } as any) + ) + const emitSpy = jest.spyOn(component.versionsUpdated, 'emit') + + component.saveVersionLabel(10, 'Updated') + + expect(documentService.updateVersionLabel).toHaveBeenCalledWith( + 3, + 10, + 'Updated' + ) + expect(emitSpy).toHaveBeenCalledWith([ + { id: 3, is_root: true, checksum: 'aaaa' }, + { id: 10, is_root: false, checksum: 'bbbb', version_label: 'Updated' }, + ]) + expect(component.savingVersionLabelId).toBeNull() + }) + + it('saveVersionLabel should show error toast on failure', () => { + const error = new Error('save failed') + documentService.updateVersionLabel.mockReturnValue(throwError(() => error)) + + component.saveVersionLabel(10, 'Updated') + + expect(toastService.showError).toHaveBeenCalledWith( + 'Error updating version label', + error + ) + expect(component.savingVersionLabelId).toBeNull() + }) + + it('onVersionFileSelected should upload and update versions after websocket success', () => { + const versions: DocumentVersionInfo[] = [ + { id: 3, is_root: true, checksum: 'aaaa' }, + { id: 20, is_root: false, checksum: 'cccc' }, + ] + const file = new File(['test'], 'new-version.pdf', { + type: 'application/pdf', + }) + const input = document.createElement('input') + Object.defineProperty(input, 'files', { value: [file] }) + component.newVersionLabel = ' Updated scan ' + documentService.uploadVersion.mockReturnValue( + of({ task_id: 'task-1' } as any) + ) + documentService.getVersions.mockReturnValue(of({ id: 3, versions } as any)) + const versionsEmitSpy = jest.spyOn(component.versionsUpdated, 'emit') + const selectedEmitSpy = jest.spyOn(component.versionSelected, 'emit') + + component.onVersionFileSelected({ target: input } as Event) + finished$.next({ taskId: 'task-1' }) + + expect(documentService.uploadVersion).toHaveBeenCalledWith( + 3, + file, + 'Updated scan' + ) + expect(toastService.showInfo).toHaveBeenCalled() + expect(documentService.getVersions).toHaveBeenCalledWith(3) + expect(versionsEmitSpy).toHaveBeenCalledWith(versions) + expect(selectedEmitSpy).toHaveBeenCalledWith(20) + expect(component.newVersionLabel).toEqual('') + expect(component.versionUploadState).toEqual(UploadState.Idle) + expect(component.versionUploadError).toBeNull() + }) + + it('onVersionFileSelected should set failed state after websocket failure', () => { + const file = new File(['test'], 'new-version.pdf', { + type: 'application/pdf', + }) + const input = document.createElement('input') + Object.defineProperty(input, 'files', { value: [file] }) + documentService.uploadVersion.mockReturnValue(of('task-1')) + + component.onVersionFileSelected({ target: input } as Event) + failed$.next({ taskId: 'task-1', message: 'processing failed' }) + + expect(component.versionUploadState).toEqual(UploadState.Failed) + expect(component.versionUploadError).toEqual('processing failed') + expect(documentService.getVersions).not.toHaveBeenCalled() + }) + + it('onVersionFileSelected should fail when backend response has no task id', () => { + const file = new File(['test'], 'new-version.pdf', { + type: 'application/pdf', + }) + const input = document.createElement('input') + Object.defineProperty(input, 'files', { value: [file] }) + documentService.uploadVersion.mockReturnValue(of({} as any)) + + component.onVersionFileSelected({ target: input } as Event) + + expect(component.versionUploadState).toEqual(UploadState.Failed) + expect(component.versionUploadError).toEqual('Missing task ID.') + expect(documentService.getVersions).not.toHaveBeenCalled() + }) + + it('onVersionFileSelected should show error when upload request fails', () => { + const file = new File(['test'], 'new-version.pdf', { + type: 'application/pdf', + }) + const input = document.createElement('input') + Object.defineProperty(input, 'files', { value: [file] }) + const error = new Error('upload failed') + documentService.uploadVersion.mockReturnValue(throwError(() => error)) + + component.onVersionFileSelected({ target: input } as Event) + + expect(component.versionUploadState).toEqual(UploadState.Failed) + expect(component.versionUploadError).toEqual('upload failed') + expect(toastService.showError).toHaveBeenCalledWith( + 'Error uploading new version', + error + ) + }) + + it('ngOnChanges should clear upload status on document switch', () => { + component.versionUploadState = UploadState.Failed + component.versionUploadError = 'something failed' + component.editingVersionId = 10 + component.versionLabelDraft = 'draft' + + component.ngOnChanges({ + documentId: new SimpleChange(3, 4, false), + }) + + expect(component.versionUploadState).toEqual(UploadState.Idle) + expect(component.versionUploadError).toBeNull() + expect(component.editingVersionId).toBeNull() + expect(component.versionLabelDraft).toEqual('') + }) +}) diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts new file mode 100644 index 0000000000..dc6a3201cb --- /dev/null +++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts @@ -0,0 +1,281 @@ +import { SlicePipe } from '@angular/common' +import { + Component, + EventEmitter, + inject, + Input, + OnChanges, + OnDestroy, + Output, + SimpleChanges, +} from '@angular/core' +import { FormsModule } from '@angular/forms' +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { merge, of, Subject } from 'rxjs' +import { + filter, + finalize, + first, + map, + switchMap, + take, + takeUntil, + tap, +} from 'rxjs/operators' +import { DocumentVersionInfo } from 'src/app/data/document' +import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' +import { DocumentService } from 'src/app/services/rest/document.service' +import { ToastService } from 'src/app/services/toast.service' +import { + UploadState, + WebsocketStatusService, +} from 'src/app/services/websocket-status.service' +import { ConfirmButtonComponent } from '../../common/confirm-button/confirm-button.component' + +@Component({ + selector: 'pngx-document-version-dropdown', + templateUrl: './document-version-dropdown.component.html', + styleUrls: ['./document-version-dropdown.component.scss'], + imports: [ + FormsModule, + NgbDropdownModule, + NgxBootstrapIconsModule, + ConfirmButtonComponent, + SlicePipe, + CustomDatePipe, + ], +}) +export class DocumentVersionDropdownComponent implements OnChanges, OnDestroy { + UploadState = UploadState + + @Input() documentId: number + @Input() versions: DocumentVersionInfo[] = [] + @Input() selectedVersionId: number + @Input() userCanEdit: boolean = false + @Input() userIsOwner: boolean = false + + @Output() versionSelected = new EventEmitter() + @Output() versionsUpdated = new EventEmitter() + + newVersionLabel: string = '' + versionUploadState: UploadState = UploadState.Idle + versionUploadError: string | null = null + savingVersionLabelId: number | null = null + editingVersionId: number | null = null + versionLabelDraft: string = '' + + private readonly documentsService = inject(DocumentService) + private readonly toastService = inject(ToastService) + private readonly websocketStatusService = inject(WebsocketStatusService) + private readonly destroy$ = new Subject() + private readonly documentChange$ = new Subject() + + ngOnChanges(changes: SimpleChanges): void { + if (changes.documentId && !changes.documentId.firstChange) { + this.documentChange$.next() + this.clearVersionUploadStatus() + this.cancelEditingVersion() + } + } + + ngOnDestroy(): void { + this.documentChange$.next() + this.documentChange$.complete() + this.destroy$.next() + this.destroy$.complete() + } + + selectVersion(versionId: number): void { + this.versionSelected.emit(versionId) + } + + get canEditLabels(): boolean { + return this.userIsOwner && this.userCanEdit + } + + isEditingVersion(versionId: number): boolean { + return this.editingVersionId === versionId + } + + beginEditingVersion(version: DocumentVersionInfo, event?: Event): void { + event?.preventDefault() + event?.stopPropagation() + if (!this.canEditLabels || this.savingVersionLabelId !== null) return + this.editingVersionId = version.id + this.versionLabelDraft = version.version_label ?? '' + } + + cancelEditingVersion(event?: Event): void { + event?.preventDefault() + event?.stopPropagation() + this.editingVersionId = null + this.versionLabelDraft = '' + } + + submitEditedVersionLabel(version: DocumentVersionInfo, event?: Event): void { + event?.preventDefault() + event?.stopPropagation() + if (this.savingVersionLabelId !== null) return + const nextLabel = this.versionLabelDraft?.trim() || null + const currentLabel = version.version_label?.trim() || null + if (nextLabel === currentLabel) { + this.cancelEditingVersion() + return + } + this.saveVersionLabel(version.id, nextLabel) + this.cancelEditingVersion() + } + + deleteVersion(versionId: number): void { + const wasSelected = this.selectedVersionId === versionId + this.documentsService + .deleteVersion(this.documentId, versionId) + .pipe( + switchMap((result) => + this.documentsService + .getVersions(this.documentId) + .pipe(map((doc) => ({ doc, result }))) + ), + first(), + takeUntil(this.destroy$) + ) + .subscribe({ + next: ({ doc, result }) => { + if (doc?.versions) { + this.versionsUpdated.emit(doc.versions) + } + + if (wasSelected || this.selectedVersionId === versionId) { + const fallbackId = result?.current_version_id ?? this.documentId + this.versionSelected.emit(fallbackId) + } + }, + error: (error) => { + this.toastService.showError($localize`Error deleting version`, error) + }, + }) + } + + saveVersionLabel(versionId: number, versionLabel: string | null): void { + if (this.savingVersionLabelId !== null) return + this.savingVersionLabelId = versionId + this.documentsService + .updateVersionLabel(this.documentId, versionId, versionLabel) + .pipe( + first(), + finalize(() => { + if (this.savingVersionLabelId === versionId) { + this.savingVersionLabelId = null + } + }), + takeUntil(this.destroy$) + ) + .subscribe({ + next: (updatedVersion) => { + const updatedVersions = this.versions.map((version) => + version.id === versionId + ? { + ...version, + version_label: updatedVersion.version_label, + } + : version + ) + this.versionsUpdated.emit(updatedVersions) + }, + error: (error) => { + this.toastService.showError( + $localize`Error updating version label`, + error + ) + }, + }) + } + + onVersionFileSelected(event: Event): void { + const input = event.target as HTMLInputElement + if (!input?.files || input.files.length === 0) return + const uploadDocumentId = this.documentId + const file = input.files[0] + input.value = '' + const label = this.newVersionLabel?.trim() + this.versionUploadState = UploadState.Uploading + this.versionUploadError = null + this.documentsService + .uploadVersion(uploadDocumentId, file, label) + .pipe( + first(), + tap(() => { + this.toastService.showInfo( + $localize`Uploading new version. Processing will happen in the background.` + ) + this.newVersionLabel = '' + this.versionUploadState = UploadState.Processing + }), + map((taskId) => + typeof taskId === 'string' + ? taskId + : (taskId as { task_id?: string })?.task_id + ), + switchMap((taskId) => { + if (!taskId) { + this.versionUploadState = UploadState.Failed + this.versionUploadError = $localize`Missing task ID.` + return of(null) + } + return merge( + this.websocketStatusService.onDocumentConsumptionFinished().pipe( + filter((status) => status.taskId === taskId), + map(() => ({ state: 'success' as const })) + ), + this.websocketStatusService.onDocumentConsumptionFailed().pipe( + filter((status) => status.taskId === taskId), + map((status) => ({ + state: 'failed' as const, + message: status.message, + })) + ) + ).pipe(takeUntil(merge(this.destroy$, this.documentChange$)), take(1)) + }), + switchMap((result) => { + if (result?.state !== 'success') { + if (result?.state === 'failed') { + this.versionUploadState = UploadState.Failed + this.versionUploadError = + result.message || $localize`Upload failed.` + } + return of(null) + } + return this.documentsService.getVersions(uploadDocumentId) + }), + takeUntil(this.destroy$), + takeUntil(this.documentChange$) + ) + .subscribe({ + next: (doc) => { + if (uploadDocumentId !== this.documentId) return + if (doc?.versions) { + this.versionsUpdated.emit(doc.versions) + this.versionSelected.emit( + Math.max(...doc.versions.map((version) => version.id)) + ) + this.clearVersionUploadStatus() + } + }, + error: (error) => { + if (uploadDocumentId !== this.documentId) return + this.versionUploadState = UploadState.Failed + this.versionUploadError = error?.message || $localize`Upload failed.` + this.toastService.showError( + $localize`Error uploading new version`, + error + ) + }, + }) + } + + clearVersionUploadStatus(): void { + this.versionUploadState = UploadState.Idle + this.versionUploadError = null + } +} diff --git a/src-ui/src/app/components/document-history/document-history.component.ts b/src-ui/src/app/components/document-history/document-history.component.ts deleted file mode 100644 index d57db10561..0000000000 --- a/src-ui/src/app/components/document-history/document-history.component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { AsyncPipe, KeyValuePipe, TitleCasePipe } from '@angular/common' -import { Component, Input, OnInit, inject } from '@angular/core' -import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap' -import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { Observable, first, map, of } from 'rxjs' -import { AuditLogAction, AuditLogEntry } from 'src/app/data/auditlog-entry' -import { DataType } from 'src/app/data/datatype' -import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' -import { CorrespondentService } from 'src/app/services/rest/correspondent.service' -import { DocumentTypeService } from 'src/app/services/rest/document-type.service' -import { DocumentService } from 'src/app/services/rest/document.service' -import { StoragePathService } from 'src/app/services/rest/storage-path.service' -import { UserService } from 'src/app/services/rest/user.service' - -@Component({ - selector: 'pngx-document-history', - templateUrl: './document-history.component.html', - styleUrl: './document-history.component.scss', - imports: [ - CustomDatePipe, - NgbTooltipModule, - AsyncPipe, - KeyValuePipe, - TitleCasePipe, - NgxBootstrapIconsModule, - ], -}) -export class DocumentHistoryComponent implements OnInit { - private documentService = inject(DocumentService) - private correspondentService = inject(CorrespondentService) - private storagePathService = inject(StoragePathService) - private documentTypeService = inject(DocumentTypeService) - private userService = inject(UserService) - - public AuditLogAction = AuditLogAction - - private _documentId: number - @Input() - set documentId(id: number) { - this._documentId = id - this.ngOnInit() - } - - public loading: boolean = true - public entries: AuditLogEntry[] = [] - - ngOnInit(): void { - if (this._documentId) { - this.loading = true - this.documentService - .getHistory(this._documentId) - .subscribe((auditLogEntries) => { - this.entries = auditLogEntries - this.loading = false - }) - } - } - - getPrettyName(type: DataType | string, id: string): Observable { - switch (type) { - case DataType.Correspondent: - return this.correspondentService.getCached(parseInt(id, 10)).pipe( - first(), - map((correspondent) => correspondent?.name ?? id) - ) - case DataType.DocumentType: - return this.documentTypeService.getCached(parseInt(id, 10)).pipe( - first(), - map((documentType) => documentType?.name ?? id) - ) - case DataType.StoragePath: - return this.storagePathService.getCached(parseInt(id, 10)).pipe( - first(), - map((storagePath) => storagePath?.path ?? id) - ) - case 'owner': - return this.userService.getCached(parseInt(id, 10)).pipe( - first(), - map((user) => user?.username ?? id) - ) - default: - return of(id) - } - } -} diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html index 2323929d1c..19934ffb85 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -75,7 +75,7 @@ }
      @@ -83,27 +83,46 @@
      - @if (emailEnabled) { - - }
      +
      + +
      + + + + @if (emailEnabled) { + + } +
      +
      } -
       Download
      +
      Download
      @@ -142,7 +161,7 @@
      diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts index 457e1888df..2cebe47e03 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts @@ -1,8 +1,10 @@ +import { DatePipe } from '@angular/common' import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' import { HttpTestingController, provideHttpClientTesting, } from '@angular/common/http/testing' +import { EventEmitter } from '@angular/core' import { ComponentFixture, TestBed } from '@angular/core/testing' import { By } from '@angular/platform-browser' import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' @@ -25,6 +27,7 @@ import { SelectionData, } from 'src/app/services/rest/document.service' import { GroupService } from 'src/app/services/rest/group.service' +import { ShareLinkBundleService } from 'src/app/services/rest/share-link-bundle.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' import { TagService } from 'src/app/services/rest/tag.service' import { UserService } from 'src/app/services/rest/user.service' @@ -38,6 +41,8 @@ import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component' import { StoragePathEditDialogComponent } from '../../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component' import { TagEditDialogComponent } from '../../common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component' import { FilterableDropdownComponent } from '../../common/filterable-dropdown/filterable-dropdown.component' +import { ShareLinkBundleDialogComponent } from '../../common/share-link-bundle-dialog/share-link-bundle-dialog.component' +import { ShareLinkBundleManageDialogComponent } from '../../common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component' import { BulkEditorComponent } from './bulk-editor.component' const selectionData: SelectionData = { @@ -72,6 +77,7 @@ describe('BulkEditorComponent', () => { let storagePathService: StoragePathService let customFieldsService: CustomFieldsService let httpTestingController: HttpTestingController + let shareLinkBundleService: ShareLinkBundleService beforeEach(async () => { TestBed.configureTestingModule({ @@ -133,6 +139,7 @@ describe('BulkEditorComponent', () => { }, }, FilterPipe, + DatePipe, SettingsService, { provide: UserService, @@ -152,6 +159,15 @@ describe('BulkEditorComponent', () => { }), }, }, + { + provide: ShareLinkBundleService, + useValue: { + createBundle: jest.fn(), + listAllBundles: jest.fn(), + rebuildBundle: jest.fn(), + delete: jest.fn(), + }, + }, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), ], @@ -168,6 +184,7 @@ describe('BulkEditorComponent', () => { storagePathService = TestBed.inject(StoragePathService) customFieldsService = TestBed.inject(CustomFieldsService) httpTestingController = TestBed.inject(HttpTestingController) + shareLinkBundleService = TestBed.inject(ShareLinkBundleService) fixture = TestBed.createComponent(BulkEditorComponent) component = fixture.componentInstance @@ -834,13 +851,11 @@ describe('BulkEditorComponent', () => { expect(modal).not.toBeUndefined() modal.componentInstance.confirm() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/delete/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'delete', - parameters: {}, }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -853,7 +868,7 @@ describe('BulkEditorComponent', () => { fixture.detectChanges() component.applyDelete() req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/delete/` ) }) @@ -929,13 +944,11 @@ describe('BulkEditorComponent', () => { expect(modal).not.toBeUndefined() modal.componentInstance.confirm() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/reprocess/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'reprocess', - parameters: {}, }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -964,13 +977,13 @@ describe('BulkEditorComponent', () => { modal.componentInstance.rotate() modal.componentInstance.confirm() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/rotate/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'rotate', - parameters: { degrees: 90 }, + degrees: 90, + source_mode: 'latest_version', }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -1006,13 +1019,12 @@ describe('BulkEditorComponent', () => { modal.componentInstance.metadataDocumentID = 3 modal.componentInstance.confirm() let req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/merge/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'merge', - parameters: { metadata_document_id: 3 }, + metadata_document_id: 3, }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -1025,13 +1037,13 @@ describe('BulkEditorComponent', () => { modal.componentInstance.deleteOriginals = true modal.componentInstance.confirm() req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/merge/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'merge', - parameters: { metadata_document_id: 3, delete_originals: true }, + metadata_document_id: 3, + delete_originals: true, }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -1046,13 +1058,13 @@ describe('BulkEditorComponent', () => { modal.componentInstance.archiveFallback = true modal.componentInstance.confirm() req = httpTestingController.expectOne( - `${environment.apiBaseUrl}documents/bulk_edit/` + `${environment.apiBaseUrl}documents/merge/` ) req.flush(true) expect(req.request.body).toEqual({ documents: [3, 4], - method: 'merge', - parameters: { metadata_document_id: 3, archive_fallback: true }, + metadata_document_id: 3, + archive_fallback: true, }) httpTestingController.match( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -1454,4 +1466,130 @@ describe('BulkEditorComponent', () => { `${environment.apiBaseUrl}documents/?page=1&page_size=100000&fields=id` ) // listAllFilteredIds }) + + it('should create share link bundle and enable manage callback', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + jest + .spyOn(documentListViewService, 'documents', 'get') + .mockReturnValue([{ id: 5 }, { id: 7 }] as any) + jest + .spyOn(documentListViewService, 'selected', 'get') + .mockReturnValue(new Set([5, 7])) + + const confirmClicked = new EventEmitter() + const modalRef: Partial = { + close: jest.fn(), + componentInstance: { + documents: [], + confirmClicked, + payload: { + document_ids: [5, 7], + file_version: 'archive', + expiration_days: 7, + }, + loading: false, + buttonsEnabled: true, + copied: false, + }, + } + + const openSpy = jest.spyOn(modalService, 'open') + openSpy.mockReturnValueOnce(modalRef as NgbModalRef) + openSpy.mockReturnValueOnce({} as NgbModalRef) + ;(shareLinkBundleService.createBundle as jest.Mock).mockReturnValueOnce( + of({ id: 42 }) + ) + const toastInfoSpy = jest.spyOn(toastService, 'showInfo') + + component.createShareLinkBundle() + + expect(openSpy).toHaveBeenNthCalledWith( + 1, + ShareLinkBundleDialogComponent, + expect.objectContaining({ backdrop: 'static', size: 'lg' }) + ) + + const dialogInstance = modalRef.componentInstance as any + expect(dialogInstance.documents).toEqual([{ id: 5 }, { id: 7 }]) + + confirmClicked.emit() + + expect(shareLinkBundleService.createBundle).toHaveBeenCalledWith({ + document_ids: [5, 7], + file_version: 'archive', + expiration_days: 7, + }) + expect(dialogInstance.loading).toBe(false) + expect(dialogInstance.buttonsEnabled).toBe(false) + expect(dialogInstance.createdBundle).toEqual({ id: 42 }) + expect(typeof dialogInstance.onOpenManage).toBe('function') + expect(toastInfoSpy).toHaveBeenCalledWith( + $localize`Share link bundle creation requested.` + ) + + dialogInstance.onOpenManage() + expect(modalRef.close).toHaveBeenCalled() + expect(openSpy).toHaveBeenNthCalledWith( + 2, + ShareLinkBundleManageDialogComponent, + expect.objectContaining({ backdrop: 'static', size: 'lg' }) + ) + openSpy.mockRestore() + }) + + it('should handle share link bundle creation errors', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + jest + .spyOn(documentListViewService, 'documents', 'get') + .mockReturnValue([{ id: 9 }] as any) + jest + .spyOn(documentListViewService, 'selected', 'get') + .mockReturnValue(new Set([9])) + + const confirmClicked = new EventEmitter() + const modalRef: Partial = { + componentInstance: { + documents: [], + confirmClicked, + payload: { + document_ids: [9], + file_version: 'original', + expiration_days: null, + }, + loading: false, + buttonsEnabled: true, + }, + } + + const openSpy = jest + .spyOn(modalService, 'open') + .mockReturnValue(modalRef as NgbModalRef) + ;(shareLinkBundleService.createBundle as jest.Mock).mockReturnValueOnce( + throwError(() => new Error('bundle failure')) + ) + const toastErrorSpy = jest.spyOn(toastService, 'showError') + + component.createShareLinkBundle() + + const dialogInstance = modalRef.componentInstance as any + confirmClicked.emit() + + expect(toastErrorSpy).toHaveBeenCalledWith( + $localize`Share link bundle creation is not available yet.`, + expect.any(Error) + ) + expect(dialogInstance.loading).toBe(false) + expect(dialogInstance.buttonsEnabled).toBe(true) + openSpy.mockRestore() + }) + + it('should open share link bundle management dialog', () => { + const openSpy = jest.spyOn(modalService, 'open') + component.manageShareLinkBundles() + expect(openSpy).toHaveBeenCalledWith( + ShareLinkBundleManageDialogComponent, + expect.objectContaining({ backdrop: 'static', size: 'lg' }) + ) + openSpy.mockRestore() + }) }) diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts index 4d66335fe5..c23cd6c5fc 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -12,7 +12,7 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { saveAs } from 'file-saver' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' -import { first, map, Subject, switchMap, takeUntil } from 'rxjs' +import { first, map, Observable, Subject, switchMap, takeUntil } from 'rxjs' import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component' import { CustomField } from 'src/app/data/custom-field' import { MatchingModel } from 'src/app/data/matching-model' @@ -29,10 +29,13 @@ import { CorrespondentService } from 'src/app/services/rest/correspondent.servic import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' import { + DocumentBulkEditMethod, DocumentService, + MergeDocumentsRequest, SelectionDataItem, } from 'src/app/services/rest/document.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' +import { ShareLinkBundleService } from 'src/app/services/rest/share-link-bundle.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' import { TagService } from 'src/app/services/rest/tag.service' import { SettingsService } from 'src/app/services/settings.service' @@ -54,6 +57,8 @@ import { } from '../../common/filterable-dropdown/filterable-dropdown.component' import { ToggleableItemState } from '../../common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component' import { PermissionsDialogComponent } from '../../common/permissions-dialog/permissions-dialog.component' +import { ShareLinkBundleDialogComponent } from '../../common/share-link-bundle-dialog/share-link-bundle-dialog.component' +import { ShareLinkBundleManageDialogComponent } from '../../common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' import { CustomFieldsBulkEditDialogComponent } from './custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component' @@ -87,6 +92,7 @@ export class BulkEditorComponent private customFieldService = inject(CustomFieldsService) private permissionService = inject(PermissionsService) private savedViewService = inject(SavedViewService) + private readonly shareLinkBundleService = inject(ShareLinkBundleService) tagSelectionModel = new FilterableDropdownSelectionModel(true) correspondentSelectionModel = new FilterableDropdownSelectionModel() @@ -251,9 +257,9 @@ export class BulkEditorComponent this.unsubscribeNotifier.complete() } - private executeBulkOperation( + private executeBulkEditMethod( modal: NgbModalRef, - method: string, + method: DocumentBulkEditMethod, args: any, overrideDocumentIDs?: number[] ) { @@ -268,32 +274,55 @@ export class BulkEditorComponent ) .pipe(first()) .subscribe({ - next: () => { - if (args['delete_originals']) { - this.list.selected.clear() - } - this.list.reload() - this.list.reduceSelectionToFilter() - this.list.selected.forEach((id) => { - this.openDocumentService.refreshDocument(id) - }) - this.savedViewService.maybeRefreshDocumentCounts() - if (modal) { - modal.close() - } - }, - error: (error) => { - if (modal) { - modal.componentInstance.buttonsEnabled = true - } - this.toastService.showError( - $localize`Error executing bulk operation`, - error - ) - }, + next: () => this.handleOperationSuccess(modal), + error: (error) => this.handleOperationError(modal, error), }) } + private executeDocumentAction( + modal: NgbModalRef, + request: Observable, + options: { deleteOriginals?: boolean } = {} + ) { + if (modal) { + modal.componentInstance.buttonsEnabled = false + } + request.pipe(first()).subscribe({ + next: () => { + this.handleOperationSuccess(modal, options.deleteOriginals ?? false) + }, + error: (error) => this.handleOperationError(modal, error), + }) + } + + private handleOperationSuccess( + modal: NgbModalRef, + clearSelection: boolean = false + ) { + if (clearSelection) { + this.list.selected.clear() + } + this.list.reload() + this.list.reduceSelectionToFilter() + this.list.selected.forEach((id) => { + this.openDocumentService.refreshDocument(id) + }) + this.savedViewService.maybeRefreshDocumentCounts() + if (modal) { + modal.close() + } + } + + private handleOperationError(modal: NgbModalRef, error: any) { + if (modal) { + modal.componentInstance.buttonsEnabled = true + } + this.toastService.showError( + $localize`Error executing bulk operation`, + error + ) + } + private applySelectionData( items: SelectionDataItem[], selectionModel: FilterableDropdownSelectionModel @@ -442,13 +471,13 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - this.executeBulkOperation(modal, 'modify_tags', { + this.executeBulkEditMethod(modal, 'modify_tags', { add_tags: changedTags.itemsToAdd.map((t) => t.id), remove_tags: changedTags.itemsToRemove.map((t) => t.id), }) }) } else { - this.executeBulkOperation(null, 'modify_tags', { + this.executeBulkEditMethod(null, 'modify_tags', { add_tags: changedTags.itemsToAdd.map((t) => t.id), remove_tags: changedTags.itemsToRemove.map((t) => t.id), }) @@ -482,12 +511,12 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - this.executeBulkOperation(modal, 'set_correspondent', { + this.executeBulkEditMethod(modal, 'set_correspondent', { correspondent: correspondent ? correspondent.id : null, }) }) } else { - this.executeBulkOperation(null, 'set_correspondent', { + this.executeBulkEditMethod(null, 'set_correspondent', { correspondent: correspondent ? correspondent.id : null, }) } @@ -520,12 +549,12 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - this.executeBulkOperation(modal, 'set_document_type', { + this.executeBulkEditMethod(modal, 'set_document_type', { document_type: documentType ? documentType.id : null, }) }) } else { - this.executeBulkOperation(null, 'set_document_type', { + this.executeBulkEditMethod(null, 'set_document_type', { document_type: documentType ? documentType.id : null, }) } @@ -558,12 +587,12 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - this.executeBulkOperation(modal, 'set_storage_path', { + this.executeBulkEditMethod(modal, 'set_storage_path', { storage_path: storagePath ? storagePath.id : null, }) }) } else { - this.executeBulkOperation(null, 'set_storage_path', { + this.executeBulkEditMethod(null, 'set_storage_path', { storage_path: storagePath ? storagePath.id : null, }) } @@ -620,7 +649,7 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - this.executeBulkOperation(modal, 'modify_custom_fields', { + this.executeBulkEditMethod(modal, 'modify_custom_fields', { add_custom_fields: changedCustomFields.itemsToAdd.map((f) => f.id), remove_custom_fields: changedCustomFields.itemsToRemove.map( (f) => f.id @@ -628,7 +657,7 @@ export class BulkEditorComponent }) }) } else { - this.executeBulkOperation(null, 'modify_custom_fields', { + this.executeBulkEditMethod(null, 'modify_custom_fields', { add_custom_fields: changedCustomFields.itemsToAdd.map((f) => f.id), remove_custom_fields: changedCustomFields.itemsToRemove.map( (f) => f.id @@ -758,10 +787,16 @@ export class BulkEditorComponent .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { modal.componentInstance.buttonsEnabled = false - this.executeBulkOperation(modal, 'delete', {}) + this.executeDocumentAction( + modal, + this.documentService.deleteDocuments(Array.from(this.list.selected)) + ) }) } else { - this.executeBulkOperation(null, 'delete', {}) + this.executeDocumentAction( + null, + this.documentService.deleteDocuments(Array.from(this.list.selected)) + ) } } @@ -800,7 +835,12 @@ export class BulkEditorComponent .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { modal.componentInstance.buttonsEnabled = false - this.executeBulkOperation(modal, 'reprocess', {}) + this.executeDocumentAction( + modal, + this.documentService.reprocessDocuments( + Array.from(this.list.selected) + ) + ) }) } @@ -811,7 +851,7 @@ export class BulkEditorComponent modal.componentInstance.confirmClicked.subscribe( ({ permissions, merge }) => { modal.componentInstance.buttonsEnabled = false - this.executeBulkOperation(modal, 'set_permissions', { + this.executeBulkEditMethod(modal, 'set_permissions', { ...permissions, merge, }) @@ -826,7 +866,7 @@ export class BulkEditorComponent }) const rotateDialog = modal.componentInstance as RotateConfirmDialogComponent rotateDialog.title = $localize`Rotate confirm` - rotateDialog.messageBold = $localize`This operation will permanently rotate the original version of ${this.list.selected.size} document(s).` + rotateDialog.messageBold = $localize`This operation will add rotated versions of the ${this.list.selected.size} document(s).` rotateDialog.btnClass = 'btn-danger' rotateDialog.btnCaption = $localize`Proceed` rotateDialog.documentID = Array.from(this.list.selected)[0] @@ -834,9 +874,13 @@ export class BulkEditorComponent .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { rotateDialog.buttonsEnabled = false - this.executeBulkOperation(modal, 'rotate', { - degrees: rotateDialog.degrees, - }) + this.executeDocumentAction( + modal, + this.documentService.rotateDocuments( + Array.from(this.list.selected), + rotateDialog.degrees + ) + ) }) } @@ -852,18 +896,22 @@ export class BulkEditorComponent mergeDialog.confirmClicked .pipe(takeUntil(this.unsubscribeNotifier)) .subscribe(() => { - const args = {} + const args: MergeDocumentsRequest = {} if (mergeDialog.metadataDocumentID > -1) { - args['metadata_document_id'] = mergeDialog.metadataDocumentID + args.metadata_document_id = mergeDialog.metadataDocumentID } if (mergeDialog.deleteOriginals) { - args['delete_originals'] = true + args.delete_originals = true } if (mergeDialog.archiveFallback) { - args['archive_fallback'] = true + args.archive_fallback = true } mergeDialog.buttonsEnabled = false - this.executeBulkOperation(modal, 'merge', args, mergeDialog.documentIDs) + this.executeDocumentAction( + modal, + this.documentService.mergeDocuments(mergeDialog.documentIDs, args), + { deleteOriginals: !!args.delete_originals } + ) this.toastService.showInfo( $localize`Merged document will be queued for consumption.` ) @@ -908,6 +956,58 @@ export class BulkEditorComponent return this.settings.get(SETTINGS_KEYS.EMAIL_ENABLED) } + createShareLinkBundle() { + const modal = this.modalService.open(ShareLinkBundleDialogComponent, { + backdrop: 'static', + size: 'lg', + }) + const dialog = modal.componentInstance as ShareLinkBundleDialogComponent + const selectedDocuments = this.list.documents.filter((d) => + this.list.selected.has(d.id) + ) + dialog.documents = selectedDocuments + dialog.confirmClicked + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe(() => { + dialog.loading = true + dialog.buttonsEnabled = false + this.shareLinkBundleService + .createBundle(dialog.payload) + .pipe(first()) + .subscribe({ + next: (result) => { + dialog.loading = false + dialog.buttonsEnabled = false + dialog.createdBundle = result + dialog.copied = false + dialog.payload = null + dialog.onOpenManage = () => { + modal.close() + this.manageShareLinkBundles() + } + this.toastService.showInfo( + $localize`Share link bundle creation requested.` + ) + }, + error: (error) => { + dialog.loading = false + dialog.buttonsEnabled = true + this.toastService.showError( + $localize`Share link bundle creation is not available yet.`, + error + ) + }, + }) + }) + } + + manageShareLinkBundles() { + this.modalService.open(ShareLinkBundleManageDialogComponent, { + backdrop: 'static', + size: 'lg', + }) + } + emailSelected() { const allHaveArchiveVersion = this.list.documents .filter((d) => this.list.selected.has(d.id)) diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html index ab9436f091..f0da792603 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html @@ -66,16 +66,16 @@
      @if (document) { -  More like this + More like this -  Open + Open -  View + View -  Download + Download } @else {
       
      diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index b154324c78..b3a29aed4b 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -15,7 +15,7 @@ } @if (document && displayFields?.includes(DisplayField.TAGS)) { -
      +
      @for (tagID of tagIDs; track tagID) { } diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss index 508c5251ab..dce77802e4 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.scss @@ -72,4 +72,14 @@ a { max-width: 80%; row-gap: .2rem; line-height: 1; + + &.tags-no-wrap { + ::ng-deep .badge { + display: inline-block; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } } diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts index 63cfc5a50c..982b3980b4 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts @@ -82,6 +82,16 @@ describe('DocumentCardSmallComponent', () => { ).toHaveLength(6) }) + it('should clear hidden tag counter when tag count falls below the limit', () => { + expect(component.moreTags).toEqual(3) + + component.document.tags = [1, 2, 3, 4, 5, 6] + fixture.detectChanges() + + expect(component.moreTags).toBeNull() + expect(fixture.nativeElement.textContent).not.toContain('+ 3') + }) + it('should try to close the preview on mouse leave', () => { component.popupPreview = { close: jest.fn(), diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts index ad428dfabe..05f84d7529 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.ts @@ -126,6 +126,7 @@ export class DocumentCardSmallComponent this.moreTags = this.document.tags.length - (limit - 1) return this.document.tags.slice(0, limit - 1) } else { + this.moreTags = null return this.document.tags } } diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index ef11e44f9f..1765136638 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -1,8 +1,7 @@
      }
      @@ -64,8 +62,7 @@
      @if (field.document_count > 0) {
      - + + Documents{{ field.document_count }} +
      }
      diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss b/src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.scss similarity index 100% rename from src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss rename to src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.scss diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.spec.ts similarity index 86% rename from src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.spec.ts index e94470d64c..96eaab5030 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.spec.ts @@ -4,6 +4,7 @@ import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' import { provideHttpClientTesting } from '@angular/common/http/testing' import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { By } from '@angular/platform-browser' +import { RouterTestingModule } from '@angular/router/testing' import { NgbModal, NgbModalModule, @@ -25,9 +26,9 @@ import { PermissionsService } from 'src/app/services/permissions.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' -import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' -import { CustomFieldEditDialogComponent } from '../../common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { ConfirmDialogComponent } from '../../../common/confirm-dialog/confirm-dialog.component' +import { CustomFieldEditDialogComponent } from '../../../common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' +import { PageHeaderComponent } from '../../../common/page-header/page-header.component' import { CustomFieldsComponent } from './custom-fields.component' const fields: CustomField[] = [ @@ -61,6 +62,7 @@ describe('CustomFieldsComponent', () => { NgbModalModule, NgbPopoverModule, NgxBootstrapIconsModule.pick(allIcons), + RouterTestingModule, CustomFieldsComponent, IfPermissionsDirective, PageHeaderComponent, @@ -108,8 +110,7 @@ describe('CustomFieldsComponent', () => { const toastInfoSpy = jest.spyOn(toastService, 'showInfo') const reloadSpy = jest.spyOn(component, 'reload') - const createButton = fixture.debugElement.queryAll(By.css('button'))[1] - createButton.triggerEventHandler('click') + component.editField() expect(modal).not.toBeUndefined() const editDialog = modal.componentInstance as CustomFieldEditDialogComponent @@ -133,7 +134,11 @@ describe('CustomFieldsComponent', () => { const toastInfoSpy = jest.spyOn(toastService, 'showInfo') const reloadSpy = jest.spyOn(component, 'reload') - const editButton = fixture.debugElement.queryAll(By.css('button'))[2] + const editButton = fixture.debugElement + .queryAll(By.css('button')) + .find((btn) => + btn.nativeElement.textContent.trim().includes(fields[0].name) + ) editButton.triggerEventHandler('click') expect(modal).not.toBeUndefined() @@ -158,7 +163,9 @@ describe('CustomFieldsComponent', () => { const deleteSpy = jest.spyOn(customFieldsService, 'delete') const reloadSpy = jest.spyOn(component, 'reload') - const deleteButton = fixture.debugElement.queryAll(By.css('button'))[5] + const deleteButton = fixture.debugElement + .queryAll(By.css('button')) + .find((btn) => btn.nativeElement.textContent.trim().includes('Delete')) deleteButton.triggerEventHandler('click') expect(modal).not.toBeUndefined() @@ -176,10 +183,10 @@ describe('CustomFieldsComponent', () => { expect(reloadSpy).toHaveBeenCalled() }) - it('should support filter documents', () => { - const filterSpy = jest.spyOn(listViewService, 'quickFilter') - component.filterDocuments(fields[0]) - expect(filterSpy).toHaveBeenCalledWith([ + it('should provide document filter url', () => { + const urlSpy = jest.spyOn(listViewService, 'getQuickFilterUrl') + component.getDocumentFilterUrl(fields[0]) + expect(urlSpy).toHaveBeenCalledWith([ { rule_type: FILTER_CUSTOM_FIELDS_QUERY, value: JSON.stringify([ diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts b/src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts similarity index 79% rename from src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts rename to src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts index 9e7ecf78a0..9b9eb98bf4 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit, inject } from '@angular/core' +import { RouterModule } from '@angular/router' import { NgbDropdownModule, NgbModal, @@ -6,6 +7,10 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { delay, takeUntil, tap } from 'rxjs' +import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component' +import { CustomFieldEditDialogComponent } from 'src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' +import { EditDialogMode } from 'src/app/components/common/edit-dialog/edit-dialog.component' +import { LoadingComponentWithPermissions } from 'src/app/components/loading-component/loading.component' import { CustomField, DATA_TYPE_LABELS } from 'src/app/data/custom-field' import { CustomFieldQueryLogicalOperator, @@ -20,36 +25,31 @@ import { DocumentService } from 'src/app/services/rest/document.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' -import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' -import { CustomFieldEditDialogComponent } from '../../common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component' -import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { LoadingComponentWithPermissions } from '../../loading-component/loading.component' @Component({ selector: 'pngx-custom-fields', templateUrl: './custom-fields.component.html', styleUrls: ['./custom-fields.component.scss'], imports: [ - PageHeaderComponent, IfPermissionsDirective, NgbDropdownModule, NgbPaginationModule, NgxBootstrapIconsModule, + RouterModule, ], }) export class CustomFieldsComponent extends LoadingComponentWithPermissions implements OnInit { - private customFieldsService = inject(CustomFieldsService) - permissionsService = inject(PermissionsService) - private modalService = inject(NgbModal) - private toastService = inject(ToastService) - private documentListViewService = inject(DocumentListViewService) - private settingsService = inject(SettingsService) - private documentService = inject(DocumentService) - private savedViewService = inject(SavedViewService) + private readonly customFieldsService = inject(CustomFieldsService) + public readonly permissionsService = inject(PermissionsService) + private readonly modalService = inject(NgbModal) + private readonly toastService = inject(ToastService) + private readonly documentListViewService = inject(DocumentListViewService) + private readonly settingsService = inject(SettingsService) + private readonly documentService = inject(DocumentService) + private readonly savedViewService = inject(SavedViewService) public fields: CustomField[] = [] @@ -130,8 +130,8 @@ export class CustomFieldsComponent return DATA_TYPE_LABELS.find((l) => l.id === field.data_type).name } - filterDocuments(field: CustomField) { - this.documentListViewService.quickFilter([ + getDocumentFilterUrl(field: CustomField) { + return this.documentListViewService.getQuickFilterUrl([ { rule_type: FILTER_CUSTOM_FIELDS_QUERY, value: JSON.stringify([ diff --git a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html new file mode 100644 index 0000000000..bee9a29aae --- /dev/null +++ b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.html @@ -0,0 +1,77 @@ + + @if (activeManagementList) { +
      + +
      + + + +
      +
      + +
      +
      + Select: +
      +
      + @if (activeManagementList.selectedObjects.size > 0) { + + } + + +
      +
      + + + + + } @else if (activeCustomFields) { + + } +
      + + + +
      + +
      diff --git a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.scss b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.spec.ts new file mode 100644 index 0000000000..54017a7e0e --- /dev/null +++ b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.spec.ts @@ -0,0 +1,189 @@ +import { Component } from '@angular/core' +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { + ActivatedRoute, + convertToParamMap, + ParamMap, + Router, +} from '@angular/router' +import { RouterTestingModule } from '@angular/router/testing' +import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { Subject } from 'rxjs' +import { + PermissionAction, + PermissionsService, + PermissionType, +} from 'src/app/services/permissions.service' +import { + DocumentAttributesComponent, + DocumentAttributesSectionKind, +} from './document-attributes.component' + +@Component({ + selector: 'pngx-dummy-section', + template: '', + standalone: true, +}) +class DummySectionComponent {} + +describe('DocumentAttributesComponent', () => { + let component: DocumentAttributesComponent + let fixture: ComponentFixture + let router: Router + let paramMapSubject: Subject + let permissionsService: PermissionsService + + beforeEach(async () => { + paramMapSubject = new Subject() + + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + NgxBootstrapIconsModule.pick(allIcons), + DocumentAttributesComponent, + DummySectionComponent, + ], + providers: [ + { + provide: ActivatedRoute, + useValue: { + paramMap: paramMapSubject.asObservable(), + }, + }, + { + provide: PermissionsService, + useValue: { + currentUserCan: jest.fn(), + }, + }, + ], + }).compileComponents() + + fixture = TestBed.createComponent(DocumentAttributesComponent) + component = fixture.componentInstance + router = TestBed.inject(Router) + permissionsService = TestBed.inject(PermissionsService) + + jest.spyOn(router, 'navigate').mockResolvedValue(true) + ;(component as any).sections = [ + { + id: 1, + path: 'tags', + label: 'Tags', + icon: 'tags', + permissionType: PermissionType.Tag, + kind: DocumentAttributesSectionKind.ManagementList, + component: DummySectionComponent, + }, + { + id: 2, + path: 'customfields', + label: 'Custom fields', + icon: 'ui-radios', + permissionType: PermissionType.CustomField, + kind: DocumentAttributesSectionKind.CustomFields, + component: DummySectionComponent, + }, + ] + }) + + it('should navigate to default section when no section is provided', () => { + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation((action, type) => { + return action === PermissionAction.View && type === PermissionType.Tag + }) + + fixture.detectChanges() + paramMapSubject.next(convertToParamMap({})) + + expect(router.navigate).toHaveBeenCalledWith(['attributes', 'tags'], { + replaceUrl: true, + }) + expect(component.activeNavID).toBe(1) + }) + + it('should set active section from route param when valid', () => { + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation((action, type) => { + return ( + action === PermissionAction.View && + type === PermissionType.CustomField + ) + }) + + fixture.detectChanges() + paramMapSubject.next(convertToParamMap({ section: 'customfields' })) + + expect(component.activeNavID).toBe(2) + expect(router.navigate).not.toHaveBeenCalled() + }) + + it('should update active nav id when route section changes', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + + fixture.detectChanges() + component.activeNavID = 1 + paramMapSubject.next(convertToParamMap({ section: 'customfields' })) + + expect(component.activeNavID).toBe(2) + }) + + it('should redirect to dashboard when no sections are visible', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(false) + + fixture.detectChanges() + paramMapSubject.next(convertToParamMap({})) + + expect(router.navigate).toHaveBeenCalledWith(['/dashboard'], { + replaceUrl: true, + }) + }) + + it('should navigate when a nav change occurs', () => { + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation(() => true) + + fixture.detectChanges() + paramMapSubject.next(convertToParamMap({ section: 'tags' })) + + component.onNavChange({ nextId: 2 } as any) + + expect(router.navigate).toHaveBeenCalledWith(['attributes', 'customfields']) + }) + + it('should ignore nav changes for unknown sections', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + + fixture.detectChanges() + paramMapSubject.next(convertToParamMap({ section: 'tags' })) + + component.onNavChange({ nextId: 999 } as any) + + expect(router.navigate).not.toHaveBeenCalled() + }) + + it('should return activeManagementList correctly', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + expect(component.activeManagementList).toBeNull() + + component.activeNavID = 1 + expect(component.activeSection.kind).toBe( + DocumentAttributesSectionKind.ManagementList + ) + expect(component.activeManagementList).toBeDefined() + }) + + it('should return activeCustomFields correctly', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + expect(component.activeCustomFields).toBeNull() + + component.activeNavID = 2 + expect(component.activeSection.kind).toBe( + DocumentAttributesSectionKind.CustomFields + ) + expect(component.activeCustomFields).toBeDefined() + }) +}) diff --git a/src-ui/src/app/components/manage/document-attributes/document-attributes.component.ts b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.ts new file mode 100644 index 0000000000..8396ca6b2b --- /dev/null +++ b/src-ui/src/app/components/manage/document-attributes/document-attributes.component.ts @@ -0,0 +1,256 @@ +import { NgComponentOutlet } from '@angular/common' +import { + AfterViewChecked, + ChangeDetectorRef, + Component, + inject, + OnDestroy, + OnInit, + Type, + ViewChild, +} from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { + NgbDropdownModule, + NgbNavChangeEvent, + NgbNavModule, +} from '@ng-bootstrap/ng-bootstrap' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { Subject, takeUntil } from 'rxjs' +import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' +import { + PermissionAction, + PermissionsService, + PermissionType, +} from 'src/app/services/permissions.service' +import { ClearableBadgeComponent } from '../../common/clearable-badge/clearable-badge.component' +import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { CustomFieldsComponent } from './custom-fields/custom-fields.component' +import { CorrespondentListComponent } from './management-list/correspondent-list/correspondent-list.component' +import { DocumentTypeListComponent } from './management-list/document-type-list/document-type-list.component' +import { ManagementListComponent } from './management-list/management-list.component' +import { StoragePathListComponent } from './management-list/storage-path-list/storage-path-list.component' +import { TagListComponent } from './management-list/tag-list/tag-list.component' + +enum DocumentAttributesNavIDs { + Tags = 1, + Correspondents = 2, + DocumentTypes = 3, + StoragePaths = 4, + CustomFields = 5, +} + +export enum DocumentAttributesSectionKind { + ManagementList = 'managementList', + CustomFields = 'customFields', +} + +interface DocumentAttributesSection { + id: DocumentAttributesNavIDs + path: string + label: string + icon: string + infoLink?: string + permissionType: PermissionType + kind: DocumentAttributesSectionKind + component: Type +} + +@Component({ + selector: 'pngx-document-attributes', + templateUrl: './document-attributes.component.html', + styleUrls: ['./document-attributes.component.scss'], + imports: [ + PageHeaderComponent, + NgbNavModule, + NgbDropdownModule, + NgComponentOutlet, + NgxBootstrapIconsModule, + IfPermissionsDirective, + ClearableBadgeComponent, + ], +}) +export class DocumentAttributesComponent + implements OnInit, OnDestroy, AfterViewChecked +{ + private readonly permissionsService = inject(PermissionsService) + private readonly activatedRoute = inject(ActivatedRoute) + private readonly router = inject(Router) + private readonly cdr = inject(ChangeDetectorRef) + private readonly unsubscribeNotifier = new Subject() + + protected readonly PermissionAction = PermissionAction + protected readonly PermissionType = PermissionType + + readonly sections: DocumentAttributesSection[] = [ + { + id: DocumentAttributesNavIDs.Tags, + path: 'tags', + label: $localize`Tags`, + icon: 'tags', + infoLink: 'usage/#terms-and-definitions', + permissionType: PermissionType.Tag, + kind: DocumentAttributesSectionKind.ManagementList, + component: TagListComponent, + }, + { + id: DocumentAttributesNavIDs.Correspondents, + path: 'correspondents', + label: $localize`Correspondents`, + icon: 'person', + infoLink: 'usage/#terms-and-definitions', + permissionType: PermissionType.Correspondent, + kind: DocumentAttributesSectionKind.ManagementList, + component: CorrespondentListComponent, + }, + { + id: DocumentAttributesNavIDs.DocumentTypes, + path: 'documenttypes', + label: $localize`Document types`, + icon: 'hash', + infoLink: 'usage/#terms-and-definitions', + permissionType: PermissionType.DocumentType, + kind: DocumentAttributesSectionKind.ManagementList, + component: DocumentTypeListComponent, + }, + { + id: DocumentAttributesNavIDs.StoragePaths, + path: 'storagepaths', + label: $localize`Storage paths`, + icon: 'folder', + infoLink: 'usage/#terms-and-definitions', + permissionType: PermissionType.StoragePath, + kind: DocumentAttributesSectionKind.ManagementList, + component: StoragePathListComponent, + }, + { + id: DocumentAttributesNavIDs.CustomFields, + path: 'customfields', + label: $localize`Custom fields`, + icon: 'ui-radios', + infoLink: 'usage/#custom-fields', + permissionType: PermissionType.CustomField, + kind: DocumentAttributesSectionKind.CustomFields, + component: CustomFieldsComponent, + }, + ] + + @ViewChild('activeOutlet', { read: NgComponentOutlet }) + private readonly activeOutlet?: NgComponentOutlet + + private lastHeaderLoading: boolean + + activeNavID: number = null + + get visibleSections(): DocumentAttributesSection[] { + return this.sections.filter((section) => + this.permissionsService.currentUserCan( + PermissionAction.View, + section.permissionType + ) + ) + } + + get activeSection(): DocumentAttributesSection | null { + return ( + this.visibleSections.find((section) => section.id === this.activeNavID) ?? + null + ) + } + + get activeManagementList(): ManagementListComponent | null { + if ( + this.activeSection?.kind !== DocumentAttributesSectionKind.ManagementList + ) + return null + const instance = this.activeOutlet?.componentInstance + return instance instanceof ManagementListComponent ? instance : null + } + + get activeCustomFields(): CustomFieldsComponent | null { + if (this.activeSection?.kind !== DocumentAttributesSectionKind.CustomFields) + return null + const instance = this.activeOutlet?.componentInstance + return instance instanceof CustomFieldsComponent ? instance : null + } + + get activeTabLabel(): string { + return this.activeSection?.label ?? '' + } + + get activeInfoLink(): string { + return this.activeSection?.infoLink ?? null + } + + get activeHeaderLoading(): boolean { + return ( + this.activeManagementList?.loading ?? + this.activeCustomFields?.loading ?? + false + ) + } + + ngOnInit(): void { + this.activatedRoute.paramMap + .pipe(takeUntil(this.unsubscribeNotifier)) + .subscribe((paramMap) => { + const section = paramMap.get('section') + const navIDFromSection = + this.getNavIDForSection(section) ?? this.getDefaultNavID() + + if (navIDFromSection == null) { + this.router.navigate(['/dashboard'], { replaceUrl: true }) + return + } + + if (this.activeNavID !== navIDFromSection) { + this.activeNavID = navIDFromSection + } + + if (!section || this.getNavIDForSection(section) == null) { + this.router.navigate( + ['attributes', this.getSectionForNavID(this.activeNavID)], + { replaceUrl: true } + ) + } + }) + } + + ngOnDestroy(): void { + this.unsubscribeNotifier.next() + this.unsubscribeNotifier.complete() + } + + ngAfterViewChecked(): void { + const current = this.activeHeaderLoading + if (this.lastHeaderLoading !== current) { + this.lastHeaderLoading = current + this.cdr.detectChanges() + } + } + + onNavChange(navChangeEvent: NgbNavChangeEvent): void { + const nextSection = this.getSectionForNavID(navChangeEvent.nextId) + if (!nextSection) { + return + } + this.router.navigate(['attributes', nextSection]) + } + + private getDefaultNavID(): DocumentAttributesNavIDs | null { + return this.visibleSections[0]?.id ?? null + } + + private getNavIDForSection(section: string): DocumentAttributesNavIDs | null { + const path = section?.toLowerCase() + if (!path) return null + + const found = this.visibleSections.find((s) => s.path === path) + return found?.id ?? null + } + + private getSectionForNavID(navID: number): string | null { + const section = this.visibleSections.find((s) => s.id === navID) + return section?.path ?? null + } +} diff --git a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.spec.ts similarity index 97% rename from src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.spec.ts index 98071cb90e..35f04fd8a4 100644 --- a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.spec.ts @@ -9,7 +9,7 @@ import { of } from 'rxjs' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' import { CorrespondentService } from 'src/app/services/rest/correspondent.service' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { PageHeaderComponent } from '../../../../common/page-header/page-header.component' import { CorrespondentListComponent } from './correspondent-list.component' describe('CorrespondentListComponent', () => { diff --git a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts similarity index 79% rename from src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts index 0131ac9925..8f12aaf7a0 100644 --- a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/correspondent-list/correspondent-list.component.ts @@ -1,11 +1,13 @@ -import { NgClass, NgTemplateOutlet, TitleCasePipe } from '@angular/common' +import { NgClass, NgTemplateOutlet } from '@angular/common' import { Component, inject } from '@angular/core' import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' import { NgbDropdownModule, NgbPaginationModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { CorrespondentEditDialogComponent } from 'src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' import { Correspondent } from 'src/app/data/correspondent' import { FILTER_HAS_CORRESPONDENT_ANY } from 'src/app/data/filter-rule-type' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' @@ -13,22 +15,19 @@ import { SortableDirective } from 'src/app/directives/sortable.directive' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { PermissionType } from 'src/app/services/permissions.service' import { CorrespondentService } from 'src/app/services/rest/correspondent.service' -import { CorrespondentEditDialogComponent } from '../../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { ManagementListComponent } from '../management-list/management-list.component' +import { ManagementListComponent } from '../management-list.component' @Component({ selector: 'pngx-correspondent-list', - templateUrl: './../management-list/management-list.component.html', - styleUrls: ['./../management-list/management-list.component.scss'], + templateUrl: './../management-list.component.html', + styleUrls: ['./../management-list.component.scss'], providers: [{ provide: CustomDatePipe }], imports: [ SortableDirective, IfPermissionsDirective, - PageHeaderComponent, - TitleCasePipe, FormsModule, ReactiveFormsModule, + RouterModule, NgClass, NgTemplateOutlet, NgbDropdownModule, @@ -37,7 +36,7 @@ import { ManagementListComponent } from '../management-list/management-list.comp ], }) export class CorrespondentListComponent extends ManagementListComponent { - private datePipe = inject(CustomDatePipe) + private readonly datePipe = inject(CustomDatePipe) constructor() { super() diff --git a/src-ui/src/app/components/manage/document-type-list/document-type-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.spec.ts similarity index 96% rename from src-ui/src/app/components/manage/document-type-list/document-type-list.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.spec.ts index 640d6aab8d..c8931cdc2e 100644 --- a/src-ui/src/app/components/manage/document-type-list/document-type-list.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.spec.ts @@ -9,7 +9,7 @@ import { of } from 'rxjs' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { PageHeaderComponent } from '../../../../common/page-header/page-header.component' import { DocumentTypeListComponent } from './document-type-list.component' describe('DocumentTypeListComponent', () => { diff --git a/src-ui/src/app/components/manage/document-type-list/document-type-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts similarity index 73% rename from src-ui/src/app/components/manage/document-type-list/document-type-list.component.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts index 21a4779e9a..cafe038d20 100644 --- a/src-ui/src/app/components/manage/document-type-list/document-type-list.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/document-type-list/document-type-list.component.ts @@ -1,32 +1,31 @@ -import { NgClass, NgTemplateOutlet, TitleCasePipe } from '@angular/common' +import { NgClass, NgTemplateOutlet } from '@angular/common' import { Component, inject } from '@angular/core' import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' import { NgbDropdownModule, NgbPaginationModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { DocumentTypeEditDialogComponent } from 'src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component' import { DocumentType } from 'src/app/data/document-type' import { FILTER_HAS_DOCUMENT_TYPE_ANY } from 'src/app/data/filter-rule-type' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' import { PermissionType } from 'src/app/services/permissions.service' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' -import { DocumentTypeEditDialogComponent } from '../../common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { ManagementListComponent } from '../management-list/management-list.component' +import { ManagementListComponent } from '../management-list.component' @Component({ selector: 'pngx-document-type-list', - templateUrl: './../management-list/management-list.component.html', - styleUrls: ['./../management-list/management-list.component.scss'], + templateUrl: './../management-list.component.html', + styleUrls: ['./../management-list.component.scss'], imports: [ SortableDirective, - PageHeaderComponent, - TitleCasePipe, IfPermissionsDirective, FormsModule, ReactiveFormsModule, + RouterModule, NgClass, NgTemplateOutlet, NgbDropdownModule, diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.html b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html similarity index 52% rename from src-ui/src/app/components/manage/management-list/management-list.component.html rename to src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html index 23e518f316..14a847ae63 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.html +++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html @@ -1,51 +1,51 @@ - - - - - - - -
      -
      +
      - +
      +
      +
      + Show: +
      +
      + + per page +
      + +
      +
      +
      - - - - + + + @for (column of extraColumns; track column) { - + } - + - @if (loading) { + @if (loading && data.length === 0) {
      +
      - +
      NameMatchingDocument countNameMatchingDocument count{{column.name}}{{column.name}}ActionsActions
      @@ -60,18 +60,18 @@
      -@if (!loading) { +@if (!loading || data.length > 0) {
      - @if (collectionSize > 0) { + @if (displayCollectionSize > 0) {
      - {collectionSize, plural, =1 {One {{typeName}}} other {{{collectionSize || 0}} total {{typeNamePlural}}}} + {displayCollectionSize, plural, =1 {One {{typeName}}} other {{{displayCollectionSize || 0}} total {{typeNamePlural}}}} @if (selectedObjects.size > 0) {  ({{selectedObjects.size}} selected) }
      } @if (collectionSize > 20) { - + }
      } @@ -84,18 +84,24 @@
      - + @if (depth > 0) {
      } - {{ getMatching(object) }} - {{ getDocumentCount(object) }} + {{ getMatching(object) }} + {{ getDocumentCount(object) }} @for (column of extraColumns; track column) { - - @if (column.rendersHtml) { -
      + + @if (column.badgeFn) { + + {{ column.badgeFn.call(null, object)?.text }} + } @else if (column.monospace) { {{ column.valueFn.call(null, object) }} } @else { @@ -103,7 +109,7 @@ } } - +
      @@ -114,24 +120,37 @@ @if (getDocumentCount(object) > 0) { - + Filter Documents ({{ getDocumentCount(object) }}) }
      @if (getDocumentCount(object) > 0) {
      - + + Documents{{ getDocumentCount(object) }} +
      }
      diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.scss b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.scss similarity index 89% rename from src-ui/src/app/components/manage/management-list/management-list.component.scss rename to src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.scss index de99b6584e..52f8d58125 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.scss +++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.scss @@ -24,3 +24,7 @@ td.name-cell { margin-left: .5rem; } } + +select.small { + font-size: 0.875rem !important; // 14px +} diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts similarity index 66% rename from src-ui/src/app/components/manage/management-list/management-list.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts index 9c64f57309..437c6aa269 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts @@ -13,6 +13,7 @@ import { } from '@angular/core/testing' import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { By } from '@angular/platform-browser' +import { RouterLinkWithHref } from '@angular/router' import { RouterTestingModule } from '@angular/router/testing' import { NgbModal, @@ -30,10 +31,10 @@ import { MATCH_NONE, } from 'src/app/data/matching-model' import { Tag } from 'src/app/data/tag' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { DocumentListViewService } from 'src/app/services/document-list-view.service' import { PermissionAction, @@ -41,13 +42,14 @@ import { } from 'src/app/services/permissions.service' import { BulkEditObjectOperation } from 'src/app/services/rest/abstract-name-filter-service' import { TagService } from 'src/app/services/rest/tag.service' +import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' -import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' -import { EditDialogComponent } from '../../common/edit-dialog/edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { PermissionsDialogComponent } from '../../common/permissions-dialog/permissions-dialog.component' -import { TagListComponent } from '../tag-list/tag-list.component' +import { ConfirmDialogComponent } from '../../../common/confirm-dialog/confirm-dialog.component' +import { EditDialogComponent } from '../../../common/edit-dialog/edit-dialog.component' +import { PageHeaderComponent } from '../../../common/page-header/page-header.component' +import { PermissionsDialogComponent } from '../../../common/permissions-dialog/permissions-dialog.component' import { ManagementListComponent } from './management-list.component' +import { TagListComponent } from './tag-list/tag-list.component' const tags: Tag[] = [ { @@ -79,6 +81,7 @@ describe('ManagementListComponent', () => { let toastService: ToastService let documentListViewService: DocumentListViewService let permissionsService: PermissionsService + let settingsService: SettingsService beforeEach(async () => { TestBed.configureTestingModule({ @@ -93,7 +96,6 @@ describe('ManagementListComponent', () => { SortableDirective, PageHeaderComponent, IfPermissionsDirective, - SafeHtmlPipe, ConfirmDialogComponent, PermissionsDialogComponent, ], @@ -131,6 +133,7 @@ describe('ManagementListComponent', () => { modalService = TestBed.inject(NgbModal) toastService = TestBed.inject(ToastService) documentListViewService = TestBed.inject(DocumentListViewService) + settingsService = TestBed.inject(SettingsService) fixture = TestBed.createComponent(TagListComponent) component = fixture.componentInstance fixture.detectChanges() @@ -164,8 +167,7 @@ describe('ManagementListComponent', () => { const toastInfoSpy = jest.spyOn(toastService, 'showInfo') const reloadSpy = jest.spyOn(component, 'reloadData') - const createButton = fixture.debugElement.queryAll(By.css('button'))[4] - createButton.triggerEventHandler('click') + component.openCreateDialog() expect(modal).not.toBeUndefined() const editDialog = modal.componentInstance as EditDialogComponent @@ -188,8 +190,7 @@ describe('ManagementListComponent', () => { const toastInfoSpy = jest.spyOn(toastService, 'showInfo') const reloadSpy = jest.spyOn(component, 'reloadData') - const editButton = fixture.debugElement.queryAll(By.css('button'))[7] - editButton.triggerEventHandler('click') + component.openEditDialog(tags[0]) expect(modal).not.toBeUndefined() const editDialog = modal.componentInstance as EditDialogComponent @@ -213,8 +214,7 @@ describe('ManagementListComponent', () => { const deleteSpy = jest.spyOn(tagService, 'delete') const reloadSpy = jest.spyOn(component, 'reloadData') - const deleteButton = fixture.debugElement.queryAll(By.css('button'))[8] - deleteButton.triggerEventHandler('click') + component.openDeleteDialog(tags[0]) expect(modal).not.toBeUndefined() const editDialog = modal.componentInstance as ConfirmDialogComponent @@ -231,13 +231,32 @@ describe('ManagementListComponent', () => { expect(reloadSpy).toHaveBeenCalled() }) + it('should use API count for pagination and all ids for displayed total', fakeAsync(() => { + jest.spyOn(tagService, 'listFiltered').mockReturnValueOnce( + of({ + count: 1, + all: [1, 2, 3], + results: tags.slice(0, 1), + }) + ) + + component.reloadData() + tick(100) + + expect(component.collectionSize).toBe(1) + expect(component.displayCollectionSize).toBe(3) + })) + it('should support quick filter for objects', () => { - const qfSpy = jest.spyOn(documentListViewService, 'quickFilter') - const filterButton = fixture.debugElement.queryAll(By.css('button'))[9] - filterButton.triggerEventHandler('click') - expect(qfSpy).toHaveBeenCalledWith([ + const expectedUrl = documentListViewService.getQuickFilterUrl([ { rule_type: FILTER_HAS_TAGS_ALL, value: tags[0].id.toString() }, - ]) // subclasses set the filter rule type + ]) + const filterLink = fixture.debugElement.query( + By.css('a.btn-outline-secondary') + ) + expect(filterLink).toBeTruthy() + const routerLink = filterLink.injector.get(RouterLinkWithHref) + expect(routerLink.urlTree).toEqual(expectedUrl) }) it('should reload on sort', () => { @@ -262,19 +281,84 @@ describe('ManagementListComponent', () => { expect(component.page).toEqual(1) }) - it('should support toggle all items in view', () => { + it('should support toggle select page in vew', () => { expect(component.selectedObjects.size).toEqual(0) - const toggleAllSpy = jest.spyOn(component, 'toggleAll') + const selectPageSpy = jest.spyOn(component, 'selectPage') const checkButton = fixture.debugElement.queryAll( By.css('input.form-check-input') )[0] - checkButton.nativeElement.dispatchEvent(new Event('click')) + checkButton.nativeElement.dispatchEvent(new Event('change')) checkButton.nativeElement.checked = true - checkButton.nativeElement.dispatchEvent(new Event('click')) - expect(toggleAllSpy).toHaveBeenCalled() + checkButton.nativeElement.dispatchEvent(new Event('change')) + expect(selectPageSpy).toHaveBeenCalled() expect(component.selectedObjects.size).toEqual(tags.length) }) + it('selectNone should clear selection and reset toggle flag', () => { + component.selectedObjects = new Set([tags[0].id, tags[1].id]) + component.togggleAll = true + + component.selectNone() + + expect(component.selectedObjects.size).toBe(0) + expect(component.togggleAll).toBe(false) + }) + + it('selectPage should select current page items or clear selection', () => { + component.selectPage() + expect(component.selectedObjects).toEqual(new Set(tags.map((t) => t.id))) + expect(component.togggleAll).toBe(true) + + component.togggleAll = true + component.clearSelection() + expect(component.selectedObjects.size).toBe(0) + expect(component.togggleAll).toBe(false) + }) + + it('selectAll should use all IDs when collection size exists', () => { + ;(component as any).allIDs = [1, 2, 3, 4] + component.collectionSize = 4 + + component.selectAll() + + expect(component.selectedObjects).toEqual(new Set([1, 2, 3, 4])) + expect(component.togggleAll).toBe(true) + }) + + it('selectAll should clear selection when collection size is zero', () => { + component.selectedObjects = new Set([1]) + component.collectionSize = 0 + component.togggleAll = true + + component.selectAll() + + expect(component.selectedObjects.size).toBe(0) + expect(component.togggleAll).toBe(false) + }) + + it('toggleSelected should toggle object selection and update toggle state', () => { + component.toggleSelected(tags[0]) + expect(component.selectedObjects.has(tags[0].id)).toBe(true) + expect(component.togggleAll).toBe(false) + + component.toggleSelected(tags[1]) + component.toggleSelected(tags[2]) + expect(component.togggleAll).toBe(true) + + component.toggleSelected(tags[1]) + expect(component.selectedObjects.has(tags[1].id)).toBe(false) + expect(component.togggleAll).toBe(false) + }) + + it('areAllPageItemsSelected should return false when page has no selectable items', () => { + component.data = [] + component.selectedObjects.clear() + + expect((component as any).areAllPageItemsSelected()).toBe(false) + + component.data = tags + }) + it('should support bulk edit permissions', () => { const bulkEditPermsSpy = jest.spyOn(tagService, 'bulk_edit_objects') component.toggleSelected(tags[0]) @@ -368,4 +452,66 @@ describe('ManagementListComponent', () => { ).getSelectableIDs.call({}, [{ id: 1 }, { id: 5 }] as any) expect(ids).toEqual([1, 5]) }) + + it('pageSize getter should return stored page size or default to 25', () => { + jest.spyOn(settingsService, 'get').mockReturnValue({ tags: 50 }) + component.typeNamePlural = 'tags' + + expect(component.pageSize).toBe(50) + }) + + it('pageSize getter should return 25 when no size is stored', () => { + const settingsService = TestBed.inject(SettingsService) + jest.spyOn(settingsService, 'get').mockReturnValue({}) + component.typeNamePlural = 'tags' + + expect(component.pageSize).toBe(25) + }) + + it('pageSize setter should update settings, reset page and reload data on success', fakeAsync(() => { + const reloadSpy = jest.spyOn(component, 'reloadData') + const toastErrorSpy = jest.spyOn(toastService, 'showError') + + jest.spyOn(settingsService, 'get').mockReturnValue({ tags: 25 }) + jest.spyOn(settingsService, 'set').mockImplementation(() => {}) + jest + .spyOn(settingsService, 'storeSettings') + .mockReturnValue(of({ success: true })) + + component.typeNamePlural = 'tags' + component.page = 2 + component.pageSize = 100 + + tick() + + expect(settingsService.set).toHaveBeenCalledWith( + SETTINGS_KEYS.OBJECT_LIST_SIZES, + { tags: 100 } + ) + expect(component.page).toBe(1) + expect(reloadSpy).toHaveBeenCalled() + expect(toastErrorSpy).not.toHaveBeenCalled() + })) + + it('pageSize setter should show error toast on settings store failure', fakeAsync(() => { + const reloadSpy = jest.spyOn(component, 'reloadData') + const toastErrorSpy = jest.spyOn(toastService, 'showError') + + jest.spyOn(settingsService, 'get').mockReturnValue({ tags: 25 }) + jest.spyOn(settingsService, 'set').mockImplementation(() => {}) + jest + .spyOn(settingsService, 'storeSettings') + .mockReturnValue(throwError(() => new Error('error storing settings'))) + + component.typeNamePlural = 'tags' + component.pageSize = 50 + + tick() + + expect(toastErrorSpy).toHaveBeenCalledWith( + 'Error saving settings', + expect.any(Error) + ) + expect(reloadSpy).not.toHaveBeenCalled() + })) }) diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts similarity index 75% rename from src-ui/src/app/components/manage/management-list/management-list.component.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts index 7cc3eaf4b7..3738f491c6 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts @@ -16,6 +16,10 @@ import { takeUntil, tap, } from 'rxjs/operators' +import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component' +import { EditDialogMode } from 'src/app/components/common/edit-dialog/edit-dialog.component' +import { PermissionsDialogComponent } from 'src/app/components/common/permissions-dialog/permissions-dialog.component' +import { LoadingComponentWithPermissions } from 'src/app/components/loading-component/loading.component' import { MATCH_AUTO, MATCH_NONE, @@ -23,6 +27,8 @@ import { MatchingModel, } from 'src/app/data/matching-model' import { ObjectWithPermissions } from 'src/app/data/object-with-permissions' +import { Results } from 'src/app/data/results' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SortableDirective, SortEvent, @@ -37,20 +43,21 @@ import { AbstractNameFilterService, BulkEditObjectOperation, } from 'src/app/services/rest/abstract-name-filter-service' +import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' -import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' -import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component' -import { PermissionsDialogComponent } from '../../common/permissions-dialog/permissions-dialog.component' -import { LoadingComponentWithPermissions } from '../../loading-component/loading.component' export interface ManagementListColumn { key: string name: string - valueFn: any + valueFn?: any - rendersHtml?: boolean + badgeFn?: (object: any) => { + text: string + textColor?: string + backgroundColor?: string + } hideOnMobile?: boolean @@ -63,27 +70,32 @@ export abstract class ManagementListComponent implements OnInit, OnDestroy { protected service: AbstractNameFilterService - private modalService: NgbModal = inject(NgbModal) + private readonly modalService: NgbModal = inject(NgbModal) protected editDialogComponent: any - private toastService: ToastService = inject(ToastService) - private documentListViewService: DocumentListViewService = inject( + private readonly toastService: ToastService = inject(ToastService) + private readonly documentListViewService: DocumentListViewService = inject( DocumentListViewService ) - private permissionsService: PermissionsService = inject(PermissionsService) + private readonly permissionsService: PermissionsService = + inject(PermissionsService) protected filterRuleType: number public typeName: string public typeNamePlural: string public permissionType: PermissionType public extraColumns: ManagementListColumn[] + private readonly settingsService = inject(SettingsService) + @ViewChildren(SortableDirective) headers: QueryList public data: T[] = [] private unfilteredData: T[] = [] + private allIDs: number[] = [] public page = 1 public collectionSize = 0 + public displayCollectionSize = 0 public sortField: string public sortReverse: boolean @@ -137,6 +149,14 @@ export abstract class ManagementListComponent return data } + protected getCollectionSize(results: Results): number { + return results.all?.length ?? results.count + } + + protected getDisplayCollectionSize(results: Results): number { + return this.getCollectionSize(results) + } + getDocumentCount(object: MatchingModel): number { return ( object.document_count ?? @@ -155,7 +175,7 @@ export abstract class ManagementListComponent this.service .listFiltered( this.page, - null, + this.pageSize, this.sortField, this.sortReverse, this._nameFilter, @@ -167,7 +187,9 @@ export abstract class ManagementListComponent tap((c) => { this.unfilteredData = c.results this.data = this.filterData(c.results) - this.collectionSize = c.count + this.collectionSize = this.getCollectionSize(c) + this.displayCollectionSize = this.getDisplayCollectionSize(c) + this.allIDs = c.all }), delay(100) ) @@ -186,7 +208,7 @@ export abstract class ManagementListComponent } openCreateDialog() { - var activeModal = this.modalService.open(this.editDialogComponent, { + const activeModal = this.modalService.open(this.editDialogComponent, { backdrop: 'static', }) activeModal.componentInstance.dialogMode = EditDialogMode.CREATE @@ -205,7 +227,7 @@ export abstract class ManagementListComponent } openEditDialog(object: T) { - var activeModal = this.modalService.open(this.editDialogComponent, { + const activeModal = this.modalService.open(this.editDialogComponent, { backdrop: 'static', }) activeModal.componentInstance.object = object @@ -226,14 +248,14 @@ export abstract class ManagementListComponent abstract getDeleteMessage(object: T) - filterDocuments(object: MatchingModel) { - this.documentListViewService.quickFilter([ + getDocumentFilterUrl(object: MatchingModel) { + return this.documentListViewService.getQuickFilterUrl([ { rule_type: this.filterRuleType, value: object.id.toString() }, ]) } openDeleteDialog(object: T) { - var activeModal = this.modalService.open(ConfirmDialogComponent, { + const activeModal = this.modalService.open(ConfirmDialogComponent, { backdrop: 'static', }) activeModal.componentInstance.title = $localize`Confirm delete` @@ -274,6 +296,30 @@ export abstract class ManagementListComponent if (event.code == 'Escape') this.nameFilterDebounce.next(null) } + public get pageSize(): number { + return ( + this.settingsService.get(SETTINGS_KEYS.OBJECT_LIST_SIZES)[ + this.typeNamePlural + ] || 25 + ) + } + + public set pageSize(newPageSize: number) { + this.settingsService.set(SETTINGS_KEYS.OBJECT_LIST_SIZES, { + ...this.settingsService.get(SETTINGS_KEYS.OBJECT_LIST_SIZES), + [this.typeNamePlural]: newPageSize, + }) + this.settingsService.storeSettings().subscribe({ + next: () => { + this.page = 1 + this.reloadData() + }, + error: (error) => { + this.toastService.showError($localize`Error saving settings`, error) + }, + }) + } + userCanDelete(object: ObjectWithPermissions): boolean { return this.permissionsService.currentUserOwnsObject(object) } @@ -296,16 +342,6 @@ export abstract class ManagementListComponent return ownsAll } - toggleAll(event: PointerEvent) { - const checked = (event.target as HTMLInputElement).checked - this.togggleAll = checked - if (checked) { - this.selectedObjects = new Set(this.getSelectableIDs(this.data)) - } else { - this.clearSelection() - } - } - protected getSelectableIDs(objects: T[]): number[] { return objects.map((o) => o.id) } @@ -315,10 +351,34 @@ export abstract class ManagementListComponent this.selectedObjects.clear() } + selectNone() { + this.clearSelection() + } + + selectPage() { + this.selectedObjects = new Set(this.getSelectableIDs(this.data)) + this.togggleAll = this.areAllPageItemsSelected() + } + + selectAll() { + if (!this.collectionSize) { + this.clearSelection() + return + } + this.selectedObjects = new Set(this.allIDs) + this.togggleAll = this.areAllPageItemsSelected() + } + toggleSelected(object) { this.selectedObjects.has(object.id) ? this.selectedObjects.delete(object.id) : this.selectedObjects.add(object.id) + this.togggleAll = this.areAllPageItemsSelected() + } + + protected areAllPageItemsSelected(): boolean { + const ids = this.getSelectableIDs(this.data) + return ids.length > 0 && ids.every((id) => this.selectedObjects.has(id)) } setPermissions() { @@ -360,7 +420,7 @@ export abstract class ManagementListComponent backdrop: 'static', }) modal.componentInstance.title = $localize`Confirm delete` - modal.componentInstance.messageBold = $localize`This operation will permanently delete all objects.` + modal.componentInstance.messageBold = $localize`This operation will permanently delete the selected ${this.typeNamePlural}.` modal.componentInstance.message = $localize`This operation cannot be undone.` modal.componentInstance.btnClass = 'btn-danger' modal.componentInstance.btnCaption = $localize`Proceed` diff --git a/src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.spec.ts similarity index 94% rename from src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.spec.ts index 22060bc61e..d2b75ca56a 100644 --- a/src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.spec.ts @@ -9,9 +9,8 @@ import { of } from 'rxjs' import { StoragePath } from 'src/app/data/storage-path' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { StoragePathService } from 'src/app/services/rest/storage-path.service' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { PageHeaderComponent } from '../../../../common/page-header/page-header.component' import { StoragePathListComponent } from './storage-path-list.component' describe('StoragePathListComponent', () => { @@ -30,7 +29,6 @@ describe('StoragePathListComponent', () => { SortableDirective, PageHeaderComponent, IfPermissionsDirective, - SafeHtmlPipe, ], providers: [ DatePipe, diff --git a/src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts similarity index 74% rename from src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts index 346d956e8d..14129544e9 100644 --- a/src-ui/src/app/components/manage/storage-path-list/storage-path-list.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/storage-path-list/storage-path-list.component.ts @@ -1,34 +1,31 @@ -import { NgClass, NgTemplateOutlet, TitleCasePipe } from '@angular/common' +import { NgClass, NgTemplateOutlet } from '@angular/common' import { Component, inject } from '@angular/core' import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' import { NgbDropdownModule, NgbPaginationModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { StoragePathEditDialogComponent } from 'src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component' import { FILTER_HAS_STORAGE_PATH_ANY } from 'src/app/data/filter-rule-type' import { StoragePath } from 'src/app/data/storage-path' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { PermissionType } from 'src/app/services/permissions.service' import { StoragePathService } from 'src/app/services/rest/storage-path.service' -import { StoragePathEditDialogComponent } from '../../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { ManagementListComponent } from '../management-list/management-list.component' +import { ManagementListComponent } from '../management-list.component' @Component({ selector: 'pngx-storage-path-list', - templateUrl: './../management-list/management-list.component.html', - styleUrls: ['./../management-list/management-list.component.scss'], + templateUrl: './../management-list.component.html', + styleUrls: ['./../management-list.component.scss'], imports: [ SortableDirective, - PageHeaderComponent, - TitleCasePipe, IfPermissionsDirective, - SafeHtmlPipe, FormsModule, ReactiveFormsModule, + RouterModule, NgClass, NgTemplateOutlet, NgbDropdownModule, diff --git a/src-ui/src/app/components/manage/tag-list/tag-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.spec.ts similarity index 90% rename from src-ui/src/app/components/manage/tag-list/tag-list.component.spec.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.spec.ts index 0db84182b2..526da6c9ef 100644 --- a/src-ui/src/app/components/manage/tag-list/tag-list.component.spec.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.spec.ts @@ -8,9 +8,8 @@ import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { of } from 'rxjs' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { TagService } from 'src/app/services/rest/tag.service' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' +import { PageHeaderComponent } from '../../../../common/page-header/page-header.component' import { TagListComponent } from './tag-list.component' describe('TagListComponent', () => { @@ -30,7 +29,6 @@ describe('TagListComponent', () => { SortableDirective, PageHeaderComponent, IfPermissionsDirective, - SafeHtmlPipe, ], providers: [ DatePipe, @@ -103,7 +101,7 @@ describe('TagListComponent', () => { it('should request only parent tags when no name filter is applied', () => { expect(tagService.listFiltered).toHaveBeenCalledWith( 1, - null, + 25, undefined, undefined, undefined, @@ -118,7 +116,7 @@ describe('TagListComponent', () => { component.reloadData() expect(tagService.listFiltered).toHaveBeenCalledWith( 1, - null, + 25, undefined, undefined, 'Tag', @@ -140,16 +138,12 @@ describe('TagListComponent', () => { } component.data = [parent as any] - const selectEvent = { target: { checked: true } } as unknown as PointerEvent - component.toggleAll(selectEvent) + component.selectPage() expect(component.selectedObjects.has(10)).toBe(true) expect(component.selectedObjects.has(11)).toBe(true) - const deselectEvent = { - target: { checked: false }, - } as unknown as PointerEvent - component.toggleAll(deselectEvent) + component.clearSelection() expect(component.selectedObjects.size).toBe(0) }) }) diff --git a/src-ui/src/app/components/manage/tag-list/tag-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts similarity index 70% rename from src-ui/src/app/components/manage/tag-list/tag-list.component.ts rename to src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts index 64ca121dfc..0bbc638a3e 100644 --- a/src-ui/src/app/components/manage/tag-list/tag-list.component.ts +++ b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts @@ -1,34 +1,32 @@ -import { NgClass, NgTemplateOutlet, TitleCasePipe } from '@angular/common' +import { NgClass, NgTemplateOutlet } from '@angular/common' import { Component, inject } from '@angular/core' import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { RouterModule } from '@angular/router' import { NgbDropdownModule, NgbPaginationModule, } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { TagEditDialogComponent } from 'src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component' import { FILTER_HAS_TAGS_ALL } from 'src/app/data/filter-rule-type' +import { Results } from 'src/app/data/results' import { Tag } from 'src/app/data/tag' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { SortableDirective } from 'src/app/directives/sortable.directive' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { PermissionType } from 'src/app/services/permissions.service' import { TagService } from 'src/app/services/rest/tag.service' -import { TagEditDialogComponent } from '../../common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component' -import { PageHeaderComponent } from '../../common/page-header/page-header.component' -import { ManagementListComponent } from '../management-list/management-list.component' +import { ManagementListComponent } from '../management-list.component' @Component({ selector: 'pngx-tag-list', - templateUrl: './../management-list/management-list.component.html', - styleUrls: ['./../management-list/management-list.component.scss'], + templateUrl: './../management-list.component.html', + styleUrls: ['./../management-list.component.scss'], imports: [ SortableDirective, - PageHeaderComponent, - TitleCasePipe, IfPermissionsDirective, - SafeHtmlPipe, FormsModule, ReactiveFormsModule, + RouterModule, NgClass, NgTemplateOutlet, NgbDropdownModule, @@ -49,10 +47,11 @@ export class TagListComponent extends ManagementListComponent { { key: 'color', name: $localize`Color`, - rendersHtml: true, - valueFn: (t: Tag) => { - return `${t.color}` - }, + badgeFn: (t: Tag) => ({ + text: t.color, + textColor: t.text_color, + backgroundColor: t.color, + }), }, ] } @@ -78,6 +77,16 @@ export class TagListComponent extends ManagementListComponent { return data.filter((tag) => !tag.parent || !availableIds.has(tag.parent)) } + protected override getCollectionSize(results: Results): number { + // Tag list pages are requested with is_root=true (when unfiltered), so + // pagination must follow root count even though `all` includes descendants + return results.count + } + + protected override getDisplayCollectionSize(results: Results): number { + return super.getCollectionSize(results) + } + protected override getSelectableIDs(tags: Tag[]): number[] { const ids: number[] = [] for (const tag of tags.filter(Boolean)) { diff --git a/src-ui/src/app/components/manage/mail/mail.component.html b/src-ui/src/app/components/manage/mail/mail.component.html index 8b9678353e..204bc9e1cd 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.html +++ b/src-ui/src/app/components/manage/mail/mail.component.html @@ -11,16 +11,16 @@

      Mail accounts @if (gmailOAuthUrl) { -  Connect Gmail Account + Connect Gmail Account } @if (outlookOAuthUrl) { -  Connect Outlook Account + Connect Outlook Account }

      @@ -72,18 +72,18 @@

      @@ -102,7 +102,7 @@

      Mail rules

        @@ -129,7 +129,7 @@

        {{rule.order}}
        -
        {{(mailAccountService.getCached(rule.account) | async)?.name}}
        +
        {{ mailAccountsById.get(rule.account)?.name }}
        @@ -140,7 +140,7 @@

        @@ -160,18 +160,18 @@

        diff --git a/src-ui/src/app/components/manage/mail/mail.component.spec.ts b/src-ui/src/app/components/manage/mail/mail.component.spec.ts index 38293aca9c..c866160d4e 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.spec.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.spec.ts @@ -23,7 +23,6 @@ import { IfOwnerDirective } from 'src/app/directives/if-owner.directive' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' -import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { PermissionsService } from 'src/app/services/permissions.service' import { MailAccountService } from 'src/app/services/rest/mail-account.service' import { MailRuleService } from 'src/app/services/rest/mail-rule.service' @@ -84,7 +83,6 @@ describe('MailComponent', () => { CustomDatePipe, ConfirmDialogComponent, CheckComponent, - SafeHtmlPipe, SelectComponent, TextComponent, PasswordComponent, diff --git a/src-ui/src/app/components/manage/mail/mail.component.ts b/src-ui/src/app/components/manage/mail/mail.component.ts index 825ca1ffdc..bc119f5258 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.ts @@ -1,4 +1,3 @@ -import { AsyncPipe } from '@angular/common' import { Component, OnDestroy, OnInit, inject } from '@angular/core' import { FormsModule, ReactiveFormsModule } from '@angular/forms' import { ActivatedRoute } from '@angular/router' @@ -37,7 +36,6 @@ import { ProcessedMailDialogComponent } from './processed-mail-dialog/processed- PageHeaderComponent, IfPermissionsDirective, IfOwnerDirective, - AsyncPipe, FormsModule, ReactiveFormsModule, NgbDropdownModule, @@ -48,8 +46,8 @@ export class MailComponent extends ComponentWithPermissions implements OnInit, OnDestroy { - mailAccountService = inject(MailAccountService) - mailRuleService = inject(MailRuleService) + private readonly mailAccountService = inject(MailAccountService) + private readonly mailRuleService = inject(MailRuleService) private toastService = inject(ToastService) private modalService = inject(NgbModal) permissionsService = inject(PermissionsService) @@ -58,8 +56,19 @@ export class MailComponent public MailAccountType = MailAccountType - mailAccounts: MailAccount[] = [] - mailRules: MailRule[] = [] + private _mailAccounts: MailAccount[] = [] + + public get mailAccounts() { + return this._mailAccounts + } + private set mailAccounts(accounts: MailAccount[]) { + this._mailAccounts = accounts + this.mailAccountsById = new Map( + accounts.map((account) => [account.id, account]) + ) + } + public mailAccountsById: Map = new Map() + public mailRules: MailRule[] = [] unsubscribeNotifier: Subject = new Subject() oAuthAccountId: number diff --git a/src-ui/src/app/components/manage/saved-views/saved-views.component.html b/src-ui/src/app/components/manage/saved-views/saved-views.component.html index 10487fec80..1c14b68329 100644 --- a/src-ui/src/app/components/manage/saved-views/saved-views.component.html +++ b/src-ui/src/app/components/manage/saved-views/saved-views.component.html @@ -25,15 +25,23 @@

        - - - + @if (canDeleteSavedView(view)) { + + + + + }
        @@ -51,6 +59,7 @@ @if (displayFields) { } + Note: ordering is not preserved

      diff --git a/src-ui/src/app/components/manage/saved-views/saved-views.component.spec.ts b/src-ui/src/app/components/manage/saved-views/saved-views.component.spec.ts index 10bc5db8ed..de6c88f9ab 100644 --- a/src-ui/src/app/components/manage/saved-views/saved-views.component.spec.ts +++ b/src-ui/src/app/components/manage/saved-views/saved-views.component.spec.ts @@ -3,16 +3,16 @@ import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' import { provideHttpClientTesting } from '@angular/common/http/testing' import { ComponentFixture, TestBed } from '@angular/core/testing' import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { By } from '@angular/platform-browser' -import { NgbModule } from '@ng-bootstrap/ng-bootstrap' +import { NgbModal, NgbModule } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' -import { of, throwError } from 'rxjs' +import { Subject, of, throwError } from 'rxjs' import { SavedView } from 'src/app/data/saved-view' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { PermissionsService } from 'src/app/services/permissions.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' +import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' import { ConfirmButtonComponent } from '../../common/confirm-button/confirm-button.component' import { CheckComponent } from '../../common/input/check/check.component' @@ -32,7 +32,9 @@ describe('SavedViewsComponent', () => { let component: SavedViewsComponent let fixture: ComponentFixture let savedViewService: SavedViewService + let settingsService: SettingsService let toastService: ToastService + let modalService: NgbModal beforeEach(async () => { TestBed.configureTestingModule({ @@ -57,6 +59,8 @@ describe('SavedViewsComponent', () => { provide: PermissionsService, useValue: { currentUserCan: () => true, + currentUserHasObjectPermissions: () => true, + currentUserOwnsObject: () => true, }, }, { @@ -77,11 +81,13 @@ describe('SavedViewsComponent', () => { }).compileComponents() savedViewService = TestBed.inject(SavedViewService) + settingsService = TestBed.inject(SettingsService) toastService = TestBed.inject(ToastService) + modalService = TestBed.inject(NgbModal) fixture = TestBed.createComponent(SavedViewsComponent) component = fixture.componentInstance - jest.spyOn(savedViewService, 'listAll').mockReturnValue( + jest.spyOn(savedViewService, 'list').mockReturnValue( of({ all: savedViews.map((v) => v.id), count: savedViews.length, @@ -94,14 +100,13 @@ describe('SavedViewsComponent', () => { it('should support save saved views, show error', () => { const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastSpy = jest.spyOn(toastService, 'show') const savedViewPatchSpy = jest.spyOn(savedViewService, 'patchMany') - - const toggle = fixture.debugElement.query( - By.css('.form-check.form-switch input') - ) - toggle.nativeElement.checked = true - toggle.nativeElement.dispatchEvent(new Event('change')) + const control = component.savedViewsForm + .get('savedViews') + .get(savedViews[0].id.toString()) + .get('name') + control.setValue(`${savedViews[0].name}-changed`) + control.markAsDirty() // saved views error first savedViewPatchSpy.mockReturnValueOnce( @@ -110,12 +115,13 @@ describe('SavedViewsComponent', () => { component.save() expect(toastErrorSpy).toHaveBeenCalled() expect(savedViewPatchSpy).toHaveBeenCalled() - toastSpy.mockClear() toastErrorSpy.mockClear() savedViewPatchSpy.mockClear() // succeed saved views savedViewPatchSpy.mockReturnValueOnce(of(savedViews as SavedView[])) + control.setValue(savedViews[0].name) + control.markAsDirty() component.save() expect(toastErrorSpy).not.toHaveBeenCalled() expect(savedViewPatchSpy).toHaveBeenCalled() @@ -127,26 +133,65 @@ describe('SavedViewsComponent', () => { expect(patchSpy).not.toHaveBeenCalled() const view = savedViews[0] - const toggle = fixture.debugElement.query( - By.css('.form-check.form-switch input') - ) - toggle.nativeElement.checked = true - toggle.nativeElement.dispatchEvent(new Event('change')) - // register change - component.savedViewsForm.get('savedViews').get(view.id.toString()).value[ - 'show_on_dashboard' - ] = !view.show_on_dashboard + component.savedViewsForm + .get('savedViews') + .get(view.id.toString()) + .get('name') + .setValue('changed-view-name') + component.savedViewsForm + .get('savedViews') + .get(view.id.toString()) + .get('name') + .markAsDirty() fixture.detectChanges() component.save() - expect(patchSpy).toHaveBeenCalledWith([ - { - id: view.id, - name: view.name, - show_in_sidebar: view.show_in_sidebar, - show_on_dashboard: !view.show_on_dashboard, - }, - ]) + expect(patchSpy).toHaveBeenCalled() + const patchBody = patchSpy.mock.calls[0][0][0] + expect(patchBody).toMatchObject({ + id: view.id, + name: 'changed-view-name', + }) + expect(patchBody.show_on_dashboard).toBeUndefined() + expect(patchBody.show_in_sidebar).toBeUndefined() + }) + + it('should persist visibility changes to user settings', () => { + const patchSpy = jest.spyOn(savedViewService, 'patchMany') + const updateVisibilitySpy = jest + .spyOn(settingsService, 'updateSavedViewsVisibility') + .mockReturnValue(of({ success: true })) + + const dashboardControl = component.savedViewsForm + .get('savedViews') + .get(savedViews[0].id.toString()) + .get('show_on_dashboard') + dashboardControl.setValue(false) + dashboardControl.markAsDirty() + + component.save() + + expect(patchSpy).not.toHaveBeenCalled() + expect(updateVisibilitySpy).toHaveBeenCalledWith([], [savedViews[0].id]) + }) + + it('should skip model updates for views that cannot be edited', () => { + const patchSpy = jest.spyOn(savedViewService, 'patchMany') + const updateVisibilitySpy = jest.spyOn( + settingsService, + 'updateSavedViewsVisibility' + ) + const nameControl = component.savedViewsForm + .get('savedViews') + .get(savedViews[0].id.toString()) + .get('name') + + nameControl.disable() + + component.save() + + expect(patchSpy).not.toHaveBeenCalled() + expect(updateVisibilitySpy).not.toHaveBeenCalled() }) it('should support delete saved view', () => { @@ -162,14 +207,55 @@ describe('SavedViewsComponent', () => { it('should support reset', () => { const view = savedViews[0] - component.savedViewsForm.get('savedViews').get(view.id.toString()).value[ - 'show_on_dashboard' - ] = !view.show_on_dashboard + component.savedViewsForm + .get('savedViews') + .get(view.id.toString()) + .get('show_on_dashboard') + .setValue(!view.show_on_dashboard) component.reset() expect( - component.savedViewsForm.get('savedViews').get(view.id.toString()).value[ - 'show_on_dashboard' - ] + component.savedViewsForm + .get('savedViews') + .get(view.id.toString()) + .get('show_on_dashboard').value ).toEqual(view.show_on_dashboard) }) + + it('should support editing permissions', () => { + const confirmClicked = new Subject() + const modalRef = { + componentInstance: { + confirmClicked, + buttonsEnabled: true, + }, + close: jest.fn(), + } as any + jest.spyOn(modalService, 'open').mockReturnValue(modalRef) + const patchSpy = jest.spyOn(savedViewService, 'patch') + patchSpy.mockReturnValue(of(savedViews[0] as SavedView)) + + component.editPermissions(savedViews[0] as SavedView) + confirmClicked.next({ + permissions: { + owner: 1, + set_permissions: { + view: { users: [2], groups: [] }, + change: { users: [], groups: [3] }, + }, + }, + merge: true, + }) + + expect(patchSpy).toHaveBeenCalledWith( + expect.objectContaining({ + id: savedViews[0].id, + owner: 1, + set_permissions: { + view: { users: [2], groups: [] }, + change: { users: [], groups: [3] }, + }, + }) + ) + expect(modalRef.close).toHaveBeenCalled() + }) }) diff --git a/src-ui/src/app/components/manage/saved-views/saved-views.component.ts b/src-ui/src/app/components/manage/saved-views/saved-views.component.ts index 015f9b486b..9a0f11ea71 100644 --- a/src-ui/src/app/components/manage/saved-views/saved-views.component.ts +++ b/src-ui/src/app/components/manage/saved-views/saved-views.component.ts @@ -6,11 +6,18 @@ import { FormsModule, ReactiveFormsModule, } from '@angular/forms' +import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { dirtyCheck } from '@ngneat/dirty-check-forms' -import { BehaviorSubject, Observable, takeUntil } from 'rxjs' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { BehaviorSubject, Observable, of, switchMap, takeUntil } from 'rxjs' +import { PermissionsDialogComponent } from 'src/app/components/common/permissions-dialog/permissions-dialog.component' import { DisplayMode } from 'src/app/data/document' import { SavedView } from 'src/app/data/saved-view' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' +import { + PermissionAction, + PermissionsService, +} from 'src/app/services/permissions.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' @@ -34,15 +41,18 @@ import { LoadingComponentWithPermissions } from '../../loading-component/loading FormsModule, ReactiveFormsModule, AsyncPipe, + NgxBootstrapIconsModule, ], }) export class SavedViewsComponent extends LoadingComponentWithPermissions implements OnInit, OnDestroy { - private savedViewService = inject(SavedViewService) - private settings = inject(SettingsService) - private toastService = inject(ToastService) + private readonly savedViewService = inject(SavedViewService) + private readonly permissionsService = inject(PermissionsService) + private readonly settings = inject(SettingsService) + private readonly toastService = inject(ToastService) + private readonly modalService = inject(NgbModal) DisplayMode = DisplayMode @@ -65,11 +75,17 @@ export class SavedViewsComponent } ngOnInit(): void { + this.reloadViews() + } + + private reloadViews(): void { this.loading = true - this.savedViewService.listAll().subscribe((r) => { - this.savedViews = r.results - this.initialize() - }) + this.savedViewService + .list(null, null, null, false, { full_perms: true }) + .subscribe((r) => { + this.savedViews = r.results + this.initialize() + }) } ngOnDestroy(): void { @@ -95,16 +111,20 @@ export class SavedViewsComponent display_mode: view.display_mode, display_fields: view.display_fields, } + const canEdit = this.canEditSavedView(view) this.savedViewsGroup.addControl( view.id.toString(), new FormGroup({ - id: new FormControl(null), - name: new FormControl(null), - show_on_dashboard: new FormControl(null), - show_in_sidebar: new FormControl(null), - page_size: new FormControl(null), - display_mode: new FormControl(null), - display_fields: new FormControl([]), + id: new FormControl({ value: null, disabled: !canEdit }), + name: new FormControl({ value: null, disabled: !canEdit }), + show_on_dashboard: new FormControl({ + value: null, + disabled: false, + }), + show_in_sidebar: new FormControl({ value: null, disabled: false }), + page_size: new FormControl({ value: null, disabled: !canEdit }), + display_mode: new FormControl({ value: null, disabled: !canEdit }), + display_fields: new FormControl({ value: [], disabled: !canEdit }), }) ) } @@ -133,10 +153,7 @@ export class SavedViewsComponent $localize`Saved view "${savedView.name}" deleted.` ) this.savedViewService.clearCache() - this.savedViewService.listAll().subscribe((r) => { - this.savedViews = r.results - this.initialize() - }) + this.reloadViews() }) } @@ -145,26 +162,120 @@ export class SavedViewsComponent } public save() { - // only patch views that have actually changed + // Save only changed views, then save the visibility changes into user settings. + const groups = Object.values(this.savedViewsGroup.controls) as FormGroup[] + const visibilityChanged = groups.some( + (group) => + group.get('show_on_dashboard')?.dirty || + group.get('show_in_sidebar')?.dirty + ) + const changed: SavedView[] = [] - Object.values(this.savedViewsGroup.controls) - .filter((g: FormGroup) => !g.pristine) - .forEach((group: FormGroup) => { - changed.push(group.value) - }) + const dashboardVisibleIds: number[] = [] + const sidebarVisibleIds: number[] = [] + + groups.forEach((group) => { + const value = group.getRawValue() + if (value.show_on_dashboard) { + dashboardVisibleIds.push(value.id) + } + if (value.show_in_sidebar) { + sidebarVisibleIds.push(value.id) + } + // Would be fine to send, but no longer stored on the model + delete value.show_on_dashboard + delete value.show_in_sidebar + + if (!group.get('name')?.enabled) { + // Quick check for user doesn't have permissions, then bail + return + } + + const modelFieldsChanged = + group.get('name')?.dirty || + group.get('page_size')?.dirty || + group.get('display_mode')?.dirty || + group.get('display_fields')?.dirty + + if (!modelFieldsChanged) { + return + } + + changed.push(value) + }) + + if (!changed.length && !visibilityChanged) { + return + } + + let saveOperation = of([]) if (changed.length) { - this.savedViewService.patchMany(changed).subscribe({ + saveOperation = saveOperation.pipe( + switchMap(() => this.savedViewService.patchMany(changed)) + ) + } + if (visibilityChanged) { + saveOperation = saveOperation.pipe( + switchMap(() => + this.settings.updateSavedViewsVisibility( + dashboardVisibleIds, + sidebarVisibleIds + ) + ) + ) + } + + saveOperation.subscribe({ + next: () => { + this.toastService.showInfo($localize`Views saved successfully.`) + this.savedViewService.clearCache() + this.reloadViews() + }, + error: (error) => { + this.toastService.showError($localize`Error while saving views.`, error) + }, + }) + } + + public canEditSavedView(view: SavedView): boolean { + return this.permissionsService.currentUserHasObjectPermissions( + PermissionAction.Change, + view + ) + } + + public canDeleteSavedView(view: SavedView): boolean { + return this.permissionsService.currentUserOwnsObject(view) + } + + public editPermissions(savedView: SavedView): void { + const modal = this.modalService.open(PermissionsDialogComponent, { + backdrop: 'static', + }) + const dialog = modal.componentInstance as PermissionsDialogComponent + dialog.object = savedView + dialog.note = $localize`Note: Sharing saved views does not share the underlying documents.` + + modal.componentInstance.confirmClicked.subscribe(({ permissions }) => { + modal.componentInstance.buttonsEnabled = false + const view = { + id: savedView.id, + owner: permissions.owner, + } + view['set_permissions'] = permissions.set_permissions + this.savedViewService.patch(view as SavedView).subscribe({ next: () => { - this.toastService.showInfo($localize`Views saved successfully.`) - this.store.next(this.savedViewsForm.value) + this.toastService.showInfo($localize`Permissions updated`) + modal.close() + this.reloadViews() }, error: (error) => { this.toastService.showError( - $localize`Error while saving views.`, + $localize`Error updating permissions`, error ) }, }) - } + }) } } diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.html b/src-ui/src/app/components/manage/workflows/workflows.component.html index 0fb63d09a3..1c03d871b4 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.html +++ b/src-ui/src/app/components/manage/workflows/workflows.component.html @@ -6,7 +6,7 @@ infoLink="usage/#workflows" > @@ -60,15 +60,15 @@ diff --git a/src-ui/src/app/components/not-found/not-found.component.html b/src-ui/src/app/components/not-found/not-found.component.html index a3de79172a..7da3fb4829 100644 --- a/src-ui/src/app/components/not-found/not-found.component.html +++ b/src-ui/src/app/components/not-found/not-found.component.html @@ -6,7 +6,7 @@

      404

      Not Found

      -  Go to Dashboard + Go to Dashboard

      diff --git a/src-ui/src/app/data/document-suggestions.ts b/src-ui/src/app/data/document-suggestions.ts index 85f9f9d228..447c4402bc 100644 --- a/src-ui/src/app/data/document-suggestions.ts +++ b/src-ui/src/app/data/document-suggestions.ts @@ -1,11 +1,17 @@ export interface DocumentSuggestions { + title?: string + tags?: number[] + suggested_tags?: string[] correspondents?: number[] + suggested_correspondents?: string[] document_types?: number[] + suggested_document_types?: string[] storage_paths?: number[] + suggested_storage_paths?: string[] dates?: string[] // ISO-formatted date string e.g. 2022-11-03 } diff --git a/src-ui/src/app/data/document.ts b/src-ui/src/app/data/document.ts index 8aae31945e..d33b642484 100644 --- a/src-ui/src/app/data/document.ts +++ b/src-ui/src/app/data/document.ts @@ -128,15 +128,15 @@ export interface Document extends ObjectWithPermissions { checksum?: string // UTC - created?: Date + created?: string // ISO string - modified?: Date + modified?: string // ISO string - added?: Date + added?: string // ISO string mime_type?: string - deleted_at?: Date + deleted_at?: string // ISO string original_file_name?: string @@ -159,6 +159,20 @@ export interface Document extends ObjectWithPermissions { page_count?: number + duplicate_documents?: Document[] + + // Versioning + root_document?: number + versions?: DocumentVersionInfo[] + // Frontend only __changedFields?: string[] } + +export interface DocumentVersionInfo { + id: number + added?: Date + version_label?: string + checksum?: string + is_root: boolean +} diff --git a/src-ui/src/app/data/mail-rule.ts b/src-ui/src/app/data/mail-rule.ts index 4c47b65006..6609810ddf 100644 --- a/src-ui/src/app/data/mail-rule.ts +++ b/src-ui/src/app/data/mail-rule.ts @@ -84,4 +84,6 @@ export interface MailRule extends ObjectWithPermissions { assign_correspondent?: number // PaperlessCorrespondent.id assign_owner_from_rule: boolean + + stop_processing: boolean } diff --git a/src-ui/src/app/data/paperless-config.ts b/src-ui/src/app/data/paperless-config.ts index 3afca66ffa..ce4faff81c 100644 --- a/src-ui/src/app/data/paperless-config.ts +++ b/src-ui/src/app/data/paperless-config.ts @@ -44,12 +44,24 @@ export enum ConfigOptionType { Boolean = 'boolean', JSON = 'json', File = 'file', + Password = 'password', } export const ConfigCategory = { General: $localize`General Settings`, OCR: $localize`OCR Settings`, Barcode: $localize`Barcode Settings`, + AI: $localize`AI Settings`, +} + +export const LLMEmbeddingBackendConfig = { + OPENAI: 'openai', + HUGGINGFACE: 'huggingface', +} + +export const LLMBackendConfig = { + OPENAI: 'openai', + OLLAMA: 'ollama', } export interface ConfigOption { @@ -59,6 +71,7 @@ export interface ConfigOption { choices?: Array<{ id: string; name: string }> config_key?: string category: string + note?: string } function mapToItems(enumObj: Object): Array<{ id: string; name: string }> { @@ -258,6 +271,65 @@ export const PaperlessConfigOptions: ConfigOption[] = [ config_key: 'PAPERLESS_CONSUMER_TAG_BARCODE_MAPPING', category: ConfigCategory.Barcode, }, + { + key: 'barcode_tag_split', + title: $localize`Split on Tag Barcodes`, + type: ConfigOptionType.Boolean, + config_key: 'PAPERLESS_CONSUMER_TAG_BARCODE_SPLIT', + category: ConfigCategory.Barcode, + }, + { + key: 'ai_enabled', + title: $localize`AI Enabled`, + type: ConfigOptionType.Boolean, + config_key: 'PAPERLESS_AI_ENABLED', + category: ConfigCategory.AI, + note: $localize`Consider privacy implications when enabling AI features, especially if using a remote model.`, + }, + { + key: 'llm_embedding_backend', + title: $localize`LLM Embedding Backend`, + type: ConfigOptionType.Select, + choices: mapToItems(LLMEmbeddingBackendConfig), + config_key: 'PAPERLESS_AI_LLM_EMBEDDING_BACKEND', + category: ConfigCategory.AI, + }, + { + key: 'llm_embedding_model', + title: $localize`LLM Embedding Model`, + type: ConfigOptionType.String, + config_key: 'PAPERLESS_AI_LLM_EMBEDDING_MODEL', + category: ConfigCategory.AI, + }, + { + key: 'llm_backend', + title: $localize`LLM Backend`, + type: ConfigOptionType.Select, + choices: mapToItems(LLMBackendConfig), + config_key: 'PAPERLESS_AI_LLM_BACKEND', + category: ConfigCategory.AI, + }, + { + key: 'llm_model', + title: $localize`LLM Model`, + type: ConfigOptionType.String, + config_key: 'PAPERLESS_AI_LLM_MODEL', + category: ConfigCategory.AI, + }, + { + key: 'llm_api_key', + title: $localize`LLM API Key`, + type: ConfigOptionType.Password, + config_key: 'PAPERLESS_AI_LLM_API_KEY', + category: ConfigCategory.AI, + }, + { + key: 'llm_endpoint', + title: $localize`LLM Endpoint`, + type: ConfigOptionType.String, + config_key: 'PAPERLESS_AI_LLM_ENDPOINT', + category: ConfigCategory.AI, + }, ] export interface PaperlessConfig extends ObjectWithId { @@ -287,4 +359,12 @@ export interface PaperlessConfig extends ObjectWithId { barcode_max_pages: number barcode_enable_tag: boolean barcode_tag_mapping: object + barcode_tag_split: boolean + ai_enabled: boolean + llm_embedding_backend: string + llm_embedding_model: string + llm_backend: string + llm_model: string + llm_api_key: string + llm_endpoint: string } diff --git a/src-ui/src/app/data/paperless-task.ts b/src-ui/src/app/data/paperless-task.ts index 1bec277eb0..19dd3921e8 100644 --- a/src-ui/src/app/data/paperless-task.ts +++ b/src-ui/src/app/data/paperless-task.ts @@ -1,3 +1,4 @@ +import { Document } from './document' import { ObjectWithId } from './object-with-id' export enum PaperlessTaskType { @@ -11,6 +12,7 @@ export enum PaperlessTaskName { TrainClassifier = 'train_classifier', SanityCheck = 'check_sanity', IndexOptimize = 'index_optimize', + LLMIndexUpdate = 'llmindex_update', } export enum PaperlessTaskStatus { @@ -41,5 +43,7 @@ export interface PaperlessTask extends ObjectWithId { related_document?: number + duplicate_documents?: Document[] + owner?: number } diff --git a/src-ui/src/app/data/share-link-bundle.ts b/src-ui/src/app/data/share-link-bundle.ts new file mode 100644 index 0000000000..fe61349977 --- /dev/null +++ b/src-ui/src/app/data/share-link-bundle.ts @@ -0,0 +1,53 @@ +import { FileVersion } from './share-link' + +export enum ShareLinkBundleStatus { + Pending = 'pending', + Processing = 'processing', + Ready = 'ready', + Failed = 'failed', +} + +export type ShareLinkBundleError = { + bundle_id: number + message?: string + exception_type?: string + timestamp?: string +} + +export interface ShareLinkBundleSummary { + id: number + slug: string + created: string // Date + expiration?: string // Date + documents: number[] + document_count: number + file_version: FileVersion + status: ShareLinkBundleStatus + built_at?: string + size_bytes?: number + last_error?: ShareLinkBundleError +} + +export interface ShareLinkBundleCreatePayload { + document_ids: number[] + file_version: FileVersion + expiration_days: number | null +} + +export const SHARE_LINK_BUNDLE_STATUS_LABELS: Record< + ShareLinkBundleStatus, + string +> = { + [ShareLinkBundleStatus.Pending]: $localize`Pending`, + [ShareLinkBundleStatus.Processing]: $localize`Processing`, + [ShareLinkBundleStatus.Ready]: $localize`Ready`, + [ShareLinkBundleStatus.Failed]: $localize`Failed`, +} + +export const SHARE_LINK_BUNDLE_FILE_VERSION_LABELS: Record< + FileVersion, + string +> = { + [FileVersion.Archive]: $localize`Archive`, + [FileVersion.Original]: $localize`Original`, +} diff --git a/src-ui/src/app/data/share-link.ts b/src-ui/src/app/data/share-link.ts index debc8c1112..d9710bd473 100644 --- a/src-ui/src/app/data/share-link.ts +++ b/src-ui/src/app/data/share-link.ts @@ -5,6 +5,18 @@ export enum FileVersion { Original = 'original', } +export interface ShareLinkExpirationOption { + label: string + value: number | null +} + +export const SHARE_LINK_EXPIRATION_OPTIONS: ShareLinkExpirationOption[] = [ + { label: $localize`1 day`, value: 1 }, + { label: $localize`7 days`, value: 7 }, + { label: $localize`30 days`, value: 30 }, + { label: $localize`Never`, value: null }, +] + export interface ShareLink extends ObjectWithPermissions { created: string // Date diff --git a/src-ui/src/app/data/system-status.ts b/src-ui/src/app/data/system-status.ts index 334dc54f87..7dcbffa202 100644 --- a/src-ui/src/app/data/system-status.ts +++ b/src-ui/src/app/data/system-status.ts @@ -7,6 +7,7 @@ export enum SystemStatusItemStatus { OK = 'OK', ERROR = 'ERROR', WARNING = 'WARNING', + DISABLED = 'DISABLED', } export interface SystemStatus { @@ -43,6 +44,9 @@ export interface SystemStatus { sanity_check_status: SystemStatusItemStatus sanity_check_last_run: string // ISO date string sanity_check_error: string + llmindex_status: SystemStatusItemStatus + llmindex_last_modified: string // ISO date string + llmindex_error: string } websocket_connected?: SystemStatusItemStatus // added client-side } diff --git a/src-ui/src/app/data/ui-settings.ts b/src-ui/src/app/data/ui-settings.ts index 6ace748106..cec804f992 100644 --- a/src-ui/src/app/data/ui-settings.ts +++ b/src-ui/src/app/data/ui-settings.ts @@ -1,3 +1,5 @@ +import { PdfEditorEditMode } from '../components/common/pdf-editor/pdf-editor-edit-mode' +import { PdfZoomScale } from '../components/common/pdf-viewer/pdf-viewer.types' import { User } from './user' export interface UiSettings { @@ -17,6 +19,10 @@ export enum GlobalSearchType { TITLE_CONTENT = 'title-content', } +export enum CollapsibleSection { + ATTRIBUTES = 'attributes', +} + export const PAPERLESS_GREEN_HEX = '#17541f' export const SETTINGS_KEYS = { @@ -49,11 +55,17 @@ export const SETTINGS_KEYS = { NOTES_ENABLED: 'general-settings:notes-enabled', AUDITLOG_ENABLED: 'general-settings:auditlog-enabled', SLIM_SIDEBAR: 'general-settings:slim-sidebar', + ATTRIBUTES_SECTIONS_COLLAPSED: + 'general-settings:attributes-sections-collapsed', UPDATE_CHECKING_ENABLED: 'general-settings:update-checking:enabled', UPDATE_CHECKING_BACKEND_SETTING: 'general-settings:update-checking:backend-setting', SAVED_VIEWS_WARN_ON_UNSAVED_CHANGE: 'general-settings:saved-views:warn-on-unsaved-change', + DASHBOARD_VIEWS_VISIBLE_IDS: + 'general-settings:saved-views:dashboard-views-visible-ids', + SIDEBAR_VIEWS_VISIBLE_IDS: + 'general-settings:saved-views:sidebar-views-visible-ids', DASHBOARD_VIEWS_SORT_ORDER: 'general-settings:saved-views:dashboard-views-sort-order', SIDEBAR_VIEWS_SORT_ORDER: @@ -61,6 +73,7 @@ export const SETTINGS_KEYS = { SIDEBAR_VIEWS_SHOW_COUNT: 'general-settings:saved-views:sidebar-views-show-count', TOUR_COMPLETE: 'general-settings:tour-complete', + OBJECT_LIST_SIZES: 'general-settings:object-list-sizes', DEFAULT_PERMS_OWNER: 'general-settings:permissions:default-owner', DEFAULT_PERMS_VIEW_USERS: 'general-settings:permissions:default-view-users', DEFAULT_PERMS_VIEW_GROUPS: 'general-settings:permissions:default-view-groups', @@ -70,12 +83,17 @@ export const SETTINGS_KEYS = { 'general-settings:document-editing:remove-inbox-tags', DOCUMENT_EDITING_OVERLAY_THUMBNAIL: 'general-settings:document-editing:overlay-thumbnail', + DOCUMENT_DETAILS_HIDDEN_FIELDS: + 'general-settings:document-details:hidden-fields', SEARCH_DB_ONLY: 'general-settings:search:db-only', SEARCH_FULL_TYPE: 'general-settings:search:more-link', + PDF_EDITOR_DEFAULT_EDIT_MODE: + 'general-settings:document-editing:default-edit-mode', EMPTY_TRASH_DELAY: 'trash_delay', GMAIL_OAUTH_URL: 'gmail_oauth_url', OUTLOOK_OAUTH_URL: 'outlook_oauth_url', EMAIL_ENABLED: 'email_enabled', + AI_ENABLED: 'ai_enabled', } export const SETTINGS: UiSetting[] = [ @@ -104,6 +122,11 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: false, }, + { + key: SETTINGS_KEYS.ATTRIBUTES_SECTIONS_COLLAPSED, + type: 'array', + default: [], + }, { key: SETTINGS_KEYS.DOCUMENT_LIST_SIZE, type: 'number', @@ -194,6 +217,16 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: false, }, + { + key: SETTINGS_KEYS.OBJECT_LIST_SIZES, + type: 'object', + default: { + correspondents: 25, + document_types: 25, + tags: 25, + storage_paths: 25, + }, + }, { key: SETTINGS_KEYS.DEFAULT_PERMS_OWNER, type: 'number', @@ -219,6 +252,16 @@ export const SETTINGS: UiSetting[] = [ type: 'array', default: [], }, + { + key: SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS, + type: 'array', + default: [], + }, + { + key: SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS, + type: 'array', + default: [], + }, { key: SETTINGS_KEYS.DASHBOARD_VIEWS_SORT_ORDER, type: 'array', @@ -254,6 +297,11 @@ export const SETTINGS: UiSetting[] = [ type: 'boolean', default: true, }, + { + key: SETTINGS_KEYS.DOCUMENT_DETAILS_HIDDEN_FIELDS, + type: 'array', + default: [], + }, { key: SETTINGS_KEYS.SEARCH_DB_ONLY, type: 'boolean', @@ -287,6 +335,16 @@ export const SETTINGS: UiSetting[] = [ { key: SETTINGS_KEYS.PDF_VIEWER_ZOOM_SETTING, type: 'string', - default: 'page-width', // ZoomSetting from 'document-detail.component' + default: PdfZoomScale.PageWidth, + }, + { + key: SETTINGS_KEYS.AI_ENABLED, + type: 'boolean', + default: false, + }, + { + key: SETTINGS_KEYS.PDF_EDITOR_DEFAULT_EDIT_MODE, + type: 'string', + default: PdfEditorEditMode.Create, }, ] diff --git a/src-ui/src/app/data/websocket-document-updated-message.ts b/src-ui/src/app/data/websocket-document-updated-message.ts new file mode 100644 index 0000000000..bd1fe9e52c --- /dev/null +++ b/src-ui/src/app/data/websocket-document-updated-message.ts @@ -0,0 +1,7 @@ +export interface WebsocketDocumentUpdatedMessage { + document_id: number + modified: string + owner_id?: number + users_can_view?: number[] + groups_can_view?: number[] +} diff --git a/src-ui/src/app/data/workflow-action.ts b/src-ui/src/app/data/workflow-action.ts index 06c46806e8..5ddaeba7e3 100644 --- a/src-ui/src/app/data/workflow-action.ts +++ b/src-ui/src/app/data/workflow-action.ts @@ -5,6 +5,8 @@ export enum WorkflowActionType { Removal = 2, Email = 3, Webhook = 4, + PasswordRemoval = 5, + MoveToTrash = 6, } export interface WorkflowActionEmail extends ObjectWithId { @@ -97,4 +99,6 @@ export interface WorkflowAction extends ObjectWithId { email?: WorkflowActionEmail webhook?: WorkflowActionWebhook + + passwords?: string[] } diff --git a/src-ui/src/app/data/workflow-trigger.ts b/src-ui/src/app/data/workflow-trigger.ts index 888b18cc31..2bc89f188a 100644 --- a/src-ui/src/app/data/workflow-trigger.ts +++ b/src-ui/src/app/data/workflow-trigger.ts @@ -44,10 +44,16 @@ export interface WorkflowTrigger extends ObjectWithId { filter_has_not_tags?: number[] // Tag.id[] + filter_has_any_correspondents?: number[] // Correspondent.id[] + filter_has_not_correspondents?: number[] // Correspondent.id[] + filter_has_any_document_types?: number[] // DocumentType.id[] + filter_has_not_document_types?: number[] // DocumentType.id[] + filter_has_any_storage_paths?: number[] // StoragePath.id[] + filter_has_not_storage_paths?: number[] // StoragePath.id[] filter_custom_field_query?: string diff --git a/src-ui/src/app/guards/dirty-saved-view.guard.spec.ts b/src-ui/src/app/guards/dirty-saved-view.guard.spec.ts index a430d8ac77..a7611cd785 100644 --- a/src-ui/src/app/guards/dirty-saved-view.guard.spec.ts +++ b/src-ui/src/app/guards/dirty-saved-view.guard.spec.ts @@ -4,6 +4,7 @@ import { TestBed } from '@angular/core/testing' import { RouterTestingModule } from '@angular/router/testing' import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' import { allIcons, NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { routes } from '../app-routing.module' import { ConfirmDialogComponent } from '../components/common/confirm-dialog/confirm-dialog.component' import { DocumentListComponent } from '../components/document-list/document-list.component' @@ -30,6 +31,7 @@ describe('DirtySavedViewGuard', () => { DocumentListComponent, provideHttpClient(withInterceptorsFromDi()), provideHttpClientTesting(), + provideUiTour(), ], }) diff --git a/src-ui/src/app/guards/permissions.guard.spec.ts b/src-ui/src/app/guards/permissions.guard.spec.ts index 77fe615e1d..69191e1ada 100644 --- a/src-ui/src/app/guards/permissions.guard.spec.ts +++ b/src-ui/src/app/guards/permissions.guard.spec.ts @@ -1,10 +1,10 @@ import { TestBed } from '@angular/core/testing' import { ActivatedRoute, RouterState } from '@angular/router' -import { TourService } from 'ngx-ui-tour-ng-bootstrap' +import { provideUiTour, TourService } from 'ngx-ui-tour-ng-bootstrap' import { PermissionAction, - PermissionType, PermissionsService, + PermissionType, } from '../services/permissions.service' import { ToastService } from '../services/toast.service' import { PermissionsGuard } from './permissions.guard' @@ -45,6 +45,7 @@ describe('PermissionsGuard', () => { }, TourService, ToastService, + provideUiTour(), ], }) @@ -95,4 +96,52 @@ describe('PermissionsGuard', () => { expect(canActivate).toHaveProperty('root') // returns UrlTree expect(toastSpy).toHaveBeenCalled() }) + + it('should activate when any required permission is granted', () => { + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation((action, type) => { + return type === PermissionType.Tag + }) + + const canActivate = guard.canActivate( + { + data: { + requiredPermissionAny: [ + { action: PermissionAction.View, type: PermissionType.Tag }, + { + action: PermissionAction.View, + type: PermissionType.DocumentType, + }, + ], + }, + } as any, + routerState.snapshot + ) + + expect(canActivate).toBeTruthy() + }) + + it('should not activate when no required permission is granted', () => { + jest + .spyOn(permissionsService, 'currentUserCan') + .mockImplementation(() => false) + + const canActivate = guard.canActivate( + { + data: { + requiredPermissionAny: [ + { action: PermissionAction.View, type: PermissionType.Tag }, + { + action: PermissionAction.View, + type: PermissionType.DocumentType, + }, + ], + }, + } as any, + routerState.snapshot + ) + + expect(canActivate).toHaveProperty('root') + }) }) diff --git a/src-ui/src/app/guards/permissions.guard.ts b/src-ui/src/app/guards/permissions.guard.ts index ddac8e035e..01d5e63cbc 100644 --- a/src-ui/src/app/guards/permissions.guard.ts +++ b/src-ui/src/app/guards/permissions.guard.ts @@ -20,12 +20,20 @@ export class PermissionsGuard { route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): boolean | UrlTree { + const requiredPermissionAny: { action: any; type: any }[] = + route.data.requiredPermissionAny + if ( (route.data.requireAdmin && !this.permissionsService.isAdmin()) || (route.data.requiredPermission && !this.permissionsService.currentUserCan( route.data.requiredPermission.action, route.data.requiredPermission.type + )) || + (Array.isArray(requiredPermissionAny) && + requiredPermissionAny.length > 0 && + !requiredPermissionAny.some((p) => + this.permissionsService.currentUserCan(p.action, p.type) )) ) { // Check if tour is running 1 = TourState.ON diff --git a/src-ui/src/app/interceptors/api-version.interceptor.spec.ts b/src-ui/src/app/interceptors/api-version.interceptor.spec.ts index c4ddd93496..154c50bc93 100644 --- a/src-ui/src/app/interceptors/api-version.interceptor.spec.ts +++ b/src-ui/src/app/interceptors/api-version.interceptor.spec.ts @@ -1,30 +1,41 @@ -import { HttpEvent, HttpRequest } from '@angular/common/http' +import { + HttpClient, + provideHttpClient, + withInterceptors, +} from '@angular/common/http' +import { + HttpTestingController, + provideHttpClientTesting, +} from '@angular/common/http/testing' import { TestBed } from '@angular/core/testing' -import { of } from 'rxjs' import { environment } from 'src/environments/environment' -import { ApiVersionInterceptor } from './api-version.interceptor' +import { withApiVersionInterceptor } from './api-version.interceptor' describe('ApiVersionInterceptor', () => { - let interceptor: ApiVersionInterceptor + let httpClient: HttpClient + let httpMock: HttpTestingController beforeEach(() => { TestBed.configureTestingModule({ - providers: [ApiVersionInterceptor], + providers: [ + provideHttpClient(withInterceptors([withApiVersionInterceptor])), + provideHttpClientTesting(), + ], }) - interceptor = TestBed.inject(ApiVersionInterceptor) + httpClient = TestBed.inject(HttpClient) + httpMock = TestBed.inject(HttpTestingController) }) it('should add api version to headers', () => { - interceptor.intercept(new HttpRequest('GET', 'https://example.com'), { - handle: (request) => { - const header = request.headers['lazyUpdate'][0] - expect(header.name).toEqual('Accept') - expect(header.value).toEqual( - `application/json; version=${environment.apiVersion}` - ) - return of({} as HttpEvent) - }, - }) + httpClient.get('https://example.com').subscribe() + const request = httpMock.expectOne('https://example.com') + const header = request.request.headers['lazyUpdate'][0] + + expect(header.name).toEqual('Accept') + expect(header.value).toEqual( + `application/json; version=${environment.apiVersion}` + ) + request.flush({}) }) }) diff --git a/src-ui/src/app/interceptors/api-version.interceptor.ts b/src-ui/src/app/interceptors/api-version.interceptor.ts index f6ec6798d6..9741846750 100644 --- a/src-ui/src/app/interceptors/api-version.interceptor.ts +++ b/src-ui/src/app/interceptors/api-version.interceptor.ts @@ -1,27 +1,20 @@ import { HttpEvent, - HttpHandler, - HttpInterceptor, + HttpHandlerFn, + HttpInterceptorFn, HttpRequest, } from '@angular/common/http' -import { Injectable } from '@angular/core' import { Observable } from 'rxjs' import { environment } from 'src/environments/environment' -@Injectable() -export class ApiVersionInterceptor implements HttpInterceptor { - constructor() {} - - intercept( - request: HttpRequest, - next: HttpHandler - ): Observable> { - request = request.clone({ - setHeaders: { - Accept: `application/json; version=${environment.apiVersion}`, - }, - }) - - return next.handle(request) - } +export const withApiVersionInterceptor: HttpInterceptorFn = ( + request: HttpRequest, + next: HttpHandlerFn +): Observable> => { + request = request.clone({ + setHeaders: { + Accept: `application/json; version=${environment.apiVersion}`, + }, + }) + return next(request) } diff --git a/src-ui/src/app/interceptors/csrf.interceptor.spec.ts b/src-ui/src/app/interceptors/csrf.interceptor.spec.ts index fb2e1a2fa4..2a6ec41752 100644 --- a/src-ui/src/app/interceptors/csrf.interceptor.spec.ts +++ b/src-ui/src/app/interceptors/csrf.interceptor.spec.ts @@ -1,35 +1,52 @@ -import { HttpEvent, HttpRequest } from '@angular/common/http' +import { + HttpClient, + provideHttpClient, + withInterceptors, +} from '@angular/common/http' +import { + HttpTestingController, + provideHttpClientTesting, +} from '@angular/common/http/testing' import { TestBed } from '@angular/core/testing' import { Meta } from '@angular/platform-browser' import { CookieService } from 'ngx-cookie-service' -import { of } from 'rxjs' -import { CsrfInterceptor } from './csrf.interceptor' +import { withCsrfInterceptor } from './csrf.interceptor' describe('CsrfInterceptor', () => { - let interceptor: CsrfInterceptor let meta: Meta let cookieService: CookieService + let httpClient: HttpClient + let httpMock: HttpTestingController beforeEach(() => { TestBed.configureTestingModule({ - providers: [CsrfInterceptor, Meta, CookieService], + providers: [ + Meta, + CookieService, + provideHttpClient(withInterceptors([withCsrfInterceptor])), + provideHttpClientTesting(), + ], }) meta = TestBed.inject(Meta) cookieService = TestBed.inject(CookieService) - interceptor = TestBed.inject(CsrfInterceptor) + httpClient = TestBed.inject(HttpClient) + httpMock = TestBed.inject(HttpTestingController) }) it('should get csrf token', () => { meta.addTag({ name: 'cookie_prefix', content: 'ngx-' }, true) + const cookieServiceSpy = jest.spyOn(cookieService, 'get') cookieServiceSpy.mockReturnValue('csrftoken') - interceptor.intercept(new HttpRequest('GET', 'https://example.com'), { - handle: (request) => { - expect(request.headers['lazyUpdate'][0]['name']).toEqual('X-CSRFToken') - return of({} as HttpEvent) - }, - }) + + httpClient.get('https://example.com').subscribe() + const request = httpMock.expectOne('https://example.com') + + expect(request.request.headers['lazyUpdate'][0]['name']).toEqual( + 'X-CSRFToken' + ) expect(cookieServiceSpy).toHaveBeenCalled() + request.flush({}) }) }) diff --git a/src-ui/src/app/interceptors/csrf.interceptor.ts b/src-ui/src/app/interceptors/csrf.interceptor.ts index 2f590c5eb3..e7fad44816 100644 --- a/src-ui/src/app/interceptors/csrf.interceptor.ts +++ b/src-ui/src/app/interceptors/csrf.interceptor.ts @@ -1,36 +1,32 @@ import { HttpEvent, - HttpHandler, - HttpInterceptor, + HttpHandlerFn, + HttpInterceptorFn, HttpRequest, } from '@angular/common/http' -import { Injectable, inject } from '@angular/core' +import { inject } from '@angular/core' import { Meta } from '@angular/platform-browser' import { CookieService } from 'ngx-cookie-service' import { Observable } from 'rxjs' -@Injectable() -export class CsrfInterceptor implements HttpInterceptor { - private cookieService = inject(CookieService) - private meta = inject(Meta) +export const withCsrfInterceptor: HttpInterceptorFn = ( + request: HttpRequest, + next: HttpHandlerFn +): Observable> => { + const cookieService: CookieService = inject(CookieService) + const meta: Meta = inject(Meta) - intercept( - request: HttpRequest, - next: HttpHandler - ): Observable> { - let prefix = '' - if (this.meta.getTag('name=cookie_prefix')) { - prefix = this.meta.getTag('name=cookie_prefix').content - } - let csrfToken = this.cookieService.get(`${prefix}csrftoken`) - if (csrfToken) { - request = request.clone({ - setHeaders: { - 'X-CSRFToken': csrfToken, - }, - }) - } - - return next.handle(request) + let prefix = '' + if (meta.getTag('name=cookie_prefix')) { + prefix = meta.getTag('name=cookie_prefix').content + } + let csrfToken = cookieService.get(`${prefix}csrftoken`) + if (csrfToken) { + request = request.clone({ + setHeaders: { + 'X-CSRFToken': csrfToken, + }, + }) } + return next(request) } diff --git a/src-ui/src/app/pipes/safehtml.pipe.spec.ts b/src-ui/src/app/pipes/safehtml.pipe.spec.ts deleted file mode 100644 index 8ef9a9e47f..0000000000 --- a/src-ui/src/app/pipes/safehtml.pipe.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TestBed } from '@angular/core/testing' -import { BrowserModule, DomSanitizer } from '@angular/platform-browser' -import { SafeHtmlPipe } from './safehtml.pipe' - -describe('SafeHtmlPipe', () => { - let pipe: SafeHtmlPipe - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [SafeHtmlPipe], - imports: [BrowserModule], - }) - pipe = TestBed.inject(SafeHtmlPipe) - }) - - it('should bypass security and trust the url', () => { - const html = '
      some content
      ' - const domSanitizer = TestBed.inject(DomSanitizer) - const sanitizerSpy = jest.spyOn(domSanitizer, 'bypassSecurityTrustHtml') - let safeHtml = pipe.transform(html) - expect(safeHtml).not.toBeNull() - expect(sanitizerSpy).toHaveBeenCalled() - }) -}) diff --git a/src-ui/src/app/pipes/safehtml.pipe.ts b/src-ui/src/app/pipes/safehtml.pipe.ts deleted file mode 100644 index 1001b8dbfc..0000000000 --- a/src-ui/src/app/pipes/safehtml.pipe.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Pipe, PipeTransform, inject } from '@angular/core' -import { DomSanitizer } from '@angular/platform-browser' - -@Pipe({ - name: 'safeHtml', -}) -export class SafeHtmlPipe implements PipeTransform { - private sanitizer = inject(DomSanitizer) - - transform(html) { - return this.sanitizer.bypassSecurityTrustHtml(html) - } -} diff --git a/src-ui/src/app/pipes/safeurl.pipe.spec.ts b/src-ui/src/app/pipes/safeurl.pipe.spec.ts index b1fc168857..90cca3878d 100644 --- a/src-ui/src/app/pipes/safeurl.pipe.spec.ts +++ b/src-ui/src/app/pipes/safeurl.pipe.spec.ts @@ -13,20 +13,45 @@ describe('SafeUrlPipe', () => { pipe = TestBed.inject(SafeUrlPipe) }) - it('should bypass security and trust the url', () => { - const url = 'https://example.com' + it('should trust only same-origin http/https urls', () => { + const origin = window.location.origin + const url = `${origin}/some/path` const domSanitizer = TestBed.inject(DomSanitizer) const sanitizerSpy = jest.spyOn( domSanitizer, 'bypassSecurityTrustResourceUrl' ) - let safeResourceUrl = pipe.transform(url) + const safeResourceUrl = pipe.transform(url) expect(safeResourceUrl).not.toBeNull() - expect(sanitizerSpy).toHaveBeenCalled() + expect(sanitizerSpy).toHaveBeenCalledWith(url) + }) - safeResourceUrl = pipe.transform(null) - expect(safeResourceUrl).not.toBeNull() - expect(sanitizerSpy).toHaveBeenCalled() + it('should return null for null or unsafe urls', () => { + const sanitizerSpy = jest.spyOn( + TestBed.inject(DomSanitizer), + 'bypassSecurityTrustResourceUrl' + ) + + expect(pipe.transform(null)).toBeTruthy() + expect(sanitizerSpy).toHaveBeenCalledWith('') + expect(pipe.transform('javascript:alert(1)')).toBeTruthy() + expect(sanitizerSpy).toHaveBeenCalledWith('') + const otherOrigin = + window.location.origin === 'https://example.com' + ? 'https://evil.com' + : 'https://example.com' + expect(pipe.transform(`${otherOrigin}/file`)).toBeTruthy() + expect(sanitizerSpy).toHaveBeenCalledWith('') + }) + + it('should return null for malformed urls', () => { + const sanitizerSpy = jest.spyOn( + TestBed.inject(DomSanitizer), + 'bypassSecurityTrustResourceUrl' + ) + + expect(pipe.transform('http://[invalid-url')).toBeTruthy() + expect(sanitizerSpy).toHaveBeenCalledWith('') }) }) diff --git a/src-ui/src/app/pipes/safeurl.pipe.ts b/src-ui/src/app/pipes/safeurl.pipe.ts index 37fdd743bc..7a0c65a2c1 100644 --- a/src-ui/src/app/pipes/safeurl.pipe.ts +++ b/src-ui/src/app/pipes/safeurl.pipe.ts @@ -1,5 +1,6 @@ import { Pipe, PipeTransform, inject } from '@angular/core' import { DomSanitizer } from '@angular/platform-browser' +import { environment } from 'src/environments/environment' @Pipe({ name: 'safeUrl', @@ -7,11 +8,23 @@ import { DomSanitizer } from '@angular/platform-browser' export class SafeUrlPipe implements PipeTransform { private sanitizer = inject(DomSanitizer) - transform(url) { - if (url == null) { + transform(url: string | null) { + if (!url) return this.sanitizer.bypassSecurityTrustResourceUrl('') + try { + const parsed = new URL(url, window.location.origin) + const allowedOrigins = new Set([ + window.location.origin, + new URL(environment.apiBaseUrl).origin, + ]) + const isHttp = ['http:', 'https:'].includes(parsed.protocol) + const originAllowed = allowedOrigins.has(parsed.origin) + + if (!isHttp || !originAllowed) { + return this.sanitizer.bypassSecurityTrustResourceUrl('') + } + return this.sanitizer.bypassSecurityTrustResourceUrl(parsed.toString()) + } catch { return this.sanitizer.bypassSecurityTrustResourceUrl('') - } else { - return this.sanitizer.bypassSecurityTrustResourceUrl(url) } } } diff --git a/src-ui/src/app/services/chat.service.spec.ts b/src-ui/src/app/services/chat.service.spec.ts new file mode 100644 index 0000000000..b8ca957cb8 --- /dev/null +++ b/src-ui/src/app/services/chat.service.spec.ts @@ -0,0 +1,58 @@ +import { + HttpEventType, + provideHttpClient, + withInterceptorsFromDi, +} from '@angular/common/http' +import { + HttpTestingController, + provideHttpClientTesting, +} from '@angular/common/http/testing' +import { TestBed } from '@angular/core/testing' +import { environment } from 'src/environments/environment' +import { ChatService } from './chat.service' + +describe('ChatService', () => { + let service: ChatService + let httpMock: HttpTestingController + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [], + providers: [ + ChatService, + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting(), + ], + }) + service = TestBed.inject(ChatService) + httpMock = TestBed.inject(HttpTestingController) + }) + + afterEach(() => { + httpMock.verify() + }) + + it('should stream chat messages', (done) => { + const documentId = 1 + const prompt = 'Hello, world!' + const mockResponse = 'Partial response text' + const apiUrl = `${environment.apiBaseUrl}documents/chat/` + + service.streamChat(documentId, prompt).subscribe((chunk) => { + expect(chunk).toBe(mockResponse) + done() + }) + + const req = httpMock.expectOne(apiUrl) + expect(req.request.method).toBe('POST') + expect(req.request.body).toEqual({ + document_id: documentId, + q: prompt, + }) + + req.event({ + type: HttpEventType.DownloadProgress, + partialText: mockResponse, + } as any) + }) +}) diff --git a/src-ui/src/app/services/chat.service.ts b/src-ui/src/app/services/chat.service.ts new file mode 100644 index 0000000000..9ddfb83300 --- /dev/null +++ b/src-ui/src/app/services/chat.service.ts @@ -0,0 +1,46 @@ +import { + HttpClient, + HttpDownloadProgressEvent, + HttpEventType, +} from '@angular/common/http' +import { inject, Injectable } from '@angular/core' +import { filter, map, Observable } from 'rxjs' +import { environment } from 'src/environments/environment' + +export interface ChatMessage { + role: 'user' | 'assistant' + content: string + isStreaming?: boolean +} + +@Injectable({ + providedIn: 'root', +}) +export class ChatService { + private http: HttpClient = inject(HttpClient) + + streamChat(documentId: number, prompt: string): Observable { + return this.http + .post( + `${environment.apiBaseUrl}documents/chat/`, + { + document_id: documentId, + q: prompt, + }, + { + observe: 'events', + reportProgress: true, + responseType: 'text', + withCredentials: true, + } + ) + .pipe( + map((event) => { + if (event.type === HttpEventType.DownloadProgress) { + return (event as HttpDownloadProgressEvent).partialText! + } + }), + filter((chunk) => !!chunk) + ) + } +} diff --git a/src-ui/src/app/services/document-list-view.service.spec.ts b/src-ui/src/app/services/document-list-view.service.spec.ts index 82d3ac4251..6258c42b25 100644 --- a/src-ui/src/app/services/document-list-view.service.spec.ts +++ b/src-ui/src/app/services/document-list-view.service.spec.ts @@ -164,7 +164,7 @@ describe('DocumentListViewService', () => { value: tags__id__in, }, ] - documentListViewService.filterRules = filterRulesAny + documentListViewService.setFilterRules(filterRulesAny) let req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=${tags__id__in}` ) @@ -178,7 +178,7 @@ describe('DocumentListViewService', () => { ) expect(req.request.method).toEqual('GET') // reset the list - documentListViewService.filterRules = [] + documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` ) @@ -210,7 +210,7 @@ describe('DocumentListViewService', () => { value: tags__id__in, }, ] - documentListViewService.filterRules = filterRulesAny + documentListViewService.setFilterRules(filterRulesAny) let req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__in=${tags__id__in}` ) @@ -218,7 +218,7 @@ describe('DocumentListViewService', () => { req.flush('Generic error', { status: 404, statusText: 'Unexpected error' }) expect(documentListViewService.error).toEqual('Generic error') // reset the list - documentListViewService.filterRules = [] + documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` ) @@ -295,13 +295,41 @@ describe('DocumentListViewService', () => { }) it('should use filter rules to update query params', () => { - documentListViewService.filterRules = filterRules + documentListViewService.setFilterRules(filterRules) const req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=${documentListViewService.currentPage}&page_size=${documentListViewService.pageSize}&ordering=-created&truncate_content=true&tags__id__all=${tags__id__all}` ) expect(req.request.method).toEqual('GET') }) + it('should support setting filter rules and resetting to page one', () => { + documentListViewService.currentPage = 2 + let req = httpTestingController.expectOne((request) => + request.urlWithParams.startsWith( + `${environment.apiBaseUrl}documents/?page=2&page_size=50&ordering=-created&truncate_content=true` + ) + ) + expect(req.request.method).toEqual('GET') + req.flush(full_results) + req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/selection_data/` + ) + req.flush([]) + + documentListViewService.setFilterRules(filterRules, true) + + const filteredReqs = httpTestingController.match( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=${tags__id__all}` + ) + expect(filteredReqs).toHaveLength(1) + filteredReqs[0].flush(full_results) + req = httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/selection_data/` + ) + req.flush([]) + expect(documentListViewService.currentPage).toEqual(1) + }) + it('should support quick filter', () => { documentListViewService.quickFilter(filterRules) const req = httpTestingController.expectOne( @@ -336,7 +364,7 @@ describe('DocumentListViewService', () => { req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true&tags__id__all=9` ) - documentListViewService.filterRules = [] + documentListViewService.setFilterRules([]) req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-added&truncate_content=true` ) @@ -348,7 +376,7 @@ describe('DocumentListViewService', () => { }) it('should support navigating next / previous', () => { - documentListViewService.filterRules = [] + documentListViewService.setFilterRules([]) let req = httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` ) @@ -558,7 +586,7 @@ describe('DocumentListViewService', () => { req.flush(full_results) expect(documentListViewService.selected.size).toEqual(6) - documentListViewService.filterRules = filterRules + documentListViewService.setFilterRules(filterRules) httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true&tags__id__all=9` ) @@ -592,7 +620,7 @@ describe('DocumentListViewService', () => { documentListViewService.loadSavedView(view2) expect(documentListViewService.sortField).toEqual('score') - documentListViewService.filterRules = [] + documentListViewService.setFilterRules([]) expect(documentListViewService.sortField).toEqual('created') httpTestingController.expectOne( `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` @@ -651,4 +679,25 @@ describe('DocumentListViewService', () => { documentListViewService.displayFields = customFields as any expect(documentListViewService.displayFields).toEqual(['custom_field_1']) }) + + it('should generate quick filter URL with filter rules', () => { + const routerSpy = jest.spyOn(router, 'createUrlTree') + const urlTree = documentListViewService.getQuickFilterUrl(filterRules) + expect(routerSpy).toHaveBeenCalledWith(['/documents'], { + queryParams: expect.objectContaining({ + tags__id__all: tags__id__all, + }), + }) + expect(urlTree).toBeDefined() + }) + + it('should generate quick filter URL preserving default state', () => { + documentListViewService.reload() + httpTestingController.expectOne( + `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` + ) + const urlTree = documentListViewService.getQuickFilterUrl(filterRules) + expect(urlTree).toBeDefined() + expect(router.createUrlTree).toBeDefined() + }) }) diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts index 9c64a7641e..6989db8ede 100644 --- a/src-ui/src/app/services/document-list-view.service.ts +++ b/src-ui/src/app/services/document-list-view.service.ts @@ -1,5 +1,5 @@ import { Injectable, inject } from '@angular/core' -import { ParamMap, Router } from '@angular/router' +import { ParamMap, Router, UrlTree } from '@angular/router' import { Observable, Subject, first, takeUntil } from 'rxjs' import { DEFAULT_DISPLAY_FIELDS, @@ -342,7 +342,7 @@ export class DocumentListViewService { }) } - set filterRules(filterRules: FilterRule[]) { + setFilterRules(filterRules: FilterRule[], resetPage: boolean = false) { if ( !isFullTextFilterRule(filterRules) && this.activeListViewState.sortField == 'score' @@ -350,6 +350,9 @@ export class DocumentListViewService { this.activeListViewState.sortField = 'created' } this.activeListViewState.filterRules = filterRules + if (resetPage) { + this.activeListViewState.currentPage = 1 + } this.reload() this.reduceSelectionToFilter() this.saveDocumentListView() @@ -479,10 +482,22 @@ export class DocumentListViewService { quickFilter(filterRules: FilterRule[]) { this._activeSavedViewId = null - this.filterRules = filterRules + this.setFilterRules(filterRules) this.router.navigate(['documents']) } + getQuickFilterUrl(filterRules: FilterRule[]): UrlTree { + const defaultState = { + ...this.defaultListViewState(), + ...this.listViewStates.get(null), + filterRules, + } + const params = paramsFromViewState(defaultState) + return this.router.createUrlTree(['/documents'], { + queryParams: params, + }) + } + getLastPage(): number { return Math.ceil(this.collectionSize / this.pageSize) } diff --git a/src-ui/src/app/services/rest/abstract-paperless-service.ts b/src-ui/src/app/services/rest/abstract-paperless-service.ts index 60f91eb5fa..d293d64531 100644 --- a/src-ui/src/app/services/rest/abstract-paperless-service.ts +++ b/src-ui/src/app/services/rest/abstract-paperless-service.ts @@ -1,7 +1,7 @@ import { HttpClient, HttpParams } from '@angular/common/http' import { inject, Injectable } from '@angular/core' import { Observable } from 'rxjs' -import { map, publishReplay, refCount, tap } from 'rxjs/operators' +import { map, shareReplay, tap } from 'rxjs/operators' import { ObjectWithId } from 'src/app/data/object-with-id' import { Results } from 'src/app/data/results' import { environment } from 'src/environments/environment' @@ -90,7 +90,7 @@ export abstract class AbstractPaperlessService { sortField, sortReverse, extraParams - ).pipe(publishReplay(1), refCount()) + ).pipe(shareReplay({ bufferSize: 1, refCount: true })) } return this._listAll } diff --git a/src-ui/src/app/services/rest/document.service.spec.ts b/src-ui/src/app/services/rest/document.service.spec.ts index 55cbdcff95..b3a9757ff0 100644 --- a/src-ui/src/app/services/rest/document.service.spec.ts +++ b/src-ui/src/app/services/rest/document.service.spec.ts @@ -165,6 +165,14 @@ describe(`DocumentService`, () => { expect(req.request.method).toEqual('GET') }) + it('should call appropriate api endpoint for versioned metadata', () => { + subscription = service.getMetadata(documents[0].id, 123).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/metadata/?version=123` + ) + expect(req.request.method).toEqual('GET') + }) + it('should call appropriate api endpoint for getting selection data', () => { const ids = [documents[0].id] subscription = service.getSelectionData(ids).subscribe() @@ -222,6 +230,88 @@ describe(`DocumentService`, () => { }) }) + it('should call appropriate api endpoint for delete documents', () => { + const ids = [1, 2, 3] + subscription = service.deleteDocuments(ids).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/delete/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + }) + }) + + it('should call appropriate api endpoint for reprocess documents', () => { + const ids = [1, 2, 3] + subscription = service.reprocessDocuments(ids).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/reprocess/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + }) + }) + + it('should call appropriate api endpoint for rotate documents', () => { + const ids = [1, 2, 3] + subscription = service.rotateDocuments(ids, 90).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/rotate/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + degrees: 90, + source_mode: 'latest_version', + }) + }) + + it('should call appropriate api endpoint for merge documents', () => { + const ids = [1, 2, 3] + const args = { metadata_document_id: 1, delete_originals: true } + subscription = service.mergeDocuments(ids, args).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/merge/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + metadata_document_id: 1, + delete_originals: true, + }) + }) + + it('should call appropriate api endpoint for edit pdf', () => { + const ids = [1] + const args = { operations: [{ page: 1, rotate: 90, doc: 0 }] } + subscription = service.editPdfDocuments(ids, args).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/edit_pdf/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + operations: [{ page: 1, rotate: 90, doc: 0 }], + }) + }) + + it('should call appropriate api endpoint for remove password', () => { + const ids = [1] + const args = { password: 'secret', update_document: true } + subscription = service.removePasswordDocuments(ids, args).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/remove_password/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toEqual({ + documents: ids, + password: 'secret', + update_document: true, + }) + }) + it('should return the correct preview URL for a single document', () => { let url = service.getPreviewUrl(documents[0].id) expect(url).toEqual( @@ -233,11 +323,22 @@ describe(`DocumentService`, () => { ) }) + it('should return the correct preview URL for a specific version', () => { + const url = service.getPreviewUrl(documents[0].id, false, 123) + expect(url).toEqual( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/preview/?version=123` + ) + }) + it('should return the correct thumb URL for a single document', () => { let url = service.getThumbUrl(documents[0].id) expect(url).toEqual( `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/thumb/` ) + url = service.getThumbUrl(documents[0].id, 123) + expect(url).toEqual( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/thumb/?version=123` + ) }) it('should return the correct download URL for a single document', () => { @@ -249,6 +350,22 @@ describe(`DocumentService`, () => { expect(url).toEqual( `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/download/?original=true` ) + url = service.getDownloadUrl(documents[0].id, false, 123) + expect(url).toEqual( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/download/?version=123` + ) + url = service.getDownloadUrl(documents[0].id, true, 123, true) + expect(url).toContain('original=true') + expect(url).toContain('version=123') + expect(url).toContain('follow_formatting=true') + }) + + it('should pass optional get params for version and fields', () => { + subscription = service.get(documents[0].id, 123, 'content').subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/?full_perms=true&version=123&fields=content` + ) + expect(req.request.method).toEqual('GET') }) it('should set search query', () => { @@ -283,12 +400,77 @@ describe(`DocumentService`, () => { expect(req.request.body.remove_inbox_tags).toEqual(true) }) + it('should pass selected version to patch when provided', () => { + subscription = service.patch(documents[0], 123).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/?version=123` + ) + expect(req.request.method).toEqual('PATCH') + }) + it('should call appropriate api endpoint for getting audit log', () => { subscription = service.getHistory(documents[0].id).subscribe() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/history/` ) }) + + it('should call appropriate api endpoint for getting root document id', () => { + subscription = service.getRootId(documents[0].id).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/root/` + ) + expect(req.request.method).toEqual('GET') + req.flush({ root_id: documents[0].id }) + }) + + it('should call appropriate api endpoint for getting document versions', () => { + subscription = service.getVersions(documents[0].id).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/?fields=id,versions` + ) + expect(req.request.method).toEqual('GET') + }) + + it('should call appropriate api endpoint for deleting a document version', () => { + subscription = service.deleteVersion(documents[0].id, 10).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/versions/10/` + ) + expect(req.request.method).toEqual('DELETE') + req.flush({ result: 'OK', current_version_id: documents[0].id }) + }) + + it('should call appropriate api endpoint for updating a document version label', () => { + subscription = service + .updateVersionLabel(documents[0].id, 10, 'Updated label') + .subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/versions/10/` + ) + expect(req.request.method).toEqual('PATCH') + expect(req.request.body).toEqual({ version_label: 'Updated label' }) + req.flush({ id: 10, version_label: 'Updated label', is_root: false }) + }) + + it('should call appropriate api endpoint for uploading a new version', () => { + const file = new File(['hello'], 'test.pdf', { type: 'application/pdf' }) + + subscription = service + .uploadVersion(documents[0].id, file, 'Label') + .subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/${documents[0].id}/update_version/` + ) + expect(req.request.method).toEqual('POST') + expect(req.request.body).toBeInstanceOf(FormData) + + const body = req.request.body as FormData + expect(body.get('version_label')).toEqual('Label') + expect(body.get('document')).toBeInstanceOf(File) + + req.flush('task-id') + }) }) it('should construct sort fields respecting permissions', () => { diff --git a/src-ui/src/app/services/rest/document.service.ts b/src-ui/src/app/services/rest/document.service.ts index 1cead8ec52..971396bac5 100644 --- a/src-ui/src/app/services/rest/document.service.ts +++ b/src-ui/src/app/services/rest/document.service.ts @@ -7,6 +7,7 @@ import { DOCUMENT_SORT_FIELDS, DOCUMENT_SORT_FIELDS_FULLTEXT, Document, + DocumentVersionInfo, } from 'src/app/data/document' import { DocumentMetadata } from 'src/app/data/document-metadata' import { DocumentSuggestions } from 'src/app/data/document-suggestions' @@ -36,6 +37,50 @@ export interface SelectionData { selected_custom_fields: SelectionDataItem[] } +export enum BulkEditSourceMode { + LATEST_VERSION = 'latest_version', + EXPLICIT_SELECTION = 'explicit_selection', +} + +export type DocumentBulkEditMethod = + | 'set_correspondent' + | 'set_document_type' + | 'set_storage_path' + | 'add_tag' + | 'remove_tag' + | 'modify_tags' + | 'modify_custom_fields' + | 'set_permissions' + +export interface MergeDocumentsRequest { + metadata_document_id?: number + delete_originals?: boolean + archive_fallback?: boolean + source_mode?: BulkEditSourceMode +} + +export interface EditPdfOperation { + page: number + rotate?: number + doc?: number +} + +export interface EditPdfDocumentsRequest { + operations: EditPdfOperation[] + delete_original?: boolean + update_document?: boolean + include_metadata?: boolean + source_mode?: BulkEditSourceMode +} + +export interface RemovePasswordDocumentsRequest { + password: string + update_document?: boolean + delete_original?: boolean + include_metadata?: boolean + source_mode?: BulkEditSourceMode +} + @Injectable({ providedIn: 'root', }) @@ -155,44 +200,123 @@ export class DocumentService extends AbstractPaperlessService { }).pipe(map((response) => response.results.map((doc) => doc.id))) } - get(id: number): Observable { + get( + id: number, + versionID: number = null, + fields: string = null + ): Observable { + const params: { full_perms: boolean; version?: string; fields?: string } = { + full_perms: true, + } + if (versionID) { + params.version = versionID.toString() + } + if (fields) { + params.fields = fields + } return this.http.get(this.getResourceUrl(id), { - params: { - full_perms: true, - }, + params, }) } - getPreviewUrl(id: number, original: boolean = false): string { + getPreviewUrl( + id: number, + original: boolean = false, + versionID: number = null + ): string { let url = new URL(this.getResourceUrl(id, 'preview')) if (this._searchQuery) url.hash = `#search="${this.searchQuery}"` if (original) { url.searchParams.append('original', 'true') } + if (versionID) { + url.searchParams.append('version', versionID.toString()) + } return url.toString() } - getThumbUrl(id: number): string { - return this.getResourceUrl(id, 'thumb') + getThumbUrl(id: number, versionID: number = null): string { + let url = new URL(this.getResourceUrl(id, 'thumb')) + if (versionID) { + url.searchParams.append('version', versionID.toString()) + } + return url.toString() } - getDownloadUrl(id: number, original: boolean = false): string { - let url = this.getResourceUrl(id, 'download') + getDownloadUrl( + id: number, + original: boolean = false, + versionID: number = null, + followFormatting: boolean = false + ): string { + let url = new URL(this.getResourceUrl(id, 'download')) if (original) { - url += '?original=true' + url.searchParams.append('original', 'true') + } + if (versionID) { + url.searchParams.append('version', versionID.toString()) } - return url + if (followFormatting) { + url.searchParams.append('follow_formatting', 'true') + } + return url.toString() + } + + uploadVersion(documentId: number, file: File, versionLabel?: string) { + const formData = new FormData() + formData.append('document', file, file.name) + if (versionLabel) { + formData.append('version_label', versionLabel) + } + return this.http.post( + this.getResourceUrl(documentId, 'update_version'), + formData + ) + } + + getVersions(documentId: number): Observable { + return this.http.get(this.getResourceUrl(documentId), { + params: { + fields: 'id,versions', + }, + }) + } + + getRootId(documentId: number) { + return this.http.get<{ root_id: number }>( + this.getResourceUrl(documentId, 'root') + ) + } + + deleteVersion(rootDocumentId: number, versionId: number) { + return this.http.delete<{ result: string; current_version_id: number }>( + this.getResourceUrl(rootDocumentId, `versions/${versionId}`) + ) + } + + updateVersionLabel( + rootDocumentId: number, + versionId: number, + versionLabel: string | null + ): Observable { + return this.http.patch( + this.getResourceUrl(rootDocumentId, `versions/${versionId}`), + { version_label: versionLabel } + ) } getNextAsn(): Observable { return this.http.get(this.getResourceUrl(null, 'next_asn')) } - patch(o: Document): Observable { + patch(o: Document, versionID: number = null): Observable { o.remove_inbox_tags = !!this.settingsService.get( SETTINGS_KEYS.DOCUMENT_EDITING_REMOVE_INBOX_TAGS ) - return super.patch(o) + this.clearCache() + return this.http.patch(this.getResourceUrl(o.id), o, { + params: versionID ? { version: versionID.toString() } : {}, + }) } uploadDocument(formData) { @@ -203,11 +327,18 @@ export class DocumentService extends AbstractPaperlessService { ) } - getMetadata(id: number): Observable { - return this.http.get(this.getResourceUrl(id, 'metadata')) + getMetadata( + id: number, + versionID: number = null + ): Observable { + let url = new URL(this.getResourceUrl(id, 'metadata')) + if (versionID) { + url.searchParams.append('version', versionID.toString()) + } + return this.http.get(url.toString()) } - bulkEdit(ids: number[], method: string, args: any) { + bulkEdit(ids: number[], method: DocumentBulkEditMethod, args: any) { return this.http.post(this.getResourceUrl(null, 'bulk_edit'), { documents: ids, method: method, @@ -215,6 +346,54 @@ export class DocumentService extends AbstractPaperlessService { }) } + deleteDocuments(ids: number[]) { + return this.http.post(this.getResourceUrl(null, 'delete'), { + documents: ids, + }) + } + + reprocessDocuments(ids: number[]) { + return this.http.post(this.getResourceUrl(null, 'reprocess'), { + documents: ids, + }) + } + + rotateDocuments( + ids: number[], + degrees: number, + sourceMode: BulkEditSourceMode = BulkEditSourceMode.LATEST_VERSION + ) { + return this.http.post(this.getResourceUrl(null, 'rotate'), { + documents: ids, + degrees, + source_mode: sourceMode, + }) + } + + mergeDocuments(ids: number[], request: MergeDocumentsRequest = {}) { + return this.http.post(this.getResourceUrl(null, 'merge'), { + documents: ids, + ...request, + }) + } + + editPdfDocuments(ids: number[], request: EditPdfDocumentsRequest) { + return this.http.post(this.getResourceUrl(null, 'edit_pdf'), { + documents: ids, + ...request, + }) + } + + removePasswordDocuments( + ids: number[], + request: RemovePasswordDocumentsRequest + ) { + return this.http.post(this.getResourceUrl(null, 'remove_password'), { + documents: ids, + ...request, + }) + } + getSelectionData(ids: number[]): Observable { return this.http.post( this.getResourceUrl(null, 'selection_data'), diff --git a/src-ui/src/app/services/rest/mail-rule.service.spec.ts b/src-ui/src/app/services/rest/mail-rule.service.spec.ts index f2016d7978..f5bef1ec00 100644 --- a/src-ui/src/app/services/rest/mail-rule.service.spec.ts +++ b/src-ui/src/app/services/rest/mail-rule.service.spec.ts @@ -33,6 +33,7 @@ const mail_rules = [ action: MailAction.MarkRead, assign_title_from: MailMetadataTitleOption.FromSubject, assign_owner_from_rule: true, + stop_processing: false, }, { name: 'Mail Rule 2', @@ -52,6 +53,7 @@ const mail_rules = [ action: MailAction.Delete, assign_title_from: MailMetadataTitleOption.FromSubject, assign_owner_from_rule: true, + stop_processing: false, }, { name: 'Mail Rule 3', @@ -71,6 +73,7 @@ const mail_rules = [ action: MailAction.Flag, assign_title_from: MailMetadataTitleOption.FromSubject, assign_owner_from_rule: false, + stop_processing: false, }, ] diff --git a/src-ui/src/app/services/rest/saved-view.service.spec.ts b/src-ui/src/app/services/rest/saved-view.service.spec.ts index 585425ecce..c72fb54092 100644 --- a/src-ui/src/app/services/rest/saved-view.service.spec.ts +++ b/src-ui/src/app/services/rest/saved-view.service.spec.ts @@ -57,6 +57,11 @@ describe(`Additional service tests for SavedViewService`, () => { let settingsService it('should retrieve saved views and sort them', () => { + jest.spyOn(settingsService, 'get').mockImplementation((key) => { + if (key === SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS) return [1, 2, 3] + if (key === SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS) return [1, 2, 3] + return [] + }) service.reload() const req = httpTestingController.expectOne( `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=100000` @@ -93,7 +98,9 @@ describe(`Additional service tests for SavedViewService`, () => { it('should sort dashboard views', () => { service['savedViews'] = saved_views jest.spyOn(settingsService, 'get').mockImplementation((key) => { + if (key === SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS) return [1, 2, 3] if (key === SETTINGS_KEYS.DASHBOARD_VIEWS_SORT_ORDER) return [3, 1, 2] + return [] }) expect(service.dashboardViews).toEqual([ saved_views[2], @@ -102,10 +109,21 @@ describe(`Additional service tests for SavedViewService`, () => { ]) }) + it('should use user-specific dashboard visibility when configured', () => { + service['savedViews'] = saved_views + jest.spyOn(settingsService, 'get').mockImplementation((key) => { + if (key === SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS) return [4, 2] + if (key === SETTINGS_KEYS.DASHBOARD_VIEWS_SORT_ORDER) return [] + }) + expect(service.dashboardViews).toEqual([saved_views[1], saved_views[3]]) + }) + it('should sort sidebar views', () => { service['savedViews'] = saved_views jest.spyOn(settingsService, 'get').mockImplementation((key) => { + if (key === SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS) return [1, 2, 3] if (key === SETTINGS_KEYS.SIDEBAR_VIEWS_SORT_ORDER) return [3, 1, 2] + return [] }) expect(service.sidebarViews).toEqual([ saved_views[2], @@ -114,6 +132,15 @@ describe(`Additional service tests for SavedViewService`, () => { ]) }) + it('should use user-specific sidebar visibility when configured', () => { + service['savedViews'] = saved_views + jest.spyOn(settingsService, 'get').mockImplementation((key) => { + if (key === SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS) return [4, 2] + if (key === SETTINGS_KEYS.SIDEBAR_VIEWS_SORT_ORDER) return [] + }) + expect(service.sidebarViews).toEqual([saved_views[1], saved_views[3]]) + }) + it('should treat empty display_fields as null', () => { subscription = service .patch({ diff --git a/src-ui/src/app/services/rest/saved-view.service.ts b/src-ui/src/app/services/rest/saved-view.service.ts index 7bdb890a0c..d9baec22bf 100644 --- a/src-ui/src/app/services/rest/saved-view.service.ts +++ b/src-ui/src/app/services/rest/saved-view.service.ts @@ -36,7 +36,9 @@ export class SavedViewService extends AbstractPaperlessService { return super.list(page, pageSize, sortField, sortReverse, extraParams).pipe( tap({ next: (r) => { - this.savedViews = r.results + const views = r.results.map((view) => this.withUserVisibility(view)) + this.savedViews = views + r.results = views this._loading = false this.settingsService.dashboardIsEmpty = this.dashboardViews.length === 0 @@ -65,8 +67,35 @@ export class SavedViewService extends AbstractPaperlessService { return this.savedViews } + private getVisibleViewIds(setting: string): number[] { + const configured = this.settingsService.get(setting) + return Array.isArray(configured) ? configured : [] + } + + private withUserVisibility(view: SavedView): SavedView { + return { + ...view, + show_on_dashboard: this.isDashboardVisible(view), + show_in_sidebar: this.isSidebarVisible(view), + } + } + + private isDashboardVisible(view: SavedView): boolean { + const visibleIds = this.getVisibleViewIds( + SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS + ) + return visibleIds.includes(view.id) + } + + private isSidebarVisible(view: SavedView): boolean { + const visibleIds = this.getVisibleViewIds( + SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS + ) + return visibleIds.includes(view.id) + } + get sidebarViews(): SavedView[] { - const sidebarViews = this.savedViews.filter((v) => v.show_in_sidebar) + const sidebarViews = this.savedViews.filter((v) => this.isSidebarVisible(v)) const sorted: number[] = this.settingsService.get( SETTINGS_KEYS.SIDEBAR_VIEWS_SORT_ORDER @@ -81,7 +110,9 @@ export class SavedViewService extends AbstractPaperlessService { } get dashboardViews(): SavedView[] { - const dashboardViews = this.savedViews.filter((v) => v.show_on_dashboard) + const dashboardViews = this.savedViews.filter((v) => + this.isDashboardVisible(v) + ) const sorted: number[] = this.settingsService.get( SETTINGS_KEYS.DASHBOARD_VIEWS_SORT_ORDER diff --git a/src-ui/src/app/services/rest/share-link-bundle.service.spec.ts b/src-ui/src/app/services/rest/share-link-bundle.service.spec.ts new file mode 100644 index 0000000000..6b87ddf040 --- /dev/null +++ b/src-ui/src/app/services/rest/share-link-bundle.service.spec.ts @@ -0,0 +1,60 @@ +import { HttpTestingController } from '@angular/common/http/testing' +import { TestBed } from '@angular/core/testing' +import { Subscription } from 'rxjs' +import { environment } from 'src/environments/environment' +import { commonAbstractPaperlessServiceTests } from './abstract-paperless-service.spec' +import { ShareLinkBundleService } from './share-link-bundle.service' + +const endpoint = 'share_link_bundles' + +commonAbstractPaperlessServiceTests(endpoint, ShareLinkBundleService) + +describe('ShareLinkBundleService', () => { + let httpTestingController: HttpTestingController + let service: ShareLinkBundleService + let subscription: Subscription | undefined + + beforeEach(() => { + httpTestingController = TestBed.inject(HttpTestingController) + service = TestBed.inject(ShareLinkBundleService) + }) + + afterEach(() => { + subscription?.unsubscribe() + httpTestingController.verify() + }) + + it('creates bundled share links', () => { + const payload = { + document_ids: [1, 2], + file_version: 'archive', + expiration_days: 7, + } + subscription = service.createBundle(payload as any).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/` + ) + expect(req.request.method).toBe('POST') + expect(req.request.body).toEqual(payload) + req.flush({}) + }) + + it('rebuilds bundles', () => { + subscription = service.rebuildBundle(12).subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/12/rebuild/` + ) + expect(req.request.method).toBe('POST') + expect(req.request.body).toEqual({}) + req.flush({}) + }) + + it('lists bundles with expected parameters', () => { + subscription = service.listAllBundles().subscribe() + const req = httpTestingController.expectOne( + `${environment.apiBaseUrl}${endpoint}/?page=1&page_size=1000&ordering=-created` + ) + expect(req.request.method).toBe('GET') + req.flush({ results: [] }) + }) +}) diff --git a/src-ui/src/app/services/rest/share-link-bundle.service.ts b/src-ui/src/app/services/rest/share-link-bundle.service.ts new file mode 100644 index 0000000000..2aa7199740 --- /dev/null +++ b/src-ui/src/app/services/rest/share-link-bundle.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' +import { + ShareLinkBundleCreatePayload, + ShareLinkBundleSummary, +} from 'src/app/data/share-link-bundle' +import { AbstractNameFilterService } from './abstract-name-filter-service' + +@Injectable({ + providedIn: 'root', +}) +export class ShareLinkBundleService extends AbstractNameFilterService { + constructor() { + super() + this.resourceName = 'share_link_bundles' + } + + createBundle( + payload: ShareLinkBundleCreatePayload + ): Observable { + this.clearCache() + return this.http.post( + this.getResourceUrl(), + payload + ) + } + rebuildBundle(bundleId: number): Observable { + this.clearCache() + return this.http.post( + this.getResourceUrl(bundleId, 'rebuild'), + {} + ) + } + + listAllBundles(): Observable { + return this.list(1, 1000, 'created', true).pipe( + map((response) => response.results) + ) + } +} diff --git a/src-ui/src/app/services/settings.service.spec.ts b/src-ui/src/app/services/settings.service.spec.ts index df44013f4d..22ae3e5049 100644 --- a/src-ui/src/app/services/settings.service.spec.ts +++ b/src-ui/src/app/services/settings.service.spec.ts @@ -320,7 +320,7 @@ describe('SettingsService', () => { expect(req.request.method).toEqual('POST') }) - it('should update saved view sorting', () => { + it('should update saved view sorting and visibility', () => { httpTestingController .expectOne(`${environment.apiBaseUrl}ui_settings/`) .flush(ui_settings) @@ -341,6 +341,15 @@ describe('SettingsService', () => { SETTINGS_KEYS.SIDEBAR_VIEWS_SORT_ORDER, [1, 4] ) + settingsService.updateSavedViewsVisibility([1, 4], [4, 1]) + expect(setSpy).toHaveBeenCalledWith( + SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS, + [1, 4] + ) + expect(setSpy).toHaveBeenCalledWith( + SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS, + [4, 1] + ) httpTestingController .expectOne(`${environment.apiBaseUrl}ui_settings/`) .flush(ui_settings) diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index bf25a79120..f006cae125 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -136,6 +136,12 @@ const LANGUAGE_OPTIONS = [ englishName: 'Hungarian', dateInputFormat: 'yyyy.mm.dd', }, + { + code: 'id-id', + name: $localize`Indonesian`, + englishName: 'Indonesian', + dateInputFormat: 'dd-mm-yyyy', + }, { code: 'it-it', name: $localize`Italian`, @@ -693,4 +699,17 @@ export class SettingsService { ]) return this.storeSettings() } + + updateSavedViewsVisibility( + dashboardVisibleViewIds: number[], + sidebarVisibleViewIds: number[] + ): Observable { + this.set(SETTINGS_KEYS.DASHBOARD_VIEWS_VISIBLE_IDS, [ + ...new Set(dashboardVisibleViewIds), + ]) + this.set(SETTINGS_KEYS.SIDEBAR_VIEWS_VISIBLE_IDS, [ + ...new Set(sidebarVisibleViewIds), + ]) + return this.storeSettings() + } } diff --git a/src-ui/src/app/services/websocket-status.service.spec.ts b/src-ui/src/app/services/websocket-status.service.spec.ts index 3a4115fe6c..d6fdbb07dc 100644 --- a/src-ui/src/app/services/websocket-status.service.spec.ts +++ b/src-ui/src/app/services/websocket-status.service.spec.ts @@ -416,4 +416,42 @@ describe('ConsumerStatusService', () => { websocketStatusService.disconnect() expect(deleted).toBeTruthy() }) + + it('should trigger updated subject on document updated', () => { + let updated = false + websocketStatusService.onDocumentUpdated().subscribe((data) => { + updated = true + expect(data.document_id).toEqual(12) + }) + + websocketStatusService.connect() + server.send({ + type: WebsocketStatusType.DOCUMENT_UPDATED, + data: { + document_id: 12, + modified: '2026-02-17T00:00:00Z', + owner_id: 1, + }, + }) + + websocketStatusService.disconnect() + expect(updated).toBeTruthy() + }) + + it('should ignore document updated events the user cannot view', () => { + let updated = false + websocketStatusService.onDocumentUpdated().subscribe(() => { + updated = true + }) + + websocketStatusService.handleDocumentUpdated({ + document_id: 12, + modified: '2026-02-17T00:00:00Z', + owner_id: 2, + users_can_view: [], + groups_can_view: [], + }) + + expect(updated).toBeFalsy() + }) }) diff --git a/src-ui/src/app/services/websocket-status.service.ts b/src-ui/src/app/services/websocket-status.service.ts index f9084c88cf..9e09522b70 100644 --- a/src-ui/src/app/services/websocket-status.service.ts +++ b/src-ui/src/app/services/websocket-status.service.ts @@ -2,6 +2,7 @@ import { Injectable, inject } from '@angular/core' import { Subject } from 'rxjs' import { environment } from 'src/environments/environment' import { User } from '../data/user' +import { WebsocketDocumentUpdatedMessage } from '../data/websocket-document-updated-message' import { WebsocketDocumentsDeletedMessage } from '../data/websocket-documents-deleted-message' import { WebsocketProgressMessage } from '../data/websocket-progress-message' import { SettingsService } from './settings.service' @@ -9,6 +10,7 @@ import { SettingsService } from './settings.service' export enum WebsocketStatusType { STATUS_UPDATE = 'status_update', DOCUMENTS_DELETED = 'documents_deleted', + DOCUMENT_UPDATED = 'document_updated', } // see ProgressStatusOptions in src/documents/plugins/helpers.py @@ -89,21 +91,31 @@ export class FileStatus { } } +export enum UploadState { + Idle = 'idle', + Uploading = 'uploading', + Processing = 'processing', + Failed = 'failed', +} + @Injectable({ providedIn: 'root', }) export class WebsocketStatusService { - private settingsService = inject(SettingsService) + private readonly settingsService = inject(SettingsService) private statusWebSocket: WebSocket private consumerStatus: FileStatus[] = [] - private documentDetectedSubject = new Subject() - private documentConsumptionFinishedSubject = new Subject() - private documentConsumptionFailedSubject = new Subject() - private documentDeletedSubject = new Subject() - private connectionStatusSubject = new Subject() + private readonly documentDetectedSubject = new Subject() + private readonly documentConsumptionFinishedSubject = + new Subject() + private readonly documentConsumptionFailedSubject = new Subject() + private readonly documentDeletedSubject = new Subject() + private readonly documentUpdatedSubject = + new Subject() + private readonly connectionStatusSubject = new Subject() private get(taskId: string, filename?: string) { let status = @@ -169,7 +181,10 @@ export class WebsocketStatusService { data: messageData, }: { type: WebsocketStatusType - data: WebsocketProgressMessage | WebsocketDocumentsDeletedMessage + data: + | WebsocketProgressMessage + | WebsocketDocumentsDeletedMessage + | WebsocketDocumentUpdatedMessage } = JSON.parse(ev.data) switch (type) { @@ -177,6 +192,12 @@ export class WebsocketStatusService { this.documentDeletedSubject.next(true) break + case WebsocketStatusType.DOCUMENT_UPDATED: + this.handleDocumentUpdated( + messageData as WebsocketDocumentUpdatedMessage + ) + break + case WebsocketStatusType.STATUS_UPDATE: this.handleProgressUpdate(messageData as WebsocketProgressMessage) break @@ -184,7 +205,11 @@ export class WebsocketStatusService { } } - private canViewMessage(messageData: WebsocketProgressMessage): boolean { + private canViewMessage(messageData: { + owner_id?: number + users_can_view?: number[] + groups_can_view?: number[] + }): boolean { // see paperless.consumers.StatusConsumer._can_view const user: User = this.settingsService.currentUser return ( @@ -244,6 +269,15 @@ export class WebsocketStatusService { } } + handleDocumentUpdated(messageData: WebsocketDocumentUpdatedMessage) { + // fallback if backend didn't restrict message + if (!this.canViewMessage(messageData)) { + return + } + + this.documentUpdatedSubject.next(messageData) + } + fail(status: FileStatus, message: string) { status.message = message status.phase = FileStatusPhase.FAILED @@ -297,6 +331,10 @@ export class WebsocketStatusService { return this.documentDeletedSubject } + onDocumentUpdated() { + return this.documentUpdatedSubject + } + onConnectionStatus() { return this.connectionStatusSubject.asObservable() } diff --git a/src-ui/src/app/utils/color.ts b/src-ui/src/app/utils/color.ts index b2899571e5..0b1e3af447 100644 --- a/src-ui/src/app/utils/color.ts +++ b/src-ui/src/app/utils/color.ts @@ -62,7 +62,7 @@ export function hslToRgb(h, s, l) { * @return Array The HSL representation */ export function rgbToHsl(r, g, b) { - ;(r /= 255), (g /= 255), (b /= 255) + ;((r /= 255), (g /= 255), (b /= 255)) var max = Math.max(r, g, b), min = Math.min(r, g, b) var h, diff --git a/src-ui/src/app/utils/custom-field-query-element.spec.ts b/src-ui/src/app/utils/custom-field-query-element.spec.ts index 411dcd6f92..e01af7fd43 100644 --- a/src-ui/src/app/utils/custom-field-query-element.spec.ts +++ b/src-ui/src/app/utils/custom-field-query-element.spec.ts @@ -1,4 +1,3 @@ -import { fakeAsync, tick } from '@angular/core/testing' import { CustomFieldQueryElementType, CustomFieldQueryLogicalOperator, @@ -111,13 +110,38 @@ describe('CustomFieldQueryAtom', () => { expect(atom.serialize()).toEqual([1, 'operator', 'value']) }) - it('should emit changed on value change after debounce', fakeAsync(() => { + it('should emit changed on value change immediately', () => { const atom = new CustomFieldQueryAtom() const changeSpy = jest.spyOn(atom.changed, 'next') atom.value = 'new value' - tick(1000) expect(changeSpy).toHaveBeenCalled() - })) + }) + + it('should ignore duplicate array emissions', () => { + const atom = new CustomFieldQueryAtom() + atom.operator = CustomFieldQueryOperator.In + const changeSpy = jest.fn() + atom.changed.subscribe(changeSpy) + + atom.value = [1, 2] + expect(changeSpy).toHaveBeenCalledTimes(1) + + changeSpy.mockClear() + atom.value = [1, 2] + expect(changeSpy).not.toHaveBeenCalled() + }) + + it('should emit when array values differ while length matches', () => { + const atom = new CustomFieldQueryAtom() + atom.operator = CustomFieldQueryOperator.In + const changeSpy = jest.fn() + atom.changed.subscribe(changeSpy) + + atom.value = [1, 2] + changeSpy.mockClear() + atom.value = [1, 3] + expect(changeSpy).toHaveBeenCalledTimes(1) + }) }) describe('CustomFieldQueryExpression', () => { diff --git a/src-ui/src/app/utils/custom-field-query-element.ts b/src-ui/src/app/utils/custom-field-query-element.ts index 3438f2c85a..34891641a6 100644 --- a/src-ui/src/app/utils/custom-field-query-element.ts +++ b/src-ui/src/app/utils/custom-field-query-element.ts @@ -1,4 +1,4 @@ -import { Subject, debounceTime, distinctUntilChanged } from 'rxjs' +import { Subject, distinctUntilChanged } from 'rxjs' import { v4 as uuidv4 } from 'uuid' import { CUSTOM_FIELD_QUERY_VALUE_TYPES_BY_OPERATOR, @@ -110,7 +110,22 @@ export class CustomFieldQueryAtom extends CustomFieldQueryElement { protected override connectValueModelChanged(): void { this.valueModelChanged - .pipe(debounceTime(1000), distinctUntilChanged()) + .pipe( + distinctUntilChanged((previous, current) => { + if (Array.isArray(previous) && Array.isArray(current)) { + if (previous.length !== current.length) { + return false + } + for (let i = 0; i < previous.length; i++) { + if (previous[i] !== current[i]) { + return false + } + } + return true + } + return previous === current + }) + ) .subscribe(() => { this.changed.next(this) }) diff --git a/src-ui/src/app/utils/ngb-date-parser-formatter.spec.ts b/src-ui/src/app/utils/ngb-date-parser-formatter.spec.ts index 3bf12e1f63..1ede0215ff 100644 --- a/src-ui/src/app/utils/ngb-date-parser-formatter.spec.ts +++ b/src-ui/src/app/utils/ngb-date-parser-formatter.spec.ts @@ -70,4 +70,26 @@ describe('LocalizedDateParserFormatter', () => { dateStr = dateParserFormatter.format(dateStruct) expect(dateStr).toEqual('04.05.2023') }) + + it('should handle years when current year % 100 < 50', () => { + jest.useFakeTimers() + jest.setSystemTime(new Date(2026, 5, 15)) + let val = dateParserFormatter.parse('5/4/26') + expect(val).toEqual({ day: 4, month: 5, year: 2026 }) + + val = dateParserFormatter.parse('5/4/75') + expect(val).toEqual({ day: 4, month: 5, year: 2075 }) + + val = dateParserFormatter.parse('5/4/99') + expect(val).toEqual({ day: 4, month: 5, year: 1999 }) + jest.useRealTimers() + }) + + it('should handle years when current year % 100 >= 50', () => { + jest.useFakeTimers() + jest.setSystemTime(new Date(2076, 5, 15)) + const val = dateParserFormatter.parse('5/4/00') + expect(val).toEqual({ day: 4, month: 5, year: 2100 }) + jest.useRealTimers() + }) }) diff --git a/src-ui/src/app/utils/ngb-date-parser-formatter.ts b/src-ui/src/app/utils/ngb-date-parser-formatter.ts index 99be6d88ad..48806a80a5 100644 --- a/src-ui/src/app/utils/ngb-date-parser-formatter.ts +++ b/src-ui/src/app/utils/ngb-date-parser-formatter.ts @@ -106,15 +106,25 @@ export class LocalizedDateParserFormatter extends NgbDateParserFormatter { value = this.preformatDateInput(value) let match = this.getDateParseRegex().exec(value) if (match) { + const currentYear = new Date().getFullYear() + const currentCentury = currentYear - (currentYear % 100) + + let year = +match.groups.year + if (year < 100) { + let fourDigitYear = currentCentury + year + // Mimic python-dateutil: keep result within -50/+49 years of current year + if (fourDigitYear > currentYear + 49) { + fourDigitYear -= 100 + } else if (fourDigitYear <= currentYear - 50) { + fourDigitYear += 100 + } + year = fourDigitYear + } + let dateStruct = { day: +match.groups.day, month: +match.groups.month, - year: +match.groups.year, - } - if (dateStruct.year <= new Date().getFullYear() - 2000) { - dateStruct.year += 2000 - } else if (dateStruct.year < 100) { - dateStruct.year += 1900 + year, } return dateStruct } else { diff --git a/src-ui/src/environments/environment.prod.ts b/src-ui/src/environments/environment.prod.ts index 251fe1899c..1e8adbc222 100644 --- a/src-ui/src/environments/environment.prod.ts +++ b/src-ui/src/environments/environment.prod.ts @@ -3,10 +3,10 @@ const base_url = new URL(document.baseURI) export const environment = { production: true, apiBaseUrl: document.baseURI + 'api/', - apiVersion: '9', // match src/paperless/settings.py + apiVersion: '10', // match src/paperless/settings.py appTitle: 'Paperless-ngx', tag: 'prod', - version: '2.19.3', + version: '2.20.11', webSocketHost: window.location.host, webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:', webSocketBaseUrl: base_url.pathname + 'ws/', diff --git a/src-ui/src/environments/environment.ts b/src-ui/src/environments/environment.ts index 1097404c3f..e5823e27e2 100644 --- a/src-ui/src/environments/environment.ts +++ b/src-ui/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, apiBaseUrl: 'http://localhost:8000/api/', - apiVersion: '9', + apiVersion: '10', appTitle: 'Paperless-ngx', tag: 'dev', version: 'DEVELOPMENT', diff --git a/src-ui/src/locale/messages.af_ZA.xlf b/src-ui/src/locale/messages.af_ZA.xlf index 4e85b7bb94..153d5faeab 100644 --- a/src-ui/src/locale/messages.af_ZA.xlf +++ b/src-ui/src/locale/messages.af_ZA.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Sluit @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Vorige @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Volgende @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Vorige maand @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Volgende maand @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sluit @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Kies maand @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Uur @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Kies jaar @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minute @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Eerste @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vermeerder ure @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vorige @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Verminder ure @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Volgende @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vermeerder minute @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Laaste @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Verminder minute @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekondes @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vermeerder sekondes @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Verminder sekondes @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumente @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Laai tans… + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Gevorderde soektog @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Bevestig skrap @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Wagwoord is verander, u sal vir nn oomblik afgeteken word. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bevestiging @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - nou - From @@ -3882,11 +3878,19 @@ Toegevoeg + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + nou + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Pad @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Kleur @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nie toegewys nie @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel & inhoud @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Meer soos @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 gelyk aan @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is leeg @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is nie leeg nie @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 groter as @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 kleiner as @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sonder korrespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sonder dokumenttipe @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sonder enige etiket @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Eienaar: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Eienaar nie in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Sonder ’n eienaar @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 suksesvol geskep. @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Fout by die skep van . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Fout by die skrap van . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 bergpad @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 bergpaaie @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Wil u regtig die bergpad “” skrap? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiket @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etikette @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Wil u regtig die etiket “” skrap? diff --git a/src-ui/src/locale/messages.ar_AR.xlf b/src-ui/src/locale/messages.ar_AR.xlf index 51d6b1cc89..d9918510cf 100644 --- a/src-ui/src/locale/messages.ar_AR.xlf +++ b/src-ui/src/locale/messages.ar_AR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 إغلاق @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 السابق @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 التالي @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 الشهر السابق @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 الشهر التالي @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 إغلاق @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 تحديد الشهر @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ساعات @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 اختر السنة @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 دقائق @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 الأول @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 زيادة الساعات @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 السابق @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 إنقاص الساعات @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 التالي @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 زيادة الدقائق @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 الأخير @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 إنقاص الدقائق @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ثوانٍ @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 زيادة الثواني @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 إنقاص الثواني @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 المستندات @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 تمكين @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ تحميل... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 بحث متقدم @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 تأكيد الحذف @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 تم تغيير كلمة المرور ، سيتم تسجيل خروجك مؤقتاً. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 تأكيد @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - الآن - From @@ -3882,11 +3878,19 @@ أضيف + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + الآن + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 مسار @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 لون @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ تصفية المسار - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - تنطبق على المستندات التي تطابق هذا المسار. يسمح باستخدام أحرف البدل المحددة كـ *. تطبيع الحالة.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned غير معين @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 فتح المرشح @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 البريد الإلكتروني يجب أن يتطابق @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 يجب أن تتطابق كلمات المرور @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 تم تحديث الملف الشخصي بنجاح @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 خطأ أثناء حفظ الملف الشخصي @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 خطأ أثناء إنشاء رمز المصادقة @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 خطأ أثناء قطع الاتصال بحساب الشبكة الاجتماعية @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 حقول مخصصة @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 العنوان & المحتوى @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 أكثر مثله @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 يساوي @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 فارغ @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 غير فارغ @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 أكبر من @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 أقل من @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 بدون مراسل @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 بدون نوع المستند @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 بدون مسار التخزين @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 بلا أي وسم @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 طلب الحقول المخصصة @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 العنوان: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 المالك: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 المالك ليس في: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 بدون مالك @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 خطأ أثناء تحديث الصلاحيات @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 تم إنشاء بنجاح. @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 حدث خطأ أثناء إنشاء . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 حدث خطأ أثناء حفظ . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 لن يتم حذف المستندات المرتبطة. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 خطأ أثناء حذف العنصر @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 تم تحديث الصلاحيات بنجاح @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 ستؤدي هذه العملية إلى حذف جميع الكائنات نهائيا. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 تمّ حذف الكائنات بنجاحٍ @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 خطأ أثناء حذف الكائنات @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 مسار التخزين @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 مسارات التخزين @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 هل تريد حقاً حذف مسار التخزين " @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 الوسم @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 الوسوم @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 هل ترغب حقاً في حذف العلامة " diff --git a/src-ui/src/locale/messages.be_BY.xlf b/src-ui/src/locale/messages.be_BY.xlf index cf2df56a99..91a80a3407 100644 --- a/src-ui/src/locale/messages.be_BY.xlf +++ b/src-ui/src/locale/messages.be_BY.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Закрыць @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Папярэдняя @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Наступная @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Папярэдні месяц @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Наступны месяц @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Закрыць @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Абраць месяц @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Гадзіны @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Абраць год @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Хвіліны @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Першы @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Прыбавіць гадзіну @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Папярэдняя @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Адняць гадзіну @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Наступная @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Прыбавіць хвіліну @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 На апошнюю @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Адняць хвіліну @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Секунды @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Прыбавіць секунду @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Адняць секунду @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Дакументы @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Загрузка... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Пашыраны пошук @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Пацвердзіце выдаленне @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Пацвярджэнне @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Дададзена + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Шлях @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Колер @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не прызначана @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Назва & змест @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Больш падобных @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 супадае з @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 пусты @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 не пусты @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 большы за @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 менш за @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Без карэспандэнта @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Без тыпу дакумента @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Без усялякага тэга @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Назва: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 шлях захоўвання @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 шляхі захоўвання @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Вы сапраўды хочаце выдаліць шлях захоўвання ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 тэг @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 тэгі @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Вы сапраўды хочаце выдаліць тэг ""? diff --git a/src-ui/src/locale/messages.bg_BG.xlf b/src-ui/src/locale/messages.bg_BG.xlf index f487665548..a3c9a11e44 100644 --- a/src-ui/src/locale/messages.bg_BG.xlf +++ b/src-ui/src/locale/messages.bg_BG.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Затвори @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Назад @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Напред @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Предишен месец @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Следващ месец @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Затвори @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Изберете месец @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Часове @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ММ @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Изберете година @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Минути @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Първи @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличете часове @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Предишен @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Намалете часовете @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Напред @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличете минутите @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Последен @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Намалете минутите @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Секунди @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличете секундите @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Намалете секундите @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Документи @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Активирай @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Зареждане... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Подробно търсене @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Потвърдете изтриването @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Паролата е променена, ще излезете моментално. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Потвърждение @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Относителни дати - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - сега - From @@ -3882,11 +3878,19 @@ Добавен + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + сега + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 В рамките на 1 седмица @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 В рамките на 1 месец @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 В рамките на 3 месеца @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 В рамките на 1 година @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Тази година @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Този месец @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Вчера + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Път @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Цвят @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Двуфакторното удостоверяване @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Деактивирайте двуфакторното удостоверяване @@ -5194,13 +5230,13 @@ Филтриране на път - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Прилагане към документи, които съответстват на този път. Разрешени са заместващи символи, посочени като *. Нормализирани по случай.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не е зададен @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Отвори филтър @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Сканирайте QR кода с вашето приложение за удостоверяване и след това въведете кода по-долу @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Ключ на автентификатора @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Можете да съхраните този ключ и да го използвате, за да преинсталирате приложението си за удостоверяване по-късно. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Код @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Кодовете за възстановяване няма да се показват отново, не забравяйте да ги запазите. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Копирайте кода @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Имейлите трябва да съвпадат @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Паролите трябва да съвпадат @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Профила е актуализиран успешно @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Грешка при запазването на профила @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Грешка при генериране на auth токен @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Грешка при прекъсване на връзката със социалния акаунт @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Грешка при извличане на настройките за TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP е активиран успешно @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Грешка при активирането на TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP е деактивиран успешно @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Грешка при деактивирането на TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Персонализирани полета @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Заглавие & съдържание @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Тип файл @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Още като @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 е равно на @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 е празно @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 не е празно @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 по-голямо от @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 по-малко от @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Кореспондент: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Без кореспондент @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Тип документ: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Без тип на документа @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Път за съхранение: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Без път за съхранение @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Етикет: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Без никакъв етикет @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Заявка за персонализирани полета @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Заглавие: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Архивен номер: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Собственик: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Собственикът не е в: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Без собственик @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Филтриране на документи () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Грешка при актуализиране на правата @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Успешно създаден . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Възникна грешка при създаването . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Успешно актуализиран "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Възникна грешка при запазване . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Свързаните документи няма да бъдат изтрити. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Грешка при изтриване на елемент @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Правата са актуализирани успешно @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Тази операция ще изтрие завинаги всички обекти. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Обектите са успешно изтрити @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Грешки при изтриване на обектите @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 път към хранилище @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 пътища за съхранение @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Наистина ли искате да изтриете пътя за съхранение ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 етикет @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 етикети @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Наистина ли искате да изтриете етикета ""? diff --git a/src-ui/src/locale/messages.ca_ES.xlf b/src-ui/src/locale/messages.ca_ES.xlf index ee2cc33880..6378cdc45d 100644 --- a/src-ui/src/locale/messages.ca_ES.xlf +++ b/src-ui/src/locale/messages.ca_ES.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Tanca @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Anterior @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Següent @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mes anterior @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mes següent @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Tanca @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleccioneu mes @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Hores @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleccioneu un any @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuts @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primer @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementa hores @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Anterior @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir hores @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Següent @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar minuts @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Últim @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir minuts @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Segons @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar segons @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir segons @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documents @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Activa @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + línies Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Carregant... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Vés al final + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Cerca avançada @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirma eliminació @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Contrasenya desada, es tancarà la sessió momentàniament. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmació @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Dates relatives - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - ara - From @@ -3882,11 +3878,19 @@ Afegit + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + ara + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 En 1 setmana @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 En 1 mes @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 En 3 mesos @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 En 1 any @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Aquest any @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Aquest mes @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Ahir + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Setmana anterior + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Mes anterior + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Quatrimestre Ant + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Any passat + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Camí @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Color @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autenticació de doble factor @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Desactivar l'autentificació de doble factor @@ -5194,13 +5230,13 @@ Filtra ruta - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned No assignat @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Obrir filtre @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Escaneja el codi QR amb la teva app d'autentificació i insereix el codi @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Secret d'Autentificació @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Pots desar el codi secret i usar més tard per reinstalar la teva app d'autentificació. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Codi @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Els codis de recuperació no es tornaran a mostrar, assegura't de desar-los. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copia els Codis @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Email ha de coindidir @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Contrasenya ha de coincidir @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Perfil actualitzat corrcetament @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error desant perfil @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generant auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error desconnectant compte social @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error obtenint les opcions TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activat correctament @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activant TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP desactivat correctament @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error desactivant TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Camps personalitzats @@ -8700,7 +8736,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Selecciona: None @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Títol i contingut @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Tipus de fitxer @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Més com @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 és igual a @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 està buit @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 no està buit @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 més gran que @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 més petit que @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Corresponsal: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sense corresponsal @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Tipus Document: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sense tipus de document @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Ruta Emmagazematge: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Sense ruta emmagatzematge @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Etiqueta: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sense cap etiqueta @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Consulta de camps personalitzats @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Títol: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Propietari: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Propietari no és: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Sense propietari @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtra Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error actualitzant permisos @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Creat correctament . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error creant . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Actualitzat correctament "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error al guardar . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Documents assocuiats no seran esborrats. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error esborrant element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permisos actualitzats correctament @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Aquesta operació esborrarà tots els objectes. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objecte esborrat correctament @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error esborrant objectes @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 ruta emmagatzematge @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 rutes emmagatzematge @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Esborrar ruta emmagatzematge ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiqueta @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etiquetes @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Esborrar etiqueta ""? diff --git a/src-ui/src/locale/messages.cs_CZ.xlf b/src-ui/src/locale/messages.cs_CZ.xlf index a1102aa48d..7b74628b65 100644 --- a/src-ui/src/locale/messages.cs_CZ.xlf +++ b/src-ui/src/locale/messages.cs_CZ.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zavřít @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Předchozí @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Následující @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Předchozí měsíc @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Následující měsíc @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zavřít @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vybrat měsíc @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Hodin @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vybrat rok @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuty @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 První @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zvýšení počtu hodin @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Předchozí @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Snížení počtu hodin @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Následující @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zvýšení počtu minut @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Poslední @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Snížení počtu minut @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundy @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zvýšení počtu sekund @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Snížení počtu sekund @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenty @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Povolit @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + řádky Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Načítání... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Přejít na konec + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Pokročilé vyhledávání @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Potvrdit smazání @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Heslo bylo změněno, za chvíli budete odhlášeni. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potvrzení @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relativní datum - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - nyní - From @@ -3882,11 +3878,19 @@ Přidáno + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + nyní + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Během 1 týdne @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Během 1 měsíce @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Během 3 měsíců @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Během 1 roku @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Tento rok @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Tento měsíc @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Včera + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Předchozí týden + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Předchozí měsíc + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Předchozí čtvrtletí + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Předchozí rok + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Cesta @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Barva @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Dvoufázové ověření @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Zakázat dvoufázové ověření @@ -5194,13 +5230,13 @@ Filtr cesty - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Použít na dokumenty odpovídající této cestě. Zástupné symboly zadané jako * jsou povoleny. Velká a malá písmena jsou normalizována.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nepřiřazeno @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Otevřít filtr @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Naskenujte kód QR pomocí ověřovací aplikace a poté zadejte níže uvedený kód @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Tajný klíč ověření @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Tento tajný klíč můžete uložit a později jej použít k opětovné instalaci ověřovací aplikace. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kód @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Obnovovací kódy se znovu nezobrazí, nezapomeňte si je uložit. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopírovat kódy @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 E-maily se musí shodovat @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Hesla se musí shodovat @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil úspěšně aktualizován @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Chyba při ukládání profilu @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Chyba při generování ověřovacího tokenu @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Chyba při odpojování účtu sociální sítě @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Chyba při získávání nastavení TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP úspěšně aktivováno @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Chyba při aktivaci TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP úspěšně deaktivováno @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Chyba při deaktivaci TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Vlastní pole @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Vybrat: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Název a obsah @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Typ souboru @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Podobné @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 rovná se @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 je prázdný @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 není prázdný @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 větší než @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 menší než @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Korespondent: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Bez korespondenta @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Typ dokumentu: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Bez typu dokumentu @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Cesta k úložišti: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Bez cesty k úložišti @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Štítek: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Bez štítku @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Dotaz na vlastní pole @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Název: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 SČA: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Vlastník: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Vlastník není v: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Bez vlastníka @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtrovat dokumenty () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Chyba při aktualizaci oprávnění @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Úspěšně vytvořeno . @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Došlo k chybě při vytváření . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 “ úspěšně aktualizován. @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Došlo k chybě při ukládání . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Související dokumenty nebudou odstraněny. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Chyba při odstraňování prvku @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Oprávnění úspěšně aktualizována @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Tato operace trvale odstraní všechny objekty. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objekty úspěšně odstraněny @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Chyba při odstraňování objektů @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 cesta k úložišti @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 cesty k úložišti @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Opravdu chcete odstranit cestu k úložišti „“? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 štítek @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 štítky @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Opravdu chcete odstranit štítek ""? diff --git a/src-ui/src/locale/messages.da_DK.xlf b/src-ui/src/locale/messages.da_DK.xlf index c22f037853..adb6883e7f 100644 --- a/src-ui/src/locale/messages.da_DK.xlf +++ b/src-ui/src/locale/messages.da_DK.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Luk @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Forrige @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Næste @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Forrige måned @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Næste måned @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Luk @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vælg måned @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Timer @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vælg år @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutter @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Første @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Forøg timer @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Forrige @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reducer timer @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Næste @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Forøg minutter @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sidste @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reducer minutter @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunder @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Forøg sekunder @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reducer sekunder @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenter @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Indlæser... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Avanceret søgning @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Bekræft sletning @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bekræftelse @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Tilføjet + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Path @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Farve @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ikke tildelt @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel & indhold @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Mere som @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Uden korrespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Uden dokumenttype @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Uden nogen etiket @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiket @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etiketter @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Er du sikker på, at du vil slette etiketten ""? diff --git a/src-ui/src/locale/messages.de_DE.xlf b/src-ui/src/locale/messages.de_DE.xlf index ff14fdc8b5..9079c21b06 100644 --- a/src-ui/src/locale/messages.de_DE.xlf +++ b/src-ui/src/locale/messages.de_DE.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Schließen @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Vorherige @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Nächste @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Vorheriger Monat @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Nächster Monat @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Schließen @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Monat auswählen @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stunden @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Jahr auswählen @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Erste @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stunden erhöhen @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vorherige @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stunden verringern @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Nächste @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten erhöhen @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Letzte @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten verringern @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunden @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunden erhöhen @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunden verringern @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumente @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Aktivieren @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -758,13 +758,13 @@ Anzeigen - + lines src/app/components/admin/logs/logs.component.html 17 - Zeilen + Zeilen Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Wird geladen... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Nach unten + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Erweiterte Suche @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2142,21 +2150,21 @@ Alle Aufgaben verwerfen? - + Error dismissing tasks src/app/components/admin/tasks/tasks.component.ts 161 - Fehler beim Verwerfen der Aufgaben + Fehler beim Verwerfen der Aufgaben - + Error dismissing task src/app/components/admin/tasks/tasks.component.ts 170 - Fehler beim Verwerfen der Aufgabe + Fehler beim Verwerfen der Aufgabe queued @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Löschen bestätigen @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Das Kennwort wurde geändert, Sie werden nun abgemeldet. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bestätigung @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative Datumsangaben - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - jetzt - From @@ -3882,11 +3878,19 @@ Hinzugefügt am + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + jetzt + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Innerhalb einer Woche @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Innerhalb eines Monats @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Innerhalb von 3 Monaten @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Innerhalb eines Jahres @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Aktuelles Jahr @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Aktueller Monat @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Gestern + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Vorherige Woche + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Vorheriger Monat + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Vorheriges Quartal + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Vorheriges Jahr + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Pfad @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Farbe @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Zwei-Faktor-Authentifizierung @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Zwei-Faktor-Authentifizierung deaktivieren @@ -5194,13 +5230,13 @@ Pfad filtern - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Auf Dokumente anwenden, die mit diesem Pfad übereinstimmen. Platzhalter wie * sind zulässig. Groß- und Kleinschreibung normalisiert.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5234,21 +5270,21 @@ Inhaltsabgleichsmuster - + Advanced Filters src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Erweiterte Filter + Erweiterte Filter - + Add filter src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Filter hinzufügen + Filter hinzufügen No advanced workflow filters defined. @@ -5638,29 +5674,29 @@ Webhook - + Has any of these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 203 - Hat beliebige dieser Tags + Hat beliebige dieser Tags - + Has all of these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - Hat alle diese Tags + Hat alle diese Tags - + Does not have these tags src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 217 - Hat diese Tags nicht + Hat diese Tags nicht Has correspondent @@ -5670,13 +5706,13 @@ Hat Korrespondent - + Does not have correspondents src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 232 - Korrespondent ist nicht + Korrespondent ist nicht Has document type @@ -5686,13 +5722,13 @@ Hat Dokumenttyp - + Does not have document types src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 248 - Dokumenttyp ist nicht + Dokumenttyp ist nicht Has storage path @@ -5702,13 +5738,13 @@ hat Speicherpfad - + Does not have storage paths src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 264 - Speicherpfad ist nicht + Speicherpfad ist nicht Matches custom field query @@ -5734,13 +5770,13 @@ Arbeitsablauf bearbeiten - + {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} src/app/components/common/email-document-dialog/email-document-dialog.component.html 2,6 - {VAR_PLURAL, plural, =1 {Dokument mailen} other { Dokumente mailen}} + {VAR_PLURAL, plural, =1 {Dokument mailen} other { Dokumente mailen}} Email address(es) @@ -5786,13 +5822,13 @@ E-Mail senden - + Some email servers may reject messages with large attachments. src/app/components/common/email-document-dialog/email-document-dialog.component.html 37 - Einige E-Mail-Server lehnen Nachrichten mit großen Anhängen ab. + Einige E-Mail-Server lehnen Nachrichten mit großen Anhängen ab. Email sent @@ -5802,13 +5838,13 @@ E-Mail gesendet - + Error emailing documents src/app/components/common/email-document-dialog/email-document-dialog.component.ts 69 - Fehler beim Senden der Dokumente + Fehler beim Senden der Dokumente Error emailing document @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nicht zugewiesen @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Filter öffnen @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scannen Sie den QR-Code mit Ihrer Authentifizierungs-App und geben Sie anschließend den Code unten ein @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authentifizierungsschlüssel @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Sie können diesen Schlüssel speichern und verwenden, um Ihre Authentifizierungs-App zu einem späteren Zeitpunkt neu zu installieren. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Wiederherstellungscodes werden nicht erneut angezeigt. Stellen Sie sicher, dass sie gesichert wurden. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Codes kopieren @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 E-Mail-Adressen müssen übereinstimmen @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Kennwörter müssen übereinstimmen @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil erfolgreich aktualisiert @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Fehler beim Speichern des Profils @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Fehler beim Generieren des Authentifizierungstokens @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Fehler beim Trennen des Drittanbieterkontos @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Fehler beim Abrufen der TOTP-Einstellungen @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP erfolgreich aktiviert @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Fehler beim Aktivieren von TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP erfolgreich deaktiviert @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Fehler beim Deaktivieren von TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8034,13 +8070,13 @@ Drucken fehlgeschlagen. - + Error loading document for printing. src/app/components/document-detail/document-detail.component.ts 1472 - Fehler beim Laden des Dokuments für den Druck. + Fehler beim Laden des Dokuments für den Druck. An error occurred loading tiff: @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Benutzerdefinierte Felder @@ -8693,13 +8729,13 @@ Alles auswählen - + Select: src/app/components/document-list/document-list.component.html 18 - Auswählen: + Auswählen: None @@ -8709,13 +8745,13 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts 45 - Keiner + Keine Sort @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel & Inhalt @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Dateityp @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Ähnlich zu @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 entspricht @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 ist leer @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 ist nicht leer @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 größer als @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 kleiner als @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Korrespondent: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Ohne Korrespondent @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Dokumenttyp: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Ohne Dokumenttyp @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Speicherpfad: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Ohne Speicherpfad @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Ohne Tag @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Benutzerdefinierte Feldabfrage @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Eigentümer: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Eigentümer nicht in: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Ohne Eigentümer @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Dokumente filtern () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Fehler beim Aktualisieren der Berechtigungen @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 erfolgreich erstellt. @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Fehler beim Erstellen von . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 “ erfolgreich aktualisiert. @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Fehler beim Speichern von . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Verknüpfte Dokumente werden nicht gelöscht. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Fehler beim Löschen des Elements @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Berechtigungen wurden erfolgreich aktualisiert @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Dieser Vorgang wird alle Objekte unwiderruflich löschen. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objekte erfolgreich gelöscht @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Fehler beim Löschen der Objekte @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 Speicherpfad @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 Speicherpfade @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Möchten Sie den Speicherpfad „“ wirklich löschen? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 Tag @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 Tags @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Möchten Sie das Tag „“ wirklich löschen? @@ -10393,13 +10429,13 @@ Dokumentenverknüpfung - + Long Text src/app/data/custom-field.ts 55 - Langer Text + Langer Text Search score @@ -10504,7 +10540,7 @@ src/app/data/matching-model.ts 46 - Keine: Automatische Zuweisung deaktivieren + Keiner: Automatische Zuweisung deaktivieren General Settings diff --git a/src-ui/src/locale/messages.el_GR.xlf b/src-ui/src/locale/messages.el_GR.xlf index 48c78bc6bd..374944b040 100644 --- a/src-ui/src/locale/messages.el_GR.xlf +++ b/src-ui/src/locale/messages.el_GR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Κλείσιμο @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Προηγούμενο @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Επόμενο @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Προηγούμενος μήνας @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Επόμενος μήνας @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Κλείσιμο @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Επιλογή μήνα @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ώρες @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ΜΜ @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Επιλογή έτους @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Λεπτά @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Πρώτο @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Προσαύξηση ωρών @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Προηγούμενο @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Μείωση ωρών @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Επόμενο @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Προσαύξηση λεπτών @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Τελευταίο @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Μείωση λεπτών @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Δευτερόλεπτα @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Προσαύξηση δευτερολέπτων @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Μείωση δευτερολέπτων @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Έγγραφα @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Ενεργοποίηση @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Φόρτωση... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Σύνθετη αναζήτηση @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Επιβεβαίωση διαγραφής @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Ο κωδικός πρόσβασης έχει αλλάξει, θα αποσυνδεθείτε αμέσως. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Επιβεβαίωση @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - τώρα - From @@ -3882,11 +3878,19 @@ Προστέθηκε + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + τώρα + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Διαδρομή @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Χρώμα @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Δεν έχει ανατεθεί @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Τίτλος & περιεχόμενο @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Περισσότερα σαν @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 ίσον @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 είναι κενό @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 δεν είναι κενό @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 μεγαλύτερο από @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 μικρότερο από @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Χωρίς ανταποκριτή @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Χωρίς τύπο εγγράφου @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Χωρίς διαδρομή αποθήκευσης @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Χωρίς καμία ετικέτα @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Τίτλος: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Ιδιοκτήτης: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Ιδιοκτήτης όχι σε: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Χωρίς ιδιοκτήτη @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Δημιουργήθηκε επιτυχώς . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Παρουσιάστηκε σφάλμα κατά τη δημιουργία του . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Παρουσιάστηκε σφάλμα κατά την αποθήκευση του . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Σφάλμα κατά τη διαγραφή του στοιχείου @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 διαδρομή αποθήκευσης @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 διαδρομές αποθήκευσης @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Θέλετε πραγματικά να διαγράψετε τη διαδρομή αποθήκευσης ""; @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 ετικέτα @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 ετικέτες @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Θέλετε πραγματικά να διαγράψετε την ετικέτα ""; diff --git a/src-ui/src/locale/messages.es_ES.xlf b/src-ui/src/locale/messages.es_ES.xlf index c97136cb5f..f647048981 100644 --- a/src-ui/src/locale/messages.es_ES.xlf +++ b/src-ui/src/locale/messages.es_ES.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Cerrar @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Anterior @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Siguiente @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mes anterior @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mes siguiente @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Cerrar @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleccionar mes @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Horas @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleccionar año @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutos @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primero @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar horas @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Anterior @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir horas @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Siguiente @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar minutos @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Último @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir minutos @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Segundos @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar segundos @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Disminuir segundos @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documentos @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Activar @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Cargando... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Búsqueda avanzada @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirmar borrado @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 La contraseña ha sido cambiada, tu sesión será cerrada en un momento. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmación @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Fechas relativas - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - ahora - From @@ -3882,11 +3878,19 @@ Agregado + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + ahora + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 En 1 semana @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 En 1 mes @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 En 3 meses @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 En 1 año @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Este año @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Este mes @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Ayer + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Ruta @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Color @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autenticación de dos factores @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Deshabilitar la autenticación de doble factor @@ -5194,13 +5230,13 @@ Filtrar ruta - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Aplicar a documentos que coincidan con esta ruta. Comodines especificados como * están permitidos. No distingue mayúsculas.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Sin asignar @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Abrir filtro @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Escanee el código QR con su aplicación de autenticación e ingrese el código de abajo @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Secreto de autenticación @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Puedes guardar este secreto y usarlo para reinstalar tu aplicación de autenticación más adelante. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Código @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Los códigos de recuperación no se mostrarán de nuevo, asegúrese de guardarlos. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copiar códigos @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Las direcciones de correo deben coincidir @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Las contraseñas deben coincidir @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Perfil actualizado correctamente @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error al guardar el perfil @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generando token de autenticación @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error al desconectar la cuenta de red social @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error obteniendo ajustes TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activado correctamente @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activando TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP desactivado correctamente @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error desactivando TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Campos personalizados @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titulo y contenido @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Tipo archivo @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Más parecido @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 es igual a @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 está vacío @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 no está vacío @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 es mayor que @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 es menor que @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sin interlocutor @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sin tipo de documento @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Sin ruta de almacenamiento @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sin ninguna etiqueta @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Consulta de campos personalizados @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Título: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 NSA: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Propietario: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Propietario no en: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Sin un propietario @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtrar documentos () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error al actualizar permisos @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Creado correctamente . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Ha ocurrido un error al crear . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Actualizado correctamente "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Ha ocurrido un error al guardar . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Los documentos asociados no se eliminarán. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error al eliminar el elemento @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permisos correctamente actualizados @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Esta operación eliminará todos los objetos permanentemente. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objetos eliminados con éxito @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error al eliminar objetos @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 ruta de almacenamiento @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 rutas de almacenamiento @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 ¿Realmente desea eliminar la ruta de almacenamiento ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiqueta @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etiquetas @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 ¿Estás seguro de querer borrar la etiqueta ""? diff --git a/src-ui/src/locale/messages.et_EE.xlf b/src-ui/src/locale/messages.et_EE.xlf index 3540ec9280..f308118cf9 100644 --- a/src-ui/src/locale/messages.et_EE.xlf +++ b/src-ui/src/locale/messages.et_EE.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Close @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Previous @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Next @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Previous month @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Next month @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Close @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Select month @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Hours @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Select year @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutes @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 First @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment hours @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Previous @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement hours @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Next @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment minutes @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Last @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement minutes @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seconds @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment seconds @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement seconds @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documents @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Loading... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Advanced search @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirm delete @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmation @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Added + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Path @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Color @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Not assigned @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Without any tag @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tags @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.fa_IR.xlf b/src-ui/src/locale/messages.fa_IR.xlf index c703ce79b5..f60ffb4a03 100644 --- a/src-ui/src/locale/messages.fa_IR.xlf +++ b/src-ui/src/locale/messages.fa_IR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 نزدیک @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 قبلی @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 طرف دیگر @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 ماه قبل @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 ماه بعد @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 نزدیک @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ماه را انتخاب کنید @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ساعت @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 " @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 مگنی @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 سال را انتخاب کنید @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 دقایقی @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 اولی @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ساعات افزایشی @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 قبلی @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ساعات کاهش @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 طرف دیگر @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 چند دقیقه افزایشی @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 آخرین @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 دقیقه کاهش @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ثانیه @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ثانیه های افزایشی @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ثانیه کاهش @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 اسناد @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 فعال کردن @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ بارگیری ... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 جستجوی پیشرفته @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 حذف را تأیید کنید @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 رمز عبور تغییر کرده است ، شما لحظه به لحظه از سیستم خارج می شوید. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 تأیید @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ خرمای نسبی - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - در حال حاضر - From @@ -3882,11 +3878,19 @@ اضافه شده + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + در حال حاضر + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 ظرف 1 هفته @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 طی 1 ماه @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 ظرف 3 ماه @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 ظرف 1 سال @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 امسال @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 این ماه @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ دیروز + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 مسیر @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 رنگ @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 احراز هویت دو عاملی @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 تأیید اعتبار دو عاملی را غیرفعال کنید @@ -5194,13 +5230,13 @@ مسیر فیلتر - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned اختصاص داده نشده است @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 کد QR را با برنامه تأیید کننده خود اسکن کرده و سپس کد زیر را وارد کنید @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 راز تأیید کننده @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 می توانید این راز را ذخیره کرده و از آن برای نصب مجدد برنامه تأیید کننده خود در زمان بعدی استفاده کنید. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 رمز @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 کدهای بازیابی دوباره نشان داده نمی شوند ، حتماً آنها را ذخیره کنید. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 کپی کدها @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 ایمیل باید مطابقت داشته باشد @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 رمزهای عبور باید مطابقت داشته باشند @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 پروفایل با موفقیت به روز شد @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 نمایه ذخیره خطا @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 خطای ایجاد کننده AUTH @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 قطع خطا حساب اجتماعی @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 خطا در تنظیمات TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP با موفقیت فعال شد @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 خطا در فعال کردن TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP با موفقیت غیرفعال شد @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 خطای غیرفعال کردن TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 زمینه های سفارشی @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 نوع پرونده @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 بیشتر شبیه @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 برابر است @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 خالی است @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 خالی نیست @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 بزرگتر از @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 کمتر از @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 بدون خبرنگار @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 بدون نوع سند @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 بدون مسیر ذخیره سازی @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 بدون هیچ برچسب @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 پرس و جو زمینه های سفارشی @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 بدون مالک @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 خطای به روزرسانی مجوزها @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 اسناد مرتبط حذف نمی شوند. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 خطا هنگام حذف عنصر @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 مجوزها با موفقیت به روز شد @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 این عمل به طور دائم تمام اشیاء را حذف می کند. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 اشیاء با موفقیت حذف شدند @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 خطای حذف اشیاء @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 مسیر ذخیره سازی @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 مسیرهای ذخیره سازی @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 نشان @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 برچسب ها @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.fi_FI.xlf b/src-ui/src/locale/messages.fi_FI.xlf index 9075d6e51c..90e871c6e2 100644 --- a/src-ui/src/locale/messages.fi_FI.xlf +++ b/src-ui/src/locale/messages.fi_FI.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Sulje @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Edellinen @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Seuraava @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Edellinen kuukausi @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Seuraava kuukausi @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sulje @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Valitse kuukausi @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Tuntia @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Valitse vuosi @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuuttia @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ensimmäinen @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Lisää tunteja @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Edellinen @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pienennä tunteja @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seuraava @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Lisää minuutteja @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Viimeinen @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pienennä minuutteja @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekuntia @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Lisäys sekunteina @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vähennys sekunteina @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Asiakirjat @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Käytä @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Ladataan... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Laajennettu haku @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Vahvista poisto @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Salasana on vaihdettu, sinut kirjataan ulos hetken kuluttua. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -2860,7 +2868,7 @@ src/app/components/admin/users-groups/users-groups.component.ts 153 - Deleted user "" + Poistettu käyttäjä "" Error deleting user "". @@ -3240,7 +3248,7 @@ src/app/components/app-frame/global-search/global-search.component.html 26 - Search + Hae Open @@ -3268,7 +3276,7 @@ src/app/components/document-list/document-card-small/document-card-small.component.html 143 - Open + Avaa Filter documents @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Vahvistus @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3716,7 +3724,7 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html 101 - True + Tosi False @@ -3732,7 +3740,7 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html 102 - False + Epätosi Search docs... @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - nyt - From @@ -3882,11 +3878,19 @@ Lisätty + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + nyt + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Eilen + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Polku @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Väri @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Suodata polku - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ei määritetty @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6186,7 +6222,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 9 - Select all pages + Valitse kaikki sivut Deselect all pages @@ -6202,7 +6238,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 17 - Rotate selected pages counter-clockwise + Kierrä valittuja sivuja vastapäivään Rotate selected pages clockwise @@ -6210,7 +6246,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 20 - Rotate selected pages clockwise + Kierrä valittuja sivuja myötäpäivään Delete selected pages @@ -6218,7 +6254,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 23 - Delete selected pages + Poista valitut sivut Rotate page counter-clockwise @@ -6226,7 +6262,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 33 - Rotate page counter-clockwise + Kierrä sivua vastapäivään Rotate page clockwise @@ -6234,7 +6270,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 36 - Rotate page clockwise + Kierrä sivua myötäpäivään Delete page @@ -6242,7 +6278,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 41 - Delete page + Poista sivu Add / remove document split here @@ -6282,7 +6318,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 94 - Copy metadata + Kopioi metatiedot Delete original @@ -6290,7 +6326,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 98 - Delete original + Poista alkuperäinen Merge with existing permissions @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Koodi @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Palautuskoodeja ei näytetä uudelleen; varmista, että tallennat ne. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopioi koodit @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Sähköpostien on vastattava toisiaan @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Salasanojen pitää täsmätä @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profiili päivitetty onnistuneesti @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Virhe profiilia tallentaessa @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Virhe yhteyttä sosiaaliseen tiliin katkaistaessa @@ -6676,35 +6712,35 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 - Error fetching TOTP settings + Virhe haettaessa TOTP-asetuksia TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 - TOTP activated successfully + TOTP aktivoitu onnistuneesti Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 - Error activating TOTP + Virhe aktivoitaessa TOTP:tä TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,13 +6748,13 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 - Error deactivating TOTP + Virhe poistettaessa käytöstä TOTP:tä No existing links @@ -7062,7 +7098,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 261 - OK + OK Copy Raw Error @@ -7278,7 +7314,7 @@ src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 6 - Upload documents + Lähetä asiakirjoja or drop files anywhere @@ -7286,7 +7322,7 @@ src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 7 - or drop files anywhere + tai pudota tiedostoja mihin tahansa Dismiss completed @@ -7400,7 +7436,7 @@ src/app/components/document-detail/document-detail.component.html 7,8 - of + / - @@ -7444,7 +7480,7 @@ src/app/components/document-detail/document-detail.component.html 58 - Print + Tulosta More like this @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8032,7 +8068,7 @@ src/app/components/document-detail/document-detail.component.ts 1460 - Print failed. + Tulostus epäonnistui. Error loading document for printing. @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Mukautetut kentät @@ -8700,7 +8736,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Valitse: None @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Otsikko & sisältö @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Tiedostotyyppi @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Enemmän kuin @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 on yhtä kuin @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 on tyhjä @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 ei ole tyhjä @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 suurempi kuin @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 pienempi kuin @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Ilman kirjeenvaihtajaa @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Ilman asiakirjatyyppiä @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Ilman tunnistetta @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Otsikko: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Omistaja: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Virhe käyttöoikeuksia päivittäessä @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Onnistuneesti luotu . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Virhe luotaessa . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Virhe tallennettaessa : . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Virhe elementtiä poistaessa @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Käyttöoikeudet päivitettiin onnistuneesti @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 tallennustilan polku @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 tallennustilan polut @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Haluatko varmasti poistaa asiakirjapolun ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tunniste @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tunnisteet @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Haluatko varmasti poistaa asiakirjatagin ""? @@ -10280,7 +10316,7 @@ src/app/data/custom-field-query.ts 28 - Contains + Sisältää Contains (case-insensitive) @@ -10288,7 +10324,7 @@ src/app/data/custom-field-query.ts 29 - Contains (case-insensitive) + Sisältää (kirjainkoolla ei merkitystä) Greater than @@ -10336,7 +10372,7 @@ src/app/data/custom-field.ts 19 - Boolean + Totuusarvo Date @@ -10529,7 +10565,7 @@ src/app/data/paperless-config.ts 52 - Barcode Settings + Viivakoodin asetukset Output Type @@ -10657,7 +10693,7 @@ src/app/data/paperless-config.ts 193 - Enable TIFF Support + Ota TIFF-tuki käyttöön Barcode String diff --git a/src-ui/src/locale/messages.fr_FR.xlf b/src-ui/src/locale/messages.fr_FR.xlf index 439c2474fa..2ddc5554f2 100644 --- a/src-ui/src/locale/messages.fr_FR.xlf +++ b/src-ui/src/locale/messages.fr_FR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Fermer @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Précédent @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Suivant @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mois précédent @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mois suivant @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Fermer @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sélectionner le mois @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Heures @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sélectionner l'année @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutes @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Premier @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrémenter les heures @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Précédent @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Décrémenter les heures @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Suivant @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrémenter les minutes @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Dernier @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Décrémenter les minutes @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Secondes @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrémenter les secondes @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Décrémenter les secondes @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documents @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Activer @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + lignes Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Chargement... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Aller au bas + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Recherche avancée @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirmer la suppression @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Le mot de passe a été modifié, vous serez déconnecté momentanément. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmation @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Dates relatives - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - maintenant - From @@ -3882,11 +3878,19 @@ Date d'ajout + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + maintenant + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Dans un délai de 1 semaine @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Dans un délai de 1 mois @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Dans un délai de 3 mois @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Dans un délai de 1 an @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Cette année @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Ce mois-ci @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Hier + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Semaine dernière + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Mois dernier + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Trimestre dernier + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Année dernière + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Chemin @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Couleur @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Authentification à deux facteurs @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Désactiver l'authentification à deux facteurs @@ -5194,13 +5230,13 @@ Filtrer le chemin - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Appliquer aux documents qui correspondent à ce chemin. Les caractères génériques tels que "*" sont autorisés. Normalisation de la casse.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Non affecté @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Ouvrir le filtre @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scannez le code QR avec votre application d'authentification puis saisissez le code ci-dessous @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Secret d'authentification @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Vous pouvez conserver ce secret et l’utiliser pour réinstaller votre application d’authentification ultérieurement. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Les codes de secours ne seront plus affichés, assurez-vous de les sauvegarder. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copier les codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Les e-mails doivent correspondre @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Les mots de passe doivent correspondre @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil mis à jour avec succès @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Erreur lors de l'enregistrement du profil @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Erreur lors de la génération du jeton d'authentification @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Erreur lors de la déconnexion du compte social @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Erreur lors de la récupération des paramètres du TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activé avec succès @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Erreur lors de l’activation du TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP désactivé avec succès @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Erreur lors de la désactivation du TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Champs personnalisés @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Sélectionner : None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titre & contenu @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Type de fichier @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Plus comme @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 est égal à @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 est vide @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 n'est pas vide @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 est supérieur à @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 est inférieur à @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondant : @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sans correspondant @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Type de document : @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sans type de document @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Chemin de stockage : @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Sans chemin de stockage @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Étiquette : @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sans étiquette @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Champs personnalisés de requête @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titre : @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 NSA : @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Propriétaire : @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Propriétaire non présent dans : @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Sans propriétaire @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtrer les documents () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Erreur lors de la mise à jour des droits d'accès @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Création de réussie. @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Une erreur s'est produite lors de la création de . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Mise à jour réussie pour "". @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Une erreur s'est produite lors de la sauvegarde de . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Les documents associés ne seront pas supprimés. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Erreur lors de la suppression de l'élément @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Les droits d'accès ont bien été mis à jour @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Cette opération supprimera définitivement tous les objets. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects supprimés avec succès @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Erreur lors de la suppression des objets @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 chemin de stockage @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 chemins de stockage @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Voulez-vous vraiment supprimer le chemin de stockage " " ? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 étiquette @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 étiquettes @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Voulez-vous vraiment supprimer l'étiquette « » ? diff --git a/src-ui/src/locale/messages.he_IL.xlf b/src-ui/src/locale/messages.he_IL.xlf index 06c3374858..d80f45b11c 100644 --- a/src-ui/src/locale/messages.he_IL.xlf +++ b/src-ui/src/locale/messages.he_IL.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 סגור @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 הקודם @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 הבא @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 חודש קודם @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 חודש הבא @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 שש @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 סגירה @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 בחירת חודש @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 שעות @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 חח @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 בחר שנה @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 דקות @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ראשון @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הגדלת שעות @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 קודם @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הקטנת שעות @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הבא @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הגדלת דקות @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 אחרון @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הקטנת דקות @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 שש @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 שניות @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הגדלת שניות @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 הקטנת שניות @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 מסמכים @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 פעיל @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ טוען... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 חיפוש מתקדם @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 אישור מחיקה @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 הסיסמה השתנתה. אתה תנותק מהמערכת בתוך זמן קצר @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 אישור @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ תאריכים יחסיים - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - עכשיו - From @@ -3882,11 +3878,19 @@ נוסף + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + עכשיו + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 בתוך שבוע אחד @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 בתוך חודש אחד @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 בתוך שלושה חודשים @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 בתוך שנה אחת @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 השנה הזאת @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 החודש הזה @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ אתמול + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 נתיב @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 צבע @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 אימות דו-שלבי @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 השבת אימות דו-שלבי @@ -5194,13 +5230,13 @@ מסנן לפי נתיב שמירה - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - חל על מסמכים התואמים את נתיב זה. תווים כלליים המצוינים כ-* מותרים. רישיות מנורמלת.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned לא הוקצה @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 פתחו מסנן @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 סירקו את קוד ה-QR עם אפליקציית המאמת שלכם ולאחר מכן הזינו את הקוד למטה @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 סוד המאמת @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 אתם יכולים לאחסן את הסוד הזה ולהשתמש בו כדי להתקין מחדש את אפליקציית המאמת שלכם במועד מאוחר יותר. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 קוד @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 קודי שחזור לא יוצגו שוב, ודאו לשמור אותם. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 העתיקו קודים @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 שדות הדוא״ל אינם תואמים. תקן והקלד מחדש @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 הסיסמאות חייבות להיות תואמות @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 פרופיל עודכן בהצלחה @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 שגיאה בשמירת פרופיל @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 שגיאה ביצירת אסימון אימות @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 שגיאה בניתוק חשבון חברתי @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 שגיאה באחזור הגדרות TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP הופעל בהצלחה @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 שגיאה בהפעלת TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP הושבת בהצלחה @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 שגיאה בהשבתת TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 שדות מותאמים אישית @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 כותרת & תוכן @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 סוג קובץ @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 עוד כמו @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 שווה @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 הינו ריק @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 אינו ריק @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 גדול מ @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 קטן מ @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 שולח: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 ללא מכותבים @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 סוג מסמך: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 ללא סוג מסמך @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 ללא נתיב אחסון @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 ללא תיוג @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 שאילתת שדות מותאמים אישית @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 כותרת: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 מס"ד: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 בעלים: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 הבעלים לא נכלל בתוך: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 ללא בעלים @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 סינון מסמכים () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 שגיאת שינוי הרשאות @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 נוצר בהצלחה: . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 אירעה שגיאה ביצירת: . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 חלה שגיאה בשמירת . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 מסמכים קשורים לא יימחקו. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 שגיאה בניסיון למחוק את הפריט @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 ההרשאות עודכנו בהצלחה @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 פעולה זו תמחק לצמיתות את כל האובייקטים. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 הפריטים נמחקו בהצלחה @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 שגיאה במחיקת פריטים @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 נתיב אחסון @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 נתיבי אחסון @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 למחוק את נתיב האחסון „”? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 תגית @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 תגיות @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 למחוק את התגית „”? diff --git a/src-ui/src/locale/messages.hi_IN.xlf b/src-ui/src/locale/messages.hi_IN.xlf new file mode 100644 index 0000000000..83f6e77f3f --- /dev/null +++ b/src-ui/src/locale/messages.hi_IN.xlf @@ -0,0 +1,11480 @@ + + + + + + Close + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts + 50 + + बंद + + + Slide of + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 131,135 + + Currently selected slide number read by screen reader + Slide of + + + Previous + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 157,159 + + पिछला + + + Next + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 198 + + अगला + + + Previous month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 83,85 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + पिछला महीना + + + Next month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + अगला महीना + + + HH + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + HH + + + Close + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Close + + + Select month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + महीना चुनिए + + + «« + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + «« + + + Hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Hours + + + « + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + « + + + MM + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + MM + + + » + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + » + + + Select year + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Select year + + + Minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Minutes + + + »» + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + »» + + + First + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + First + + + Increment hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment hours + + + Previous + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Previous + + + Decrement hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement hours + + + Next + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Next + + + Increment minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment minutes + + + Last + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Last + + + Decrement minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement minutes + + + SS + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + SS + + + Seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Seconds + + + Increment seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment seconds + + + Decrement seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement seconds + + + + + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + + + + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts + 41,42 + + + + + Document was added to Paperless-ngx. + + src/app/app.component.ts + 95 + + + src/app/app.component.ts + 104 + + Document was added to Paperless-ngx. + + + Open document + + src/app/app.component.ts + 97 + + + src/app/components/admin/trash/trash.component.ts + 146 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 44 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 47 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 50 + + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 58 + + Open document + + + Could not add : + + src/app/app.component.ts + 119 + + Could not add : + + + Document is being processed by Paperless-ngx. + + src/app/app.component.ts + 134 + + Document is being processed by Paperless-ngx. + + + Dashboard + + src/app/app.component.ts + 141 + + + src/app/components/app-frame/app-frame.component.html + 84 + + + src/app/components/app-frame/app-frame.component.html + 86 + + + src/app/components/dashboard/dashboard.component.html + 1 + + Dashboard + + + Documents + + src/app/app.component.ts + 152 + + + src/app/components/app-frame/app-frame.component.html + 91 + + + src/app/components/app-frame/app-frame.component.html + 93 + + + src/app/components/document-list/document-list.component.ts + 192 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 61 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + Documents + + + Settings + + src/app/app.component.ts + 164 + + + src/app/components/admin/settings/settings.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 51 + + + src/app/components/app-frame/app-frame.component.html + 255 + + + src/app/components/app-frame/app-frame.component.html + 257 + + Settings + + + Prev + + src/app/app.component.ts + 170 + + Prev + + + Next + + src/app/app.component.ts + 171 + + + src/app/components/document-detail/document-detail.component.html + 113 + + Next + + + End + + src/app/app.component.ts + 172 + + End + + + The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. + + src/app/app.component.ts + 178 + + The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. + + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + src/app/app.component.ts + 185 + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + src/app/app.component.ts + 190 + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + src/app/app.component.ts + 197 + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + src/app/app.component.ts + 203 + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + src/app/app.component.ts + 208 + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + + Manage e-mail accounts and rules for automatically importing documents. + + src/app/app.component.ts + 216 + + + src/app/components/manage/mail/mail.component.html + 4 + + Manage e-mail accounts and rules for automatically importing documents. + + + Workflows give you more control over the document pipeline. + + src/app/app.component.ts + 224 + + Workflows give you more control over the document pipeline. + + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + src/app/app.component.ts + 232 + + + src/app/components/admin/tasks/tasks.component.html + 4 + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + + Check out the settings for various tweaks to the web app. + + src/app/app.component.ts + 240 + + Check out the settings for various tweaks to the web app. + + + Thank you! 🙏 + + src/app/app.component.ts + 248 + + Thank you! 🙏 + + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + src/app/app.component.ts + 250 + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + src/app/app.component.ts + 252 + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + + Application Configuration + + src/app/components/admin/config/config.component.html + 2 + + Application Configuration + + + Global app configuration options which apply to <strong>every</strong> user of this install of Paperless-ngx. Options can also be set using environment variables or the configuration file but the value here will always take precedence. + + src/app/components/admin/config/config.component.html + 4 + + Global app configuration options which apply to <strong>every</strong> user of this install of Paperless-ngx. Options can also be set using environment variables or the configuration file but the value here will always take precedence. + + + Read the documentation about this setting + + src/app/components/admin/config/config.component.html + 25 + + Read the documentation about this setting + + + Enable + + src/app/components/admin/config/config.component.html + 34 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 125 + + Enable + + + Discard + + src/app/components/admin/config/config.component.html + 53 + + + src/app/components/document-detail/document-detail.component.html + 374 + + Discard + + + Save + + src/app/components/admin/config/config.component.html + 56 + + + src/app/components/admin/settings/settings.component.html + 362 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 26 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 52 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 28 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 20 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 40 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 77 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 31 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 57 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 116 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 185 + + + src/app/components/document-detail/document-detail.component.html + 367 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 83 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 21 + + + src/app/components/manage/saved-views/saved-views.component.html + 74 + + Save + + + Error retrieving config + + src/app/components/admin/config/config.component.ts + 103 + + Error retrieving config + + + Invalid JSON + + src/app/components/admin/config/config.component.ts + 129 + + Invalid JSON + + + Configuration updated + + src/app/components/admin/config/config.component.ts + 173 + + Configuration updated + + + An error occurred updating configuration + + src/app/components/admin/config/config.component.ts + 178 + + An error occurred updating configuration + + + File successfully updated + + src/app/components/admin/config/config.component.ts + 200 + + File successfully updated + + + An error occurred uploading file + + src/app/components/admin/config/config.component.ts + 205 + + An error occurred uploading file + + + Logs + + src/app/components/admin/logs/logs.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 290 + + + src/app/components/app-frame/app-frame.component.html + 293 + + Logs + + + Review the log files for the application and for email checking. + + src/app/components/admin/logs/logs.component.html + 4 + + Review the log files for the application and for email checking. + + + Show + + src/app/components/admin/logs/logs.component.html + 8 + + + src/app/components/document-list/document-list.component.html + 37 + + + src/app/components/manage/saved-views/saved-views.component.html + 52 + + Show + + + lines + + src/app/components/admin/logs/logs.component.html + 17 + + lines + + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 21 + + + src/app/components/admin/tasks/tasks.component.html + 41 + + Auto refresh + + + Loading... + + src/app/components/admin/logs/logs.component.html + 38 + + + src/app/components/admin/logs/logs.component.html + 48 + + + src/app/components/admin/tasks/tasks.component.html + 48 + + + src/app/components/admin/trash/trash.component.html + 45 + + + src/app/components/admin/users-groups/users-groups.component.html + 92 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 35 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 50 + + + src/app/components/common/input/document-link/document-link.component.html + 58 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 23 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 110 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 128 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 10 + + + src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html + 18 + + + src/app/components/document-detail/document-detail.component.html + 387 + + + src/app/components/document-list/document-list.component.html + 134 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 26 + + + src/app/components/manage/mail/mail.component.html + 40 + + + src/app/components/manage/mail/mail.component.html + 123 + + + src/app/components/manage/mail/mail.component.html + 192 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 16 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/saved-views/saved-views.component.html + 68 + + + src/app/components/manage/workflows/workflows.component.html + 28 + + Loading... + + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + + + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. + + src/app/components/admin/settings/settings.component.html + 4 + + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. + + + Start tour + + src/app/components/admin/settings/settings.component.html + 8 + + Start tour + + + System Status + + src/app/components/admin/settings/settings.component.html + 27 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 2 + + System Status + + + Open Django Admin + + src/app/components/admin/settings/settings.component.html + 30 + + Open Django Admin + + + General + + src/app/components/admin/settings/settings.component.html + 40 + + General + + + Appearance + + src/app/components/admin/settings/settings.component.html + 44 + + Appearance + + + Display language + + src/app/components/admin/settings/settings.component.html + 47 + + Display language + + + You need to reload the page after applying a new language. + + src/app/components/admin/settings/settings.component.html + 60 + + You need to reload the page after applying a new language. + + + Date display + + src/app/components/admin/settings/settings.component.html + 68 + + Date display + + + Date format + + src/app/components/admin/settings/settings.component.html + 85 + + Date format + + + Short: + + src/app/components/admin/settings/settings.component.html + 91,92 + + Short: + + + Medium: + + src/app/components/admin/settings/settings.component.html + 95,96 + + Medium: + + + Long: + + src/app/components/admin/settings/settings.component.html + 99,100 + + Long: + + + Items per page + + src/app/components/admin/settings/settings.component.html + 107 + + Items per page + + + Sidebar + + src/app/components/admin/settings/settings.component.html + 123 + + Sidebar + + + Use 'slim' sidebar (icons only) + + src/app/components/admin/settings/settings.component.html + 127 + + Use 'slim' sidebar (icons only) + + + Dark mode + + src/app/components/admin/settings/settings.component.html + 134 + + Dark mode + + + Use system settings + + src/app/components/admin/settings/settings.component.html + 137 + + Use system settings + + + Enable dark mode + + src/app/components/admin/settings/settings.component.html + 138 + + Enable dark mode + + + Invert thumbnails in dark mode + + src/app/components/admin/settings/settings.component.html + 139 + + Invert thumbnails in dark mode + + + Theme Color + + src/app/components/admin/settings/settings.component.html + 145 + + Theme Color + + + Reset + + src/app/components/admin/settings/settings.component.html + 152 + + Reset + + + Update checking + + src/app/components/admin/settings/settings.component.html + 157 + + Update checking + + + Enable update checking + + src/app/components/admin/settings/settings.component.html + 160 + + Enable update checking + + + What's this? + + src/app/components/admin/settings/settings.component.html + 161 + + + src/app/components/common/page-header/page-header.component.html + 9 + + + src/app/components/common/permissions-select/permissions-select.component.html + 4 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 3 + + What's this? + + + Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + src/app/components/admin/settings/settings.component.html + 165,167 + + Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + + No tracking data is collected by the app in any way. + + src/app/components/admin/settings/settings.component.html + 169 + + No tracking data is collected by the app in any way. + + + Saved Views + + src/app/components/admin/settings/settings.component.html + 175 + + + src/app/components/app-frame/app-frame.component.html + 215 + + + src/app/components/app-frame/app-frame.component.html + 217 + + + src/app/components/manage/saved-views/saved-views.component.html + 2 + + Saved Views + + + Show warning when closing saved views with unsaved changes + + src/app/components/admin/settings/settings.component.html + 178 + + Show warning when closing saved views with unsaved changes + + + Show document counts in sidebar saved views + + src/app/components/admin/settings/settings.component.html + 179 + + Show document counts in sidebar saved views + + + Document editing + + src/app/components/admin/settings/settings.component.html + 185 + + Document editing + + + Use PDF viewer provided by the browser + + src/app/components/admin/settings/settings.component.html + 189 + + Use PDF viewer provided by the browser + + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + src/app/components/admin/settings/settings.component.html + 189 + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + + Default zoom + + src/app/components/admin/settings/settings.component.html + 195 + + Default zoom + + + Fit width + + src/app/components/admin/settings/settings.component.html + 199 + + Fit width + + + Fit page + + src/app/components/admin/settings/settings.component.html + 200 + + Fit page + + + Only applies to the Paperless-ngx PDF viewer. + + src/app/components/admin/settings/settings.component.html + 202 + + Only applies to the Paperless-ngx PDF viewer. + + + Automatically remove inbox tag(s) on save + + src/app/components/admin/settings/settings.component.html + 208 + + Automatically remove inbox tag(s) on save + + + Show document thumbnail during loading + + src/app/components/admin/settings/settings.component.html + 214 + + Show document thumbnail during loading + + + Global search + + src/app/components/admin/settings/settings.component.html + 218 + + + src/app/components/app-frame/global-search/global-search.component.ts + 122 + + Global search + + + Do not include advanced search results + + src/app/components/admin/settings/settings.component.html + 221 + + Do not include advanced search results + + + Full search links to + + src/app/components/admin/settings/settings.component.html + 227 + + Full search links to + + + Title and content search + + src/app/components/admin/settings/settings.component.html + 231 + + Title and content search + + + Advanced search + + src/app/components/admin/settings/settings.component.html + 232 + + + src/app/components/app-frame/global-search/global-search.component.html + 24 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 208 + + Advanced search + + + Bulk editing + + src/app/components/admin/settings/settings.component.html + 237 + + Bulk editing + + + Show confirmation dialogs + + src/app/components/admin/settings/settings.component.html + 240 + + Show confirmation dialogs + + + Apply on close + + src/app/components/admin/settings/settings.component.html + 241 + + Apply on close + + + Notes + + src/app/components/admin/settings/settings.component.html + 245 + + + src/app/components/document-list/document-list.component.html + 242 + + + src/app/data/document.ts + 58 + + + src/app/data/document.ts + 95 + + Notes + + + Enable notes + + src/app/components/admin/settings/settings.component.html + 248 + + Enable notes + + + Permissions + + src/app/components/admin/settings/settings.component.html + 259 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 51 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 2 + + + src/app/components/document-detail/document-detail.component.html + 343 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 78 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 101 + + + src/app/components/manage/mail/mail.component.html + 66 + + + src/app/components/manage/mail/mail.component.html + 78 + + + src/app/components/manage/mail/mail.component.html + 154 + + + src/app/components/manage/mail/mail.component.html + 166 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + Permissions + + + Default Permissions + + src/app/components/admin/settings/settings.component.html + 262 + + Default Permissions + + + Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. + + src/app/components/admin/settings/settings.component.html + 266,268 + + Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. + + + Default Owner + + src/app/components/admin/settings/settings.component.html + 273 + + Default Owner + + + Objects without an owner can be viewed and edited by all users + + src/app/components/admin/settings/settings.component.html + 277 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 32 + + Objects without an owner can be viewed and edited by all users + + + Default View Permissions + + src/app/components/admin/settings/settings.component.html + 282 + + Default View Permissions + + + Users: + + src/app/components/admin/settings/settings.component.html + 287 + + + src/app/components/admin/settings/settings.component.html + 314 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 278 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 297 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 364 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 383 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 38 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 57 + + Users: + + + Groups: + + src/app/components/admin/settings/settings.component.html + 297 + + + src/app/components/admin/settings/settings.component.html + 324 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 286 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 305 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 372 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 391 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 46 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 65 + + Groups: + + + Default Edit Permissions + + src/app/components/admin/settings/settings.component.html + 309 + + Default Edit Permissions + + + Edit permissions also grant viewing permissions + + src/app/components/admin/settings/settings.component.html + 333 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 311 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 397 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 71 + + Edit permissions also grant viewing permissions + + + Notifications + + src/app/components/admin/settings/settings.component.html + 341 + + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 11 + + Notifications + + + Document processing + + src/app/components/admin/settings/settings.component.html + 344 + + Document processing + + + Show notifications when new documents are detected + + src/app/components/admin/settings/settings.component.html + 348 + + Show notifications when new documents are detected + + + Show notifications when document processing completes successfully + + src/app/components/admin/settings/settings.component.html + 349 + + Show notifications when document processing completes successfully + + + Show notifications when document processing fails + + src/app/components/admin/settings/settings.component.html + 350 + + Show notifications when document processing fails + + + Suppress notifications on dashboard + + src/app/components/admin/settings/settings.component.html + 351 + + Suppress notifications on dashboard + + + This will suppress all messages about document processing status on the dashboard. + + src/app/components/admin/settings/settings.component.html + 351 + + This will suppress all messages about document processing status on the dashboard. + + + Cancel + + src/app/components/admin/settings/settings.component.html + 361 + + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 47 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 25 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 51 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 75 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 30 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 56 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 115 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 25 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 184 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 81 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 20 + + + src/app/components/manage/saved-views/saved-views.component.html + 73 + + Cancel + + + Use system language + + src/app/components/admin/settings/settings.component.ts + 78 + + Use system language + + + Use date format of display language + + src/app/components/admin/settings/settings.component.ts + 81 + + Use date format of display language + + + Error retrieving users + + src/app/components/admin/settings/settings.component.ts + 226 + + + src/app/components/admin/users-groups/users-groups.component.ts + 75 + + Error retrieving users + + + Error retrieving groups + + src/app/components/admin/settings/settings.component.ts + 245 + + + src/app/components/admin/users-groups/users-groups.component.ts + 89 + + Error retrieving groups + + + Settings were saved successfully. + + src/app/components/admin/settings/settings.component.ts + 548 + + Settings were saved successfully. + + + Settings were saved successfully. Reload is required to apply some changes. + + src/app/components/admin/settings/settings.component.ts + 552 + + Settings were saved successfully. Reload is required to apply some changes. + + + Reload now + + src/app/components/admin/settings/settings.component.ts + 553 + + Reload now + + + An error occurred while saving settings. + + src/app/components/admin/settings/settings.component.ts + 563 + + + src/app/components/app-frame/app-frame.component.ts + 180 + + An error occurred while saving settings. + + + File Tasks + + src/app/components/admin/tasks/tasks.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 278 + + + src/app/components/app-frame/app-frame.component.html + 280 + + File Tasks + + + Clear selection + + src/app/components/admin/tasks/tasks.component.html + 9 + + + src/app/components/admin/trash/trash.component.html + 8 + + + src/app/components/document-list/document-list.component.html + 153 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + Clear selection + + + Filter by + + src/app/components/admin/tasks/tasks.component.html + 16 + + Filter by + + + Name + + src/app/components/admin/tasks/tasks.component.html + 61 + + + src/app/components/admin/tasks/tasks.component.ts + 45 + + + src/app/components/admin/trash/trash.component.html + 35 + + + src/app/components/admin/users-groups/users-groups.component.html + 21 + + + src/app/components/admin/users-groups/users-groups.component.html + 58 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 13 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 8 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 17 + + + src/app/components/manage/mail/mail.component.html + 30 + + + src/app/components/manage/mail/mail.component.html + 111 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/workflows/workflows.component.html + 17 + + Name + + + Created + + src/app/components/admin/tasks/tasks.component.html + 62 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 8 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 94 + + + src/app/components/document-list/document-list.component.html + 269 + + + src/app/data/document.ts + 34 + + + src/app/data/document.ts + 92 + + Created + + + Results + + src/app/components/admin/tasks/tasks.component.html + 64 + + Results + + + Info + + src/app/components/admin/tasks/tasks.component.html + 66 + + Info + + + Actions + + src/app/components/admin/tasks/tasks.component.html + 67 + + + src/app/components/admin/trash/trash.component.html + 37 + + + src/app/components/admin/users-groups/users-groups.component.html + 23 + + + src/app/components/admin/users-groups/users-groups.component.html + 61 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 67 + + + src/app/components/document-detail/document-detail.component.html + 50 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 87 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 19 + + + src/app/components/manage/mail/mail.component.html + 33 + + + src/app/components/manage/mail/mail.component.html + 116 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/saved-views/saved-views.component.html + 28 + + + src/app/components/manage/workflows/workflows.component.html + 21 + + Actions + + + click for full output + + src/app/components/admin/tasks/tasks.component.html + 97 + + click for full output + + + Dismiss + + src/app/components/admin/tasks/tasks.component.html + 110 + + + src/app/components/admin/tasks/tasks.component.ts + 155 + + Dismiss + + + Open Document + + src/app/components/admin/tasks/tasks.component.html + 115 + + Open Document + + + {VAR_PLURAL, plural, =1 {One task} other { total tasks}} + + src/app/components/admin/tasks/tasks.component.html + 134 + + {VAR_PLURAL, plural, =1 {One task} other { total tasks}} + + +  ( selected) + + src/app/components/admin/tasks/tasks.component.html + 136 + +  ( selected) + + + Failed + + src/app/components/admin/tasks/tasks.component.html + 148,150 + + Failed + + + Complete + + src/app/components/admin/tasks/tasks.component.html + 156,158 + + Complete + + + Started + + src/app/components/admin/tasks/tasks.component.html + 164,166 + + Started + + + Queued + + src/app/components/admin/tasks/tasks.component.html + 172,174 + + Queued + + + Result + + src/app/components/admin/tasks/tasks.component.ts + 46 + + Result + + + Dismiss selected + + src/app/components/admin/tasks/tasks.component.ts + 110 + + Dismiss selected + + + Dismiss all + + src/app/components/admin/tasks/tasks.component.ts + 111 + + Dismiss all + + + Confirm Dismiss All + + src/app/components/admin/tasks/tasks.component.ts + 152 + + Confirm Dismiss All + + + Dismiss all tasks? + + src/app/components/admin/tasks/tasks.component.ts + 153 + + Dismiss all tasks? + + + Error dismissing tasks + + src/app/components/admin/tasks/tasks.component.ts + 161 + + Error dismissing tasks + + + Error dismissing task + + src/app/components/admin/tasks/tasks.component.ts + 170 + + Error dismissing task + + + queued + + src/app/components/admin/tasks/tasks.component.ts + 246 + + queued + + + started + + src/app/components/admin/tasks/tasks.component.ts + 248 + + started + + + completed + + src/app/components/admin/tasks/tasks.component.ts + 250 + + completed + + + failed + + src/app/components/admin/tasks/tasks.component.ts + 252 + + failed + + + Trash + + src/app/components/admin/trash/trash.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 238 + + + src/app/components/app-frame/app-frame.component.html + 241 + + Trash + + + Manage trashed documents that are pending deletion. + + src/app/components/admin/trash/trash.component.html + 4 + + Manage trashed documents that are pending deletion. + + + Restore selected + + src/app/components/admin/trash/trash.component.html + 11 + + Restore selected + + + Delete selected + + src/app/components/admin/trash/trash.component.html + 14 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 87 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 89 + + Delete selected + + + Empty trash + + src/app/components/admin/trash/trash.component.html + 17 + + Empty trash + + + Remaining + + src/app/components/admin/trash/trash.component.html + 36 + + Remaining + + + days + + src/app/components/admin/trash/trash.component.html + 63 + + days + + + Restore + + src/app/components/admin/trash/trash.component.html + 71 + + + src/app/components/admin/trash/trash.component.html + 78 + + Restore + + + Delete + + src/app/components/admin/trash/trash.component.html + 72 + + + src/app/components/admin/trash/trash.component.html + 81 + + + src/app/components/admin/trash/trash.component.ts + 82 + + + src/app/components/admin/trash/trash.component.ts + 116 + + + src/app/components/admin/users-groups/users-groups.component.html + 38 + + + src/app/components/admin/users-groups/users-groups.component.html + 76 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 87 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 45 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 89 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 242 + + + src/app/components/common/permissions-select/permissions-select.component.html + 19 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 36 + + + src/app/components/document-detail/document-detail.component.html + 24 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 145 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 43 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 55 + + + src/app/components/manage/mail/mail.component.html + 67 + + + src/app/components/manage/mail/mail.component.html + 81 + + + src/app/components/manage/mail/mail.component.html + 155 + + + src/app/components/manage/mail/mail.component.html + 169 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.ts + 247 + + + src/app/components/manage/saved-views/saved-views.component.html + 30 + + + src/app/components/manage/workflows/workflows.component.html + 55 + + + src/app/components/manage/workflows/workflows.component.html + 66 + + Delete + + + {VAR_PLURAL, plural, =1 {One document in trash} other { total documents in trash}} + + src/app/components/admin/trash/trash.component.html + 94 + + {VAR_PLURAL, plural, =1 {One document in trash} other { total documents in trash}} + + + Confirm delete + + src/app/components/admin/trash/trash.component.ts + 78 + + + src/app/components/admin/trash/trash.component.ts + 110 + + + src/app/components/manage/management-list/management-list.component.ts + 243 + + + src/app/components/manage/management-list/management-list.component.ts + 366 + + Confirm delete + + + This operation will permanently delete this document. + + src/app/components/admin/trash/trash.component.ts + 79 + + This operation will permanently delete this document. + + + This operation cannot be undone. + + src/app/components/admin/trash/trash.component.ts + 80 + + + src/app/components/admin/trash/trash.component.ts + 114 + + + src/app/components/admin/users-groups/users-groups.component.ts + 145 + + + src/app/components/admin/users-groups/users-groups.component.ts + 198 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 104 + + + src/app/components/manage/mail/mail.component.ts + 192 + + + src/app/components/manage/mail/mail.component.ts + 293 + + + src/app/components/manage/management-list/management-list.component.ts + 368 + + + src/app/components/manage/workflows/workflows.component.ts + 133 + + This operation cannot be undone. + + + Document "" deleted + + src/app/components/admin/trash/trash.component.ts + 90 + + Document "" deleted + + + Error deleting document "" + + src/app/components/admin/trash/trash.component.ts + 97 + + Error deleting document "" + + + This operation will permanently delete the selected documents. + + src/app/components/admin/trash/trash.component.ts + 112 + + This operation will permanently delete the selected documents. + + + This operation will permanently delete all documents in the trash. + + src/app/components/admin/trash/trash.component.ts + 113 + + This operation will permanently delete all documents in the trash. + + + Document(s) deleted + + src/app/components/admin/trash/trash.component.ts + 124 + + Document(s) deleted + + + Error deleting document(s) + + src/app/components/admin/trash/trash.component.ts + 131 + + Error deleting document(s) + + + Document "" restored + + src/app/components/admin/trash/trash.component.ts + 144 + + Document "" restored + + + Error restoring document "" + + src/app/components/admin/trash/trash.component.ts + 155 + + Error restoring document "" + + + Document(s) restored + + src/app/components/admin/trash/trash.component.ts + 167 + + Document(s) restored + + + Error restoring document(s) + + src/app/components/admin/trash/trash.component.ts + 173 + + Error restoring document(s) + + + Users & Groups + + src/app/components/admin/users-groups/users-groups.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 269 + + + src/app/components/app-frame/app-frame.component.html + 271 + + Users & Groups + + + Create, delete and edit users and groups. + + src/app/components/admin/users-groups/users-groups.component.html + 4 + + Create, delete and edit users and groups. + + + Users + + src/app/components/admin/users-groups/users-groups.component.html + 12 + + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 76 + + Users + + + Add User + + src/app/components/admin/users-groups/users-groups.component.html + 14 + + Add User + + + Username + + src/app/components/admin/users-groups/users-groups.component.html + 20 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 13 + + + src/app/components/manage/mail/mail.component.html + 32 + + Username + + + Groups + + src/app/components/admin/users-groups/users-groups.component.html + 22 + + + src/app/components/admin/users-groups/users-groups.component.html + 50 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 34 + + Groups + + + Edit + + src/app/components/admin/users-groups/users-groups.component.html + 35 + + + src/app/components/admin/users-groups/users-groups.component.html + 73 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 53 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 42 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 52 + + + src/app/components/manage/mail/mail.component.html + 65 + + + src/app/components/manage/mail/mail.component.html + 75 + + + src/app/components/manage/mail/mail.component.html + 153 + + + src/app/components/manage/mail/mail.component.html + 163 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/workflows/workflows.component.html + 54 + + + src/app/components/manage/workflows/workflows.component.html + 63 + + Edit + + + Add Group + + src/app/components/admin/users-groups/users-groups.component.html + 52 + + Add Group + + + No groups defined + + src/app/components/admin/users-groups/users-groups.component.html + 84 + + No groups defined + + + Password has been changed, you will be logged out momentarily. + + src/app/components/admin/users-groups/users-groups.component.ts + 116 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 201 + + Password has been changed, you will be logged out momentarily. + + + Saved user "". + + src/app/components/admin/users-groups/users-groups.component.ts + 125 + + Saved user "". + + + Error saving user. + + src/app/components/admin/users-groups/users-groups.component.ts + 135 + + Error saving user. + + + Confirm delete user account + + src/app/components/admin/users-groups/users-groups.component.ts + 143 + + Confirm delete user account + + + This operation will permanently delete this user account. + + src/app/components/admin/users-groups/users-groups.component.ts + 144 + + This operation will permanently delete this user account. + + + Proceed + + src/app/components/admin/users-groups/users-groups.component.ts + 147 + + + src/app/components/admin/users-groups/users-groups.component.ts + 200 + + + src/app/components/document-detail/document-detail.component.ts + 1028 + + + src/app/components/document-detail/document-detail.component.ts + 1393 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 798 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 831 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 850 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 106 + + + src/app/components/manage/mail/mail.component.ts + 194 + + + src/app/components/manage/mail/mail.component.ts + 295 + + + src/app/components/manage/management-list/management-list.component.ts + 370 + + + src/app/components/manage/workflows/workflows.component.ts + 135 + + Proceed + + + Deleted user "" + + src/app/components/admin/users-groups/users-groups.component.ts + 153 + + Deleted user "" + + + Error deleting user "". + + src/app/components/admin/users-groups/users-groups.component.ts + 160 + + Error deleting user "". + + + Saved group "". + + src/app/components/admin/users-groups/users-groups.component.ts + 180 + + Saved group "". + + + Error saving group. + + src/app/components/admin/users-groups/users-groups.component.ts + 188 + + Error saving group. + + + Confirm delete user group + + src/app/components/admin/users-groups/users-groups.component.ts + 196 + + Confirm delete user group + + + This operation will permanently delete this user group. + + src/app/components/admin/users-groups/users-groups.component.ts + 197 + + This operation will permanently delete this user group. + + + Deleted group "" + + src/app/components/admin/users-groups/users-groups.component.ts + 206 + + Deleted group "" + + + Error deleting group "". + + src/app/components/admin/users-groups/users-groups.component.ts + 213 + + Error deleting group "". + + + by Paperless-ngx + + src/app/components/app-frame/app-frame.component.html + 20 + + by Paperless-ngx + + + Logged in as + + src/app/components/app-frame/app-frame.component.html + 43 + + Logged in as + + + My Profile + + src/app/components/app-frame/app-frame.component.html + 47 + + My Profile + + + Logout + + src/app/components/app-frame/app-frame.component.html + 54 + + Logout + + + Documentation + + src/app/components/app-frame/app-frame.component.html + 59 + + + src/app/components/app-frame/app-frame.component.html + 299 + + + src/app/components/app-frame/app-frame.component.html + 302 + + Documentation + + + Saved views + + src/app/components/app-frame/app-frame.component.html + 101 + + + src/app/components/app-frame/app-frame.component.html + 106 + + Saved views + + + Open documents + + src/app/components/app-frame/app-frame.component.html + 141 + + Open documents + + + Close all + + src/app/components/app-frame/app-frame.component.html + 161 + + + src/app/components/app-frame/app-frame.component.html + 163 + + Close all + + + Manage + + src/app/components/app-frame/app-frame.component.html + 172 + + Manage + + + Correspondents + + src/app/components/app-frame/app-frame.component.html + 178 + + + src/app/components/app-frame/app-frame.component.html + 180 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 107 + + Correspondents + + + Tags + + src/app/components/app-frame/app-frame.component.html + 185 + + + src/app/components/app-frame/app-frame.component.html + 188 + + + src/app/components/common/input/tags/tags.component.ts + 80 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 94 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 5 + + + src/app/components/document-list/document-list.component.html + 224 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 39 + + + src/app/data/document.ts + 42 + + Tags + + + Document Types + + src/app/components/app-frame/app-frame.component.html + 194 + + + src/app/components/app-frame/app-frame.component.html + 196 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 120 + + Document Types + + + Storage Paths + + src/app/components/app-frame/app-frame.component.html + 201 + + + src/app/components/app-frame/app-frame.component.html + 203 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 133 + + Storage Paths + + + Custom Fields + + src/app/components/app-frame/app-frame.component.html + 208 + + + src/app/components/app-frame/app-frame.component.html + 210 + + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 4 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 2 + + Custom Fields + + + Workflows + + src/app/components/app-frame/app-frame.component.html + 224 + + + src/app/components/app-frame/app-frame.component.html + 226 + + + src/app/components/manage/workflows/workflows.component.html + 2 + + Workflows + + + Mail + + src/app/components/app-frame/app-frame.component.html + 231 + + + src/app/components/app-frame/app-frame.component.html + 234 + + Mail + + + Administration + + src/app/components/app-frame/app-frame.component.html + 249 + + Administration + + + Configuration + + src/app/components/app-frame/app-frame.component.html + 262 + + + src/app/components/app-frame/app-frame.component.html + 264 + + Configuration + + + GitHub + + src/app/components/app-frame/app-frame.component.html + 309 + + GitHub + + + is available. + + src/app/components/app-frame/app-frame.component.html + 318,319 + + is available. + + + Click to view. + + src/app/components/app-frame/app-frame.component.html + 319 + + Click to view. + + + Paperless-ngx can automatically check for updates + + src/app/components/app-frame/app-frame.component.html + 323 + + Paperless-ngx can automatically check for updates + + + How does this work? + + src/app/components/app-frame/app-frame.component.html + 330,332 + + How does this work? + + + Update available + + src/app/components/app-frame/app-frame.component.html + 343 + + Update available + + + Sidebar views updated + + src/app/components/app-frame/app-frame.component.ts + 264 + + Sidebar views updated + + + Error updating sidebar views + + src/app/components/app-frame/app-frame.component.ts + 267 + + Error updating sidebar views + + + An error occurred while saving update checking settings. + + src/app/components/app-frame/app-frame.component.ts + 288 + + An error occurred while saving update checking settings. + + + Search + + src/app/components/app-frame/global-search/global-search.component.html + 8 + + + src/app/components/app-frame/global-search/global-search.component.html + 26 + + Search + + + Open + + src/app/components/app-frame/global-search/global-search.component.html + 53 + + + src/app/components/app-frame/global-search/global-search.component.html + 56 + + + src/app/components/app-frame/global-search/global-search.component.html + 59 + + + src/app/components/app-frame/global-search/global-search.component.html + 76 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 72 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 143 + + Open + + + Filter documents + + src/app/components/app-frame/global-search/global-search.component.html + 62 + + Filter documents + + + Download + + src/app/components/app-frame/global-search/global-search.component.html + 73 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 104 + + + src/app/components/document-detail/document-detail.component.html + 34 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 117 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 78 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 149 + + Download + + + No results + + src/app/components/app-frame/global-search/global-search.component.html + 87 + + No results + + + Documents + + src/app/components/app-frame/global-search/global-search.component.html + 90 + + Documents + + + Saved Views + + src/app/components/app-frame/global-search/global-search.component.html + 96 + + Saved Views + + + Tags + + src/app/components/app-frame/global-search/global-search.component.html + 103 + + Tags + + + Correspondents + + src/app/components/app-frame/global-search/global-search.component.html + 110 + + Correspondents + + + Document types + + src/app/components/app-frame/global-search/global-search.component.html + 117 + + Document types + + + Storage paths + + src/app/components/app-frame/global-search/global-search.component.html + 124 + + Storage paths + + + Users + + src/app/components/app-frame/global-search/global-search.component.html + 131 + + Users + + + Groups + + src/app/components/app-frame/global-search/global-search.component.html + 138 + + Groups + + + Custom fields + + src/app/components/app-frame/global-search/global-search.component.html + 145 + + Custom fields + + + Mail accounts + + src/app/components/app-frame/global-search/global-search.component.html + 152 + + Mail accounts + + + Mail rules + + src/app/components/app-frame/global-search/global-search.component.html + 159 + + Mail rules + + + Workflows + + src/app/components/app-frame/global-search/global-search.component.html + 166 + + Workflows + + + Successfully updated object. + + src/app/components/app-frame/global-search/global-search.component.ts + 211 + + + src/app/components/app-frame/global-search/global-search.component.ts + 249 + + Successfully updated object. + + + Error occurred saving object. + + src/app/components/app-frame/global-search/global-search.component.ts + 214 + + + src/app/components/app-frame/global-search/global-search.component.ts + 252 + + Error occurred saving object. + + + Clear All + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 16 + + Clear All + + + No notifications + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 20 + + No notifications + + + Clear + + src/app/components/common/clearable-badge/clearable-badge.component.html + 2 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 85 + + Clear + + + Are you sure? + + src/app/components/common/confirm-button/confirm-button.component.ts + 22 + + Are you sure? + + + Confirmation + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 23 + + Confirmation + + + Confirm + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 35 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 26 + + + src/app/components/document-detail/document-detail.component.ts + 981 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 441 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 481 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 519 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 557 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 619 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 752 + + Confirm + + + Documents: + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 9 + + Documents: + + + Use metadata from: + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 22 + + Use metadata from: + + + Regenerate all metadata + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 24 + + Regenerate all metadata + + + Try to include archive version in merge for non-PDF files + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 32 + + Try to include archive version in merge for non-PDF files + + + Delete original documents after successful merge + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 36 + + Delete original documents after successful merge + + + Note that only PDFs will be included. + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 39 + + Note that only PDFs will be included. + + + Note that only PDFs will be rotated. + + src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html + 25 + + Note that only PDFs will be rotated. + + + View + + src/app/components/common/custom-field-display/custom-field-display.component.html + 22 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 34 + + + src/app/components/common/permissions-select/permissions-select.component.html + 20 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 75 + + View + + + Search fields + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 10 + + Search fields + + + Create new field + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 21 + + Create new field + + + Saved field "". + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts + 130 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 85 + + Saved field "". + + + Error saving field. + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts + 139 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 94 + + Error saving field. + + + Today + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 47 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 52 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 76 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 128 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 152 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 111 + + + src/app/components/common/input/date/date.component.html + 21 + + Today + + + Close + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 48 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 53 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 77 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 129 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 153 + + + src/app/components/common/input/date/date.component.html + 22 + + + src/app/components/document-detail/document-detail.component.html + 107 + + + src/app/guards/dirty-saved-view.guard.ts + 35 + + Close + + + True + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 55 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 95 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 101 + + True + + + False + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 56 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 96 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 102 + + False + + + Search docs... + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 70 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 118 + + Search docs... + + + Any + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 150 + + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 17 + + Any + + + All + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 152 + + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 15 + + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 16 + + + src/app/components/common/permissions-select/permissions-select.component.html + 16 + + + src/app/components/common/permissions-select/permissions-select.component.html + 27 + + + src/app/components/document-list/document-list.component.html + 30 + + All + + + Not + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 155 + + Not + + + Add query + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 174 + + Add query + + + Add expression + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 177 + + Add expression + + + Relative dates + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 25 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 101 + + Relative dates + + + From + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 44 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 120 + + From + + + To + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 68 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 144 + + To + + + Added + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 84 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 90 + + + src/app/components/document-list/document-list.component.html + 278 + + + src/app/data/document.ts + 38 + + + src/app/data/document.ts + 93 + + Added + + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + + + Within 1 week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 81 + + Within 1 week + + + Within 1 month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 86 + + Within 1 month + + + Within 3 months + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 91 + + Within 3 months + + + Within 1 year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 96 + + Within 1 year + + + This year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 101 + + This year + + + This month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 106 + + This month + + + Yesterday + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 116 + + + src/app/pipes/custom-date.pipe.ts + 29 + + Yesterday + + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + + + Matching algorithm + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 64 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 18 + + Matching algorithm + + + Matching pattern + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 15 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 66 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 20 + + Matching pattern + + + Case insensitive + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 17 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 67 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 21 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 173 + + Case insensitive + + + Create new correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 43 + + Create new correspondent + + + Edit correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 47 + + Edit correspondent + + + Data type + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 12 + + Data type + + + Data type cannot be changed after a field is created + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 14 + + Data type cannot be changed after a field is created + + + Add option + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 20 + + Add option + + + Default Currency + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + Default Currency + + + 3-character currency code + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + 3-character currency code + + + Use locale + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + Use locale + + + Create new custom field + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts + 118 + + Create new custom field + + + Edit custom field + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts + 122 + + Edit custom field + + + Create new document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 43 + + Create new document type + + + Edit document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 47 + + Edit document type + + + Create new item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 121 + + Create new item + + + Edit item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 125 + + Edit item + + + Create new user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 36 + + Create new user group + + + Edit user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 40 + + Edit user group + + + IMAP Server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 14 + + IMAP Server + + + IMAP Port + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 15 + + IMAP Port + + + IMAP Security + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 16 + + IMAP Security + + + Password + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 20 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 15 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 20 + + Password + + + Password is token + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 21 + + Password is token + + + Check if the password above is a token used for authentication + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 21 + + Check if the password above is a token used for authentication + + + Character Set + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 22 + + Character Set + + + Test + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 37 + + Test + + + No encryption + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 20 + + No encryption + + + SSL + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 21 + + SSL + + + STARTTLS + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 22 + + STARTTLS + + + Create new mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 54 + + Create new mail account + + + Edit mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 58 + + Edit mail account + + + Successfully connected to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 103 + + Successfully connected to the mail server + + + Unable to connect to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 104 + + Unable to connect to the mail server + + + Account + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 16 + + + src/app/components/manage/mail/mail.component.html + 113 + + Account + + + Order + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 19 + + Order + + + Enabled + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 22 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 19 + + + src/app/components/manage/mail/mail.component.html + 137 + + + src/app/components/manage/workflows/workflows.component.html + 41 + + Enabled + + + Paperless will only process mails that match all of the criteria specified below. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + Paperless will only process mails that match all of the criteria specified below. + + + Folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 29 + + Folder + + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 29 + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + + Maximum age (days) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 30 + + Maximum age (days) + + + Filter from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 33 + + Filter from + + + Filter to + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 34 + + Filter to + + + Filter subject + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 35 + + Filter subject + + + Filter body + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 36 + + Filter body + + + Consumption scope + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 42 + + Consumption scope + + + See docs for .eml processing requirements + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 42 + + See docs for .eml processing requirements + + + Attachment type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 43 + + Attachment type + + + PDF layout + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 44 + + PDF layout + + + Include only files matching + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 47 + + Include only files matching + + + Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 47 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 48 + + Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. + + + Exclude files matching + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 48 + + Exclude files matching + + + Action + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 54 + + Action + + + Only performed if the mail is processed. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 54 + + Only performed if the mail is processed. + + + Action parameter + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 56 + + Action parameter + + + Assign title from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 58 + + Assign title from + + + Assign owner from rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 59 + + Assign owner from rule + + + Assign document type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 63 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 265 + + Assign document type + + + Assign correspondent from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 64 + + Assign correspondent from + + + Assign correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 66 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 266 + + Assign correspondent + + + Error + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 73 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 113 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 186 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 220 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 254 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 264 + + + src/app/components/common/toast/toast.component.html + 30 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 36 + + Error + + + Only process attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 38 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 49 + + Only process attachments + + + Process all files, including 'inline' attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 42 + + Process all files, including 'inline' attachments + + + Process message as .eml + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 53 + + Process message as .eml + + + Process message as .eml and attachments separately + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 57 + + Process message as .eml and attachments separately + + + System default + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 64 + + System default + + + Text, then HTML + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 68 + + Text, then HTML + + + HTML, then text + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 72 + + HTML, then text + + + HTML only + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 76 + + HTML only + + + Text only + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 80 + + Text only + + + Move to specified folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 91 + + Move to specified folder + + + Mark as read, don't process read mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 95 + + Mark as read, don't process read mails + + + Flag the mail, don't process flagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 99 + + Flag the mail, don't process flagged mails + + + Tag the mail with specified tag, don't process tagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 103 + + Tag the mail with specified tag, don't process tagged mails + + + Use subject as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 110 + + Use subject as title + + + Use attachment filename as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 114 + + Use attachment filename as title + + + Do not assign title from this rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 118 + + Do not assign title from this rule + + + Do not assign a correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 125 + + Do not assign a correspondent + + + Use mail address + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 129 + + Use mail address + + + Use name (or mail address if not available) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 133 + + Use name (or mail address if not available) + + + Use correspondent selected below + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 137 + + Use correspondent selected below + + + Create new mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 191 + + Create new mail rule + + + Edit mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 195 + + Edit mail rule + + + Path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 13 + + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 49 + + Path + + + See <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>the documentation</a>. + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 13 + + See <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>the documentation</a>. + + + Preview + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 18 + + + src/app/components/document-detail/document-detail.component.html + 309 + + Preview + + + Path test failed + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 30 + + Path test failed + + + No document selected + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 32 + + No document selected + + + Search for a document + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 38 + + Search for a document + + + No documents found + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 39 + + + src/app/components/common/input/document-link/document-link.component.ts + 72 + + No documents found + + + Create new storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 82 + + Create new storage path + + + Edit storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 86 + + Edit storage path + + + Color + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 13 + + + src/app/components/manage/tag-list/tag-list.component.ts + 49 + + Color + + + Parent + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 15 + + Parent + + + Inbox tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 17 + + Inbox tag + + + Inbox tags are automatically assigned to all consumed documents. + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 17 + + Inbox tags are automatically assigned to all consumed documents. + + + Create new tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 51 + + Create new tag + + + Edit tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 55 + + Edit tag + + + Email + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 136 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 10 + + + src/app/components/document-detail/document-detail.component.html + 92 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 101 + + Email + + + First name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 16 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 30 + + First name + + + Last name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 17 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 31 + + Last name + + + Active + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 22 + + Active + + + Admin + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 26 + + Admin + + + Access logs, Django backend + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 26 + + Access logs, Django backend + + + Superuser + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 30 + + Superuser + + + (Grants all permissions and can view objects) + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 30 + + (Grants all permissions and can view objects) + + + Two-factor Authentication + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 37 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 103 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 139 + + Two-factor Authentication + + + Disable Two-factor Authentication + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 41 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 170 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 172 + + Disable Two-factor Authentication + + + Create new user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 72 + + Create new user account + + + Edit user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 76 + + Edit user account + + + Totp deactivated + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 132 + + Totp deactivated + + + Totp deactivation failed + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 135 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 140 + + Totp deactivation failed + + + Sort order + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 16 + + + src/app/components/manage/workflows/workflows.component.html + 18 + + Sort order + + + Triggers + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 25 + + + src/app/components/manage/workflows/workflows.component.html + 20 + + Triggers + + + Trigger Workflow On: + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 31 + + Trigger Workflow On: + + + Add Trigger + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 33 + + Add Trigger + + + Apply Actions: + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 73 + + Apply Actions: + + + Add Action + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 75 + + Add Action + + + Trigger type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 123 + + Trigger type + + + Set scheduled trigger offset and which date field to use. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 125 + + Set scheduled trigger offset and which date field to use. + + + Offset days + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 130 + + Offset days + + + Positive values will trigger after the date, negative values before. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 134 + + Positive values will trigger after the date, negative values before. + + + Relative to + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 139 + + Relative to + + + Custom field + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 143 + + Custom field + + + Custom field to use for date. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 143 + + Custom field to use for date. + + + Recurring + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 149 + + Recurring + + + Trigger is recurring. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 149 + + Trigger is recurring. + + + Recurring interval days + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 153 + + Recurring interval days + + + Repeat the trigger every n days. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 153 + + Repeat the trigger every n days. + + + Trigger for documents that match all filters specified below. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 158 + + Trigger for documents that match all filters specified below. + + + Filter filename + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 161 + + Filter filename + + + Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 161 + + Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + + Filter sources + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 163 + + Filter sources + + + Filter path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 164 + + Filter path + + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 164 + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. + + + Filter mail rule + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 165 + + Filter mail rule + + + Apply to documents consumed via this mail rule. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 165 + + Apply to documents consumed via this mail rule. + + + Content matching algorithm + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 168 + + Content matching algorithm + + + Content matching pattern + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 170 + + Content matching pattern + + + Advanced Filters + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 183 + + Advanced Filters + + + Add filter + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 190 + + Add filter + + + No advanced workflow filters defined. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 195 + + No advanced workflow filters defined. + + + Complete the custom field query configuration. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 224,226 + + Complete the custom field query configuration. + + + Action type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 258 + + Action type + + + Assign title + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 263 + + Assign title + + + Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 263 + + Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. + + + Assign tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 264 + + Assign tags + + + Assign storage path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 267 + + Assign storage path + + + Assign custom fields + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 268 + + Assign custom fields + + + Assign owner + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 272 + + Assign owner + + + Assign view permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 274 + + Assign view permissions + + + Assign edit permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 293 + + Assign edit permissions + + + Remove tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 320 + + Remove tags + + + Remove all + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 321 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 327 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 333 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 339 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 345 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 352 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 358 + + Remove all + + + Remove correspondents + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 326 + + Remove correspondents + + + Remove document types + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 332 + + Remove document types + + + Remove storage paths + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 338 + + Remove storage paths + + + Remove custom fields + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 344 + + Remove custom fields + + + Remove owners + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 351 + + Remove owners + + + Remove permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 357 + + Remove permissions + + + View permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 360 + + View permissions + + + Edit permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 379 + + Edit permissions + + + Email subject + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 407 + + Email subject + + + Email body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 408 + + Email body + + + Email recipients + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 409 + + Email recipients + + + Attach document + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 410 + + Attach document + + + Webhook url + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 418 + + Webhook url + + + Use parameters for webhook body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 420 + + Use parameters for webhook body + + + Send webhook payload as JSON + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 421 + + Send webhook payload as JSON + + + Webhook params + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 424 + + Webhook params + + + Webhook body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 426 + + Webhook body + + + Webhook headers + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 428 + + Webhook headers + + + Include document + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 429 + + Include document + + + Consume Folder + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 71 + + Consume Folder + + + API Upload + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 75 + + API Upload + + + Mail Fetch + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 79 + + Mail Fetch + + + Web UI + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 83 + + Web UI + + + Modified + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 98 + + + src/app/data/document.ts + 94 + + Modified + + + Custom Field + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 102 + + Custom Field + + + Consumption Started + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 109 + + Consumption Started + + + Document Added + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 113 + + Document Added + + + Document Updated + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 117 + + Document Updated + + + Scheduled + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 121 + + Scheduled + + + Assignment + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 128 + + Assignment + + + Removal + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 132 + + Removal + + + Webhook + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 140 + + Webhook + + + Has any of these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 203 + + Has any of these tags + + + Has all of these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 210 + + Has all of these tags + + + Does not have these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 217 + + Does not have these tags + + + Has correspondent + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 224 + + Has correspondent + + + Does not have correspondents + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 232 + + Does not have correspondents + + + Has document type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 240 + + Has document type + + + Does not have document types + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 248 + + Does not have document types + + + Has storage path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 256 + + Has storage path + + + Does not have storage paths + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 264 + + Does not have storage paths + + + Matches custom field query + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 272 + + Matches custom field query + + + Create new workflow + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 474 + + Create new workflow + + + Edit workflow + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 478 + + Edit workflow + + + {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 2,6 + + {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} + + + Email address(es) + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 11 + + Email address(es) + + + Subject + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 15 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 32 + + Subject + + + Message + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 19 + + Message + + + Use archive version + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 27 + + Use archive version + + + Send email + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 33 + + Send email + + + Some email servers may reject messages with large attachments. + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 37 + + Some email servers may reject messages with large attachments. + + + Email sent + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 63 + + Email sent + + + Error emailing documents + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 69 + + Error emailing documents + + + Error emailing document + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 70 + + Error emailing document + + + Include + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 25 + + Include + + + Exclude + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 27 + + Exclude + + + Create + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 58 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + Create + + + Apply + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 64 + + Apply + + + Click again to exclude items. + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 77 + + Click again to exclude items. + + + Not assigned + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts + 95 + + Filter drop down element to filter for documents with no correspondent/type/tag assigned + Not assigned + + + Open filter + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts + 767 + + Open filter + + + Keyboard shortcuts + + src/app/components/common/hotkey-dialog/hotkey-dialog.component.ts + 24 + + Keyboard shortcuts + + + Remove + + src/app/components/common/input/check/check.component.html + 8 + + + src/app/components/common/input/date/date.component.html + 7 + + + src/app/components/common/input/document-link/document-link.component.html + 12 + + + src/app/components/common/input/file/file.component.html + 9 + + + src/app/components/common/input/file/file.component.html + 21 + + + src/app/components/common/input/monetary/monetary.component.html + 9 + + + src/app/components/common/input/number/number.component.html + 9 + + + src/app/components/common/input/select/select.component.html + 10 + + + src/app/components/common/input/switch/switch.component.html + 13 + + + src/app/components/common/input/text/text.component.html + 9 + + + src/app/components/common/input/textarea/textarea.component.html + 9 + + + src/app/components/common/input/url/url.component.html + 7 + + Remove + + + Invalid date. + + src/app/components/common/input/date/date.component.html + 31 + + Invalid date. + + + Suggestions: + + src/app/components/common/input/date/date.component.html + 37 + + + src/app/components/common/input/select/select.component.html + 61 + + + src/app/components/common/input/tags/tags.component.html + 65 + + Suggestions: + + + Filter documents with this + + src/app/components/common/input/date/date.component.ts + 120 + + + src/app/components/common/input/select/select.component.ts + 172 + + Filter documents with this + + + Remove link + + src/app/components/common/input/document-link/document-link.component.html + 43 + + + src/app/components/common/input/document-link/document-link.component.html + 50 + + Remove link + + + Open link + + src/app/components/common/input/document-link/document-link.component.html + 46 + + + src/app/components/common/input/url/url.component.html + 14 + + Open link + + + Not found + + src/app/components/common/input/document-link/document-link.component.html + 51 + + Not found + + + Search for documents + + src/app/components/common/input/document-link/document-link.component.ts + 81 + + Search for documents + + + Selected items + + src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts + 25 + + Selected items + + + No items selected + + src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts + 31 + + No items selected + + + Add + + src/app/components/common/input/entries/entries.component.html + 8 + + + src/app/components/common/permissions-select/permissions-select.component.html + 17 + + Add + + + Upload + + src/app/components/common/input/file/file.component.html + 15 + + Upload + + + Show password + + src/app/components/common/input/password/password.component.html + 6 + + Show password + + + Edit Permissions + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 9 + + Edit Permissions + + + Owner: + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 26 + + Owner: + + + Add item + + src/app/components/common/input/select/select.component.html + 25 + + Used for both types, correspondents, storage paths + Add item + + + Private + + src/app/components/common/input/select/select.component.ts + 71 + + + src/app/components/common/tag/tag.component.html + 20 + + + src/app/components/common/tag/tag.component.html + 23 + + + src/app/pipes/object-name.pipe.ts + 40 + + + src/app/pipes/object-name.pipe.ts + 46 + + Private + + + No items found + + src/app/components/common/input/select/select.component.ts + 106 + + No items found + + + Note: value has not yet been set and will not apply until explicitly changed + + src/app/components/common/input/switch/switch.component.html + 39 + + Note: value has not yet been set and will not apply until explicitly changed + + + Add tag + + src/app/components/common/input/tags/tags.component.html + 17 + + Add tag + + + Remove tag + + src/app/components/common/input/tags/tags.component.html + 23 + + Remove tag + + + Filter documents with these Tags + + src/app/components/common/input/tags/tags.component.html + 55 + + Filter documents with these Tags + + + Read more + + src/app/components/common/page-header/page-header.component.html + 15 + + + src/app/components/common/permissions-select/permissions-select.component.html + 9 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 7 + + Read more + + + Select all pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 9 + + Select all pages + + + Deselect all pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 12 + + Deselect all pages + + + Rotate selected pages counter-clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 17 + + Rotate selected pages counter-clockwise + + + Rotate selected pages clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 20 + + Rotate selected pages clockwise + + + Delete selected pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 23 + + Delete selected pages + + + Rotate page counter-clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 33 + + Rotate page counter-clockwise + + + Rotate page clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 36 + + Rotate page clockwise + + + Delete page + + src/app/components/common/pdf-editor/pdf-editor.component.html + 41 + + Delete page + + + Add / remove document split here + + src/app/components/common/pdf-editor/pdf-editor.component.html + 44 + + Add / remove document split here + + + Split here + + src/app/components/common/pdf-editor/pdf-editor.component.html + 70 + + Split here + + + Create new document(s) + + src/app/components/common/pdf-editor/pdf-editor.component.html + 82 + + Create new document(s) + + + Update existing document + + src/app/components/common/pdf-editor/pdf-editor.component.html + 87 + + Update existing document + + + Copy metadata + + src/app/components/common/pdf-editor/pdf-editor.component.html + 94 + + Copy metadata + + + Delete original + + src/app/components/common/pdf-editor/pdf-editor.component.html + 98 + + Delete original + + + Merge with existing permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 14 + + Merge with existing permissions + + + Set permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 41 + + Set permissions + + + Edit permissions for + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 46 + + Edit permissions for + + + Existing owner, user and group permissions will be merged with these settings. + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 87 + + Existing owner, user and group permissions will be merged with these settings. + + + Any and all existing owner, user and group permissions will be replaced. + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 88 + + Any and all existing owner, user and group permissions will be replaced. + + + My documents + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 26 + + My documents + + + Shared with me + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 36 + + Shared with me + + + Shared by me + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 46 + + Shared by me + + + Unowned + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 56 + + Unowned + + + Hide unowned + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 86 + + Hide unowned + + + Global permissions define what areas of the app and API endpoints users can access. + + src/app/components/common/permissions-select/permissions-select.component.html + 8 + + Global permissions define what areas of the app and API endpoints users can access. + + + Type + + src/app/components/common/permissions-select/permissions-select.component.html + 15 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 56 + + Type + + + Change + + src/app/components/common/permissions-select/permissions-select.component.html + 18 + + Change + + + Inherited from group + + src/app/components/common/permissions-select/permissions-select.component.ts + 78 + + Inherited from group + + + Error loading preview + + src/app/components/common/preview-popup/preview-popup.component.html + 10 + + Error loading preview + + + Open preview + + src/app/components/common/preview-popup/preview-popup.component.ts + 52 + + Open preview + + + Edit Profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 3 + + Edit Profile + + + Confirm Email + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 15 + + Confirm Email + + + Confirm Password + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 25 + + Confirm Password + + + API Auth Token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 33 + + API Auth Token + + + Copy + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 37 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 44 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 157 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 28 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 284 + + + src/app/components/manage/mail/mail.component.html + 156 + + + src/app/components/manage/mail/mail.component.html + 174 + + + src/app/components/manage/workflows/workflows.component.html + 56 + + + src/app/components/manage/workflows/workflows.component.html + 71 + + Copy + + + Regenerate auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 47 + + Regenerate auth token + + + Copied! + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 54 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 164 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 39 + + Copied! + + + Warning: changing the token cannot be undone + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 56 + + Warning: changing the token cannot be undone + + + Connected social accounts + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 62 + + Connected social accounts + + + Set a password before disconnecting social account. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 66 + + Set a password before disconnecting social account. + + + Disconnect + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 72 + + Disconnect + + + Disconnect social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 74 + + Disconnect social account + + + Warning: disconnecting social accounts cannot be undone + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 84 + + Warning: disconnecting social accounts cannot be undone + + + Connect new social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 89 + + Connect new social account + + + Scan the QR code with your authenticator app and then enter the code below + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 116 + + Scan the QR code with your authenticator app and then enter the code below + + + Authenticator secret + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 119 + + Authenticator secret + + + You can store this secret and use it to reinstall your authenticator app at a later time. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 120 + + You can store this secret and use it to reinstall your authenticator app at a later time. + + + Code + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 123 + + Code + + + Recovery codes will not be shown again, make sure to save them. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 142 + + Recovery codes will not be shown again, make sure to save them. + + + Copy codes + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 160 + + Copy codes + + + Emails must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 148 + + Emails must match + + + Passwords must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 176 + + Passwords must match + + + Profile updated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 198 + + Profile updated successfully + + + Error saving profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 212 + + Error saving profile + + + Error generating auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 230 + + Error generating auth token + + + Error disconnecting social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 255 + + Error disconnecting social account + + + Error fetching TOTP settings + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 274 + + Error fetching TOTP settings + + + TOTP activated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 295 + + TOTP activated successfully + + + Error activating TOTP + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 297 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 303 + + Error activating TOTP + + + TOTP deactivated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 319 + + TOTP deactivated successfully + + + Error deactivating TOTP + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 321 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 326 + + Error deactivating TOTP + + + No existing links + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 8,10 + + No existing links + + + Share + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 32 + + Share + + + Share archive version + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 48 + + Share archive version + + + Expires + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 52 + + Expires + + + 1 day + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 25 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 102 + + 1 day + + + 7 days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 26 + + 7 days + + + 30 days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 27 + + 30 days + + + Never + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 28 + + Never + + + Share Links + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 32 + + + src/app/components/document-detail/document-detail.component.html + 88 + + Share Links + + + Error retrieving links + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 83 + + Error retrieving links + + + days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 102 + + days + + + Error deleting link + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 131 + + Error deleting link + + + Error creating link + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 159 + + Error creating link + + + Environment + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 18 + + Environment + + + Paperless-ngx Version + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 22 + + Paperless-ngx Version + + + Install Type + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 35 + + Install Type + + + Server OS + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 37 + + Server OS + + + Media Storage + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 39 + + Media Storage + + + available + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 42 + + available + + + total + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 42 + + total + + + Database + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 52 + + Database + + + Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 58 + + + src/app/components/common/toast/toast.component.html + 28 + + + src/app/components/manage/mail/mail.component.html + 114 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 35 + + + src/app/components/manage/workflows/workflows.component.html + 19 + + Status + + + Migration Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 76 + + Migration Status + + + Up to date + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 80 + + Up to date + + + Latest Migration + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 85 + + Latest Migration + + + Pending Migrations + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 87 + + Pending Migrations + + + Tasks Queue + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 105 + + Tasks Queue + + + Redis Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 109 + + Redis Status + + + Celery Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 127 + + Celery Status + + + Health + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 153 + + Health + + + Search Index + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 157 + + Search Index + + + Run Task + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 177 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 211 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 245 + + Run Task + + + Last Updated + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 184 + + Last Updated + + + Classifier + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 189 + + Classifier + + + Last Trained + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 218 + + Last Trained + + + Sanity Checker + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 223 + + Sanity Checker + + + Last Run + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 252 + + Last Run + + + WebSocket Connection + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 257 + + WebSocket Connection + + + OK + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 261 + + OK + + + Copy Raw Error + + src/app/components/common/toast/toast.component.html + 43 + + Copy Raw Error + + + Hint: saved views can be created from the documents list + + src/app/components/dashboard/dashboard.component.html + 42 + + Hint: saved views can be created from the documents list + + + Hello , welcome to + + src/app/components/dashboard/dashboard.component.ts + 61 + + Hello , welcome to + + + Welcome to + + src/app/components/dashboard/dashboard.component.ts + 63 + + Welcome to + + + Dashboard updated + + src/app/components/dashboard/dashboard.component.ts + 94 + + Dashboard updated + + + Error updating dashboard + + src/app/components/dashboard/dashboard.component.ts + 97 + + Error updating dashboard + + + Show all + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 10 + + Show all + + + Filter by correspondent + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 54 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 25 + + + src/app/components/document-list/document-list.component.html + 323 + + Filter by correspondent + + + Filter by document type + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 64 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 96 + + + src/app/components/document-list/document-list.component.html + 363 + + Filter by document type + + + Filter by storage path + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 69 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 102 + + + src/app/components/document-list/document-list.component.html + 370 + + Filter by storage path + + + Filter by owner + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 74 + + Filter by owner + + + Yes + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 84 + + + src/app/components/document-list/document-list.component.html + 391 + + Yes + + + No + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 84 + + + src/app/components/document-list/document-list.component.html + 391 + + No + + + No documents + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 149 + + No documents + + + Statistics + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 1 + + Statistics + + + Go to inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 28 + + Go to inbox + + + Documents in inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 29 + + Documents in inbox + + + Go to documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 33 + + Go to documents + + + Total documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 34 + + Total documents + + + Total characters + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 38 + + Total characters + + + Current ASN + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 43 + + Current ASN + + + Other + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts + 79 + + Other + + + Upload documents + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 6 + + Upload documents + + + or drop files anywhere + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 7 + + or drop files anywhere + + + Dismiss completed + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 23 + + This button dismisses all status messages about processed documents on the dashboard (failed and successful) + Dismiss completed + + + Processing: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 57 + + Processing: + + + Failed: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 60 + + Failed: + + + Added: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 63 + + Added: + + + , + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 66 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 386 + + this string is used to separate processing, failed and added on the file upload widget + , + + + Paperless-ngx is running! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 2 + + Paperless-ngx is running! + + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 3 + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 4 + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + + Thanks for being a part of the Paperless-ngx community! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 7 + + Thanks for being a part of the Paperless-ngx community! + + + Start the tour + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 8 + + Start the tour + + + Searching document with asn + + src/app/components/document-asn/document-asn.component.html + 1 + + Searching document with asn + + + Page + + src/app/components/document-detail/document-detail.component.html + 5 + + + src/app/components/document-list/document-list.component.html + 27 + + Page + + + of + + src/app/components/document-detail/document-detail.component.html + 7,8 + + of + + + - + + src/app/components/document-detail/document-detail.component.html + 11 + + - + + + + + + src/app/components/document-detail/document-detail.component.html + 19 + + + + + + Download original + + src/app/components/document-detail/document-detail.component.html + 41 + + Download original + + + Reprocess + + src/app/components/document-detail/document-detail.component.html + 54 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 91 + + Reprocess + + + Print + + src/app/components/document-detail/document-detail.component.html + 58 + + Print + + + More like this + + src/app/components/document-detail/document-detail.component.html + 62 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 69 + + More like this + + + PDF Editor + + src/app/components/document-detail/document-detail.component.html + 66 + + + src/app/components/document-detail/document-detail.component.ts + 1392 + + PDF Editor + + + Send + + src/app/components/document-detail/document-detail.component.html + 84 + + Send + + + Previous + + src/app/components/document-detail/document-detail.component.html + 110 + + Previous + + + Details + + src/app/components/document-detail/document-detail.component.html + 123 + + Details + + + Title + + src/app/components/document-detail/document-detail.component.html + 126 + + + src/app/components/document-list/document-list.component.html + 221 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 195 + + + src/app/data/document.ts + 30 + + + src/app/data/document.ts + 90 + + Title + + + Archive serial number + + src/app/components/document-detail/document-detail.component.html + 127 + + Archive serial number + + + Date created + + src/app/components/document-detail/document-detail.component.html + 128 + + Date created + + + Correspondent + + src/app/components/document-detail/document-detail.component.html + 130 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 19 + + + src/app/components/document-list/document-list.component.html + 211 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 50 + + + src/app/data/document.ts + 46 + + + src/app/data/document.ts + 89 + + Correspondent + + + Document type + + src/app/components/document-detail/document-detail.component.html + 132 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 33 + + + src/app/components/document-list/document-list.component.html + 251 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 61 + + + src/app/data/document.ts + 50 + + + src/app/data/document.ts + 91 + + Document type + + + Storage path + + src/app/components/document-detail/document-detail.component.html + 134 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 47 + + + src/app/components/document-list/document-list.component.html + 260 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 72 + + + src/app/data/document.ts + 54 + + Storage path + + + Default + + src/app/components/document-detail/document-detail.component.html + 135 + + + src/app/components/manage/saved-views/saved-views.component.html + 52 + + Default + + + Content + + src/app/components/document-detail/document-detail.component.html + 239 + + Content + + + Metadata + + src/app/components/document-detail/document-detail.component.html + 248 + + + src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts + 20 + + Metadata + + + Date modified + + src/app/components/document-detail/document-detail.component.html + 255 + + Date modified + + + Date added + + src/app/components/document-detail/document-detail.component.html + 259 + + Date added + + + Media filename + + src/app/components/document-detail/document-detail.component.html + 263 + + Media filename + + + Original filename + + src/app/components/document-detail/document-detail.component.html + 267 + + Original filename + + + Original MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 271 + + Original MD5 checksum + + + Original file size + + src/app/components/document-detail/document-detail.component.html + 275 + + Original file size + + + Original mime type + + src/app/components/document-detail/document-detail.component.html + 279 + + Original mime type + + + Archive MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 284 + + Archive MD5 checksum + + + Archive file size + + src/app/components/document-detail/document-detail.component.html + 290 + + Archive file size + + + Original document metadata + + src/app/components/document-detail/document-detail.component.html + 299 + + Original document metadata + + + Archived document metadata + + src/app/components/document-detail/document-detail.component.html + 302 + + Archived document metadata + + + Notes + + src/app/components/document-detail/document-detail.component.html + 321,324 + + Notes + + + History + + src/app/components/document-detail/document-detail.component.html + 332 + + History + + + Save & next + + src/app/components/document-detail/document-detail.component.html + 369 + + Save & next + + + Save & close + + src/app/components/document-detail/document-detail.component.html + 372 + + Save & close + + + Document loading... + + src/app/components/document-detail/document-detail.component.html + 382 + + Document loading... + + + Enter Password + + src/app/components/document-detail/document-detail.component.html + 436 + + Enter Password + + + An error occurred loading content: + + src/app/components/document-detail/document-detail.component.ts + 416,418 + + An error occurred loading content: + + + Document changes detected + + src/app/components/document-detail/document-detail.component.ts + 450 + + Document changes detected + + + The version of this document in your browser session appears older than the existing version. + + src/app/components/document-detail/document-detail.component.ts + 451 + + The version of this document in your browser session appears older than the existing version. + + + Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + + src/app/components/document-detail/document-detail.component.ts + 452 + + Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + + + Ok + + src/app/components/document-detail/document-detail.component.ts + 454 + + Ok + + + Next document + + src/app/components/document-detail/document-detail.component.ts + 580 + + Next document + + + Previous document + + src/app/components/document-detail/document-detail.component.ts + 590 + + Previous document + + + Close document + + src/app/components/document-detail/document-detail.component.ts + 598 + + + src/app/services/open-documents.service.ts + 130 + + Close document + + + Save document + + src/app/components/document-detail/document-detail.component.ts + 605 + + Save document + + + Save and close / next + + src/app/components/document-detail/document-detail.component.ts + 614 + + Save and close / next + + + Error retrieving metadata + + src/app/components/document-detail/document-detail.component.ts + 669 + + Error retrieving metadata + + + Error retrieving suggestions. + + src/app/components/document-detail/document-detail.component.ts + 698 + + Error retrieving suggestions. + + + Document "" saved successfully. + + src/app/components/document-detail/document-detail.component.ts + 870 + + + src/app/components/document-detail/document-detail.component.ts + 894 + + Document "" saved successfully. + + + Error saving document "" + + src/app/components/document-detail/document-detail.component.ts + 900 + + Error saving document "" + + + Error saving document + + src/app/components/document-detail/document-detail.component.ts + 950 + + Error saving document + + + Do you really want to move the document "" to the trash? + + src/app/components/document-detail/document-detail.component.ts + 982 + + Do you really want to move the document "" to the trash? + + + Documents can be restored prior to permanent deletion. + + src/app/components/document-detail/document-detail.component.ts + 983 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 754 + + Documents can be restored prior to permanent deletion. + + + Move to trash + + src/app/components/document-detail/document-detail.component.ts + 985 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 756 + + Move to trash + + + Error deleting document + + src/app/components/document-detail/document-detail.component.ts + 1004 + + Error deleting document + + + Reprocess confirm + + src/app/components/document-detail/document-detail.component.ts + 1024 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 794 + + Reprocess confirm + + + This operation will permanently recreate the archive file for this document. + + src/app/components/document-detail/document-detail.component.ts + 1025 + + This operation will permanently recreate the archive file for this document. + + + The archive file will be re-generated with the current settings. + + src/app/components/document-detail/document-detail.component.ts + 1026 + + The archive file will be re-generated with the current settings. + + + Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + src/app/components/document-detail/document-detail.component.ts + 1036 + + Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + + Error executing operation + + src/app/components/document-detail/document-detail.component.ts + 1047 + + Error executing operation + + + Error downloading document + + src/app/components/document-detail/document-detail.component.ts + 1096 + + Error downloading document + + + Page Fit + + src/app/components/document-detail/document-detail.component.ts + 1173 + + Page Fit + + + PDF edit operation for "" will begin in the background. + + src/app/components/document-detail/document-detail.component.ts + 1411 + + PDF edit operation for "" will begin in the background. + + + Error executing PDF edit operation + + src/app/components/document-detail/document-detail.component.ts + 1423 + + Error executing PDF edit operation + + + Print failed. + + src/app/components/document-detail/document-detail.component.ts + 1460 + + Print failed. + + + Error loading document for printing. + + src/app/components/document-detail/document-detail.component.ts + 1472 + + Error loading document for printing. + + + An error occurred loading tiff: + + src/app/components/document-detail/document-detail.component.ts + 1537 + + + src/app/components/document-detail/document-detail.component.ts + 1541 + + An error occurred loading tiff: + + + No entries found. + + src/app/components/document-history/document-history.component.html + 10 + + No entries found. + + + Edit: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 3 + + Edit: + + + Filter tags + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 6 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 40 + + Filter tags + + + Filter correspondents + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 20 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 51 + + Filter correspondents + + + Filter document types + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 34 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 62 + + Filter document types + + + Filter storage paths + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 48 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 73 + + Filter storage paths + + + Custom fields + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 61 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 84 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 203 + + Custom fields + + + Filter custom fields + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 62 + + Filter custom fields + + + Set values + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 70 + + Set values + + + Rotate + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 94 + + Rotate + + + Merge + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 97 + + Merge + + + Include: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 123 + + Include: + + + Archived files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 127 + + Archived files + + + Original files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 131 + + Original files + + + Use formatted filename + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 136 + + Use formatted filename + + + Error executing bulk operation + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 290 + + Error executing bulk operation + + + "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 378 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 384 + + "" + + + "" and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 380 + + This is for messages like 'modify "tag1" and "tag2"' + "" and "" + + + and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 388,390 + + this is for messages like 'modify "tag1", "tag2" and "tag3"' + and "" + + + Confirm tags assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 405 + + Confirm tags assignment + + + This operation will add the tag "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 411 + + This operation will add the tag "" to selected document(s). + + + This operation will add the tags to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 416,418 + + This operation will add the tags to selected document(s). + + + This operation will remove the tag "" from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 424 + + This operation will remove the tag "" from selected document(s). + + + This operation will remove the tags from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 429,431 + + This operation will remove the tags from selected document(s). + + + This operation will add the tags and remove the tags on selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 433,437 + + This operation will add the tags and remove the tags on selected document(s). + + + Confirm correspondent assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 474 + + Confirm correspondent assignment + + + This operation will assign the correspondent "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 476 + + This operation will assign the correspondent "" to selected document(s). + + + This operation will remove the correspondent from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 478 + + This operation will remove the correspondent from selected document(s). + + + Confirm document type assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 512 + + Confirm document type assignment + + + This operation will assign the document type "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 514 + + This operation will assign the document type "" to selected document(s). + + + This operation will remove the document type from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 516 + + This operation will remove the document type from selected document(s). + + + Confirm storage path assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 550 + + Confirm storage path assignment + + + This operation will assign the storage path "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 552 + + This operation will assign the storage path "" to selected document(s). + + + This operation will remove the storage path from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 554 + + This operation will remove the storage path from selected document(s). + + + Confirm custom field assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 583 + + Confirm custom field assignment + + + This operation will assign the custom field "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 589 + + This operation will assign the custom field "" to selected document(s). + + + This operation will assign the custom fields to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 594,596 + + This operation will assign the custom fields to selected document(s). + + + This operation will remove the custom field "" from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 602 + + This operation will remove the custom field "" from selected document(s). + + + This operation will remove the custom fields from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 607,609 + + This operation will remove the custom fields from selected document(s). + + + This operation will assign the custom fields and remove the custom fields on selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 611,615 + + This operation will assign the custom fields and remove the custom fields on selected document(s). + + + Move selected document(s) to the trash? + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 753 + + Move selected document(s) to the trash? + + + This operation will permanently recreate the archive files for selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 795 + + This operation will permanently recreate the archive files for selected document(s). + + + The archive files will be re-generated with the current settings. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 796 + + The archive files will be re-generated with the current settings. + + + Rotate confirm + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 828 + + Rotate confirm + + + This operation will permanently rotate the original version of document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 829 + + This operation will permanently rotate the original version of document(s). + + + Merge confirm + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 848 + + Merge confirm + + + This operation will merge selected documents into a new document. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 849 + + This operation will merge selected documents into a new document. + + + Merged document will be queued for consumption. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 868 + + Merged document will be queued for consumption. + + + Custom fields updated. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 892 + + Custom fields updated. + + + Error updating custom fields. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 901 + + Error updating custom fields. + + + {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 3,7 + + {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} + + + Select custom fields + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 13 + + Select custom fields + + + {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also + remove custom fields from the selected documents.}} + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 73,78 + + {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also + remove custom fields from the selected documents.}} + + + Filter by tag + + src/app/components/document-list/document-card-large/document-card-large.component.html + 36 + + + src/app/components/document-list/document-list.component.html + 339 + + Filter by tag + + + View notes + + src/app/components/document-list/document-card-large/document-card-large.component.html + 91 + + View notes + + + Created: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 115,116 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 76,77 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 91,92 + + Created: + + + Added: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 116,117 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 77,78 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 92,93 + + Added: + + + Modified: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 117,118 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 78,79 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 93,94 + + Modified: + + + {VAR_PLURAL, plural, =1 {1 page} other { pages}} + + src/app/components/document-list/document-card-large/document-card-large.component.html + 134 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 106 + + {VAR_PLURAL, plural, =1 {1 page} other { pages}} + + + Shared + + src/app/components/document-list/document-card-large/document-card-large.component.html + 144 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 125 + + + src/app/data/document.ts + 66 + + + src/app/pipes/username.pipe.ts + 35 + + Shared + + + Score: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 149 + + Score: + + + Toggle tag filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 20 + + Toggle tag filter + + + Toggle correspondent filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 43 + + Toggle correspondent filter + + + Toggle document type filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 59 + + Toggle document type filter + + + Toggle storage path filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 66 + + Toggle storage path filter + + + Select + + src/app/components/document-list/document-list.component.html + 5 + + + src/app/data/custom-field.ts + 51 + + Select + + + Select none + + src/app/components/document-list/document-list.component.html + 11 + + Select none + + + Select page + + src/app/components/document-list/document-list.component.html + 12 + + + src/app/components/document-list/document-list.component.ts + 315 + + Select page + + + Select all + + src/app/components/document-list/document-list.component.html + 13 + + + src/app/components/document-list/document-list.component.ts + 308 + + Select all + + + Select: + + src/app/components/document-list/document-list.component.html + 18 + + Select: + + + None + + src/app/components/document-list/document-list.component.html + 23 + + + src/app/components/manage/management-list/management-list.component.ts + 124 + + + src/app/data/matching-model.ts + 45 + + None + + + Sort + + src/app/components/document-list/document-list.component.html + 68 + + Sort + + + Views + + src/app/components/document-list/document-list.component.html + 94 + + Views + + + Save "" + + src/app/components/document-list/document-list.component.html + 113 + + Save "" + + + Save as... + + src/app/components/document-list/document-list.component.html + 116 + + Save as... + + + All saved views + + src/app/components/document-list/document-list.component.html + 117 + + All saved views + + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + src/app/components/document-list/document-list.component.html + 137 + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + src/app/components/document-list/document-list.component.html + 141 + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + + (filtered) + + src/app/components/document-list/document-list.component.html + 143 + + (filtered) + + + Reset filters + + src/app/components/document-list/document-list.component.html + 148 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 107 + + Reset filters + + + Error while loading documents + + src/app/components/document-list/document-list.component.html + 169 + + Error while loading documents + + + Sort by ASN + + src/app/components/document-list/document-list.component.html + 198 + + Sort by ASN + + + ASN + + src/app/components/document-list/document-list.component.html + 202 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 200 + + + src/app/data/document.ts + 70 + + + src/app/data/document.ts + 88 + + ASN + + + Sort by correspondent + + src/app/components/document-list/document-list.component.html + 207 + + Sort by correspondent + + + Sort by title + + src/app/components/document-list/document-list.component.html + 216 + + Sort by title + + + Sort by owner + + src/app/components/document-list/document-list.component.html + 229 + + Sort by owner + + + Owner + + src/app/components/document-list/document-list.component.html + 233 + + + src/app/data/document.ts + 62 + + + src/app/data/document.ts + 96 + + Owner + + + Sort by notes + + src/app/components/document-list/document-list.component.html + 238 + + Sort by notes + + + Sort by document type + + src/app/components/document-list/document-list.component.html + 247 + + Sort by document type + + + Sort by storage path + + src/app/components/document-list/document-list.component.html + 256 + + Sort by storage path + + + Sort by created date + + src/app/components/document-list/document-list.component.html + 265 + + Sort by created date + + + Sort by added date + + src/app/components/document-list/document-list.component.html + 274 + + Sort by added date + + + Sort by number of pages + + src/app/components/document-list/document-list.component.html + 283 + + Sort by number of pages + + + Pages + + src/app/components/document-list/document-list.component.html + 287 + + + src/app/data/document.ts + 74 + + + src/app/data/document.ts + 97 + + + src/app/data/paperless-config.ts + 91 + + Pages + + + Shared + + src/app/components/document-list/document-list.component.html + 290,292 + + Shared + + + Sort by + + src/app/components/document-list/document-list.component.html + 297,298 + + Sort by + + + Edit document + + src/app/components/document-list/document-list.component.html + 331 + + Edit document + + + Preview document + + src/app/components/document-list/document-list.component.html + 332 + + Preview document + + + Reset filters / selection + + src/app/components/document-list/document-list.component.ts + 296 + + Reset filters / selection + + + Open first [selected] document + + src/app/components/document-list/document-list.component.ts + 324 + + Open first [selected] document + + + Previous page + + src/app/components/document-list/document-list.component.ts + 340 + + Previous page + + + Next page + + src/app/components/document-list/document-list.component.ts + 352 + + Next page + + + View "" saved successfully. + + src/app/components/document-list/document-list.component.ts + 385 + + View "" saved successfully. + + + Failed to save view "". + + src/app/components/document-list/document-list.component.ts + 391 + + Failed to save view "". + + + View "" created successfully. + + src/app/components/document-list/document-list.component.ts + 437 + + View "" created successfully. + + + Dates + + src/app/components/document-list/filter-editor/filter-editor.component.html + 90 + + Dates + + + Title & content + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 198 + + Title & content + + + File type + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 205 + + File type + + + More like + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 214 + + More like + + + equals + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 220 + + equals + + + is empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 224 + + is empty + + + is not empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 228 + + is not empty + + + greater than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 232 + + greater than + + + less than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 236 + + less than + + + Correspondent: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 277,281 + + Correspondent: + + + Without correspondent + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 283 + + Without correspondent + + + Document type: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 289,293 + + Document type: + + + Without document type + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 295 + + Without document type + + + Storage path: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 301,305 + + Storage path: + + + Without storage path + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 307 + + Without storage path + + + Tag: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 311,313 + + Tag: + + + Without any tag + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 317 + + Without any tag + + + Custom fields query + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 321 + + Custom fields query + + + Title: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 324 + + Title: + + + ASN: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 327 + + ASN: + + + Owner: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 330 + + Owner: + + + Owner not in: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 333 + + Owner not in: + + + Without an owner + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 336 + + Without an owner + + + Save current view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 3 + + Save current view + + + Show in sidebar + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 9 + + + src/app/components/manage/saved-views/saved-views.component.html + 24 + + Show in sidebar + + + Show on dashboard + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 10 + + + src/app/components/manage/saved-views/saved-views.component.html + 20 + + Show on dashboard + + + Filter rules error occurred while saving this view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 13 + + Filter rules error occurred while saving this view + + + The error returned was + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 14 + + The error returned was + + + Enter note + + src/app/components/document-notes/document-notes.component.html + 5 + + Enter note + + + Please enter a note. + + src/app/components/document-notes/document-notes.component.html + 6,8 + + Please enter a note. + + + Add note + + src/app/components/document-notes/document-notes.component.html + 14 + + Add note + + + Delete note + + src/app/components/document-notes/document-notes.component.html + 25 + + + src/app/components/document-notes/document-notes.component.html + 27 + + Delete note + + + Error saving note + + src/app/components/document-notes/document-notes.component.ts + 81 + + Error saving note + + + Error deleting note + + src/app/components/document-notes/document-notes.component.ts + 95 + + Error deleting note + + + Drop files to begin upload + + src/app/components/file-drop/file-drop.component.html + 6 + + Drop files to begin upload + + + Initiating upload... + + src/app/components/file-drop/file-drop.component.ts + 137 + + + src/app/components/file-drop/file-drop.component.ts + 146 + + Initiating upload... + + + Failed to read dropped items: + + src/app/components/file-drop/file-drop.component.ts + 142 + + Failed to read dropped items: + + + correspondent + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 47 + + correspondent + + + correspondents + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 48 + + correspondents + + + Last used + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 53 + + Last used + + + Do you really want to delete the correspondent ""? + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 78 + + Do you really want to delete the correspondent ""? + + + Customize the data fields that can be attached to documents. + + src/app/components/manage/custom-fields/custom-fields.component.html + 4 + + Customize the data fields that can be attached to documents. + + + Add Field + + src/app/components/manage/custom-fields/custom-fields.component.html + 9 + + Add Field + + + Data Type + + src/app/components/manage/custom-fields/custom-fields.component.html + 18 + + Data Type + + + Filter Documents () + + src/app/components/manage/custom-fields/custom-fields.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + Filter Documents () + + + No fields defined. + + src/app/components/manage/custom-fields/custom-fields.component.html + 70 + + No fields defined. + + + Confirm delete field + + src/app/components/manage/custom-fields/custom-fields.component.ts + 102 + + Confirm delete field + + + This operation will permanently delete this field. + + src/app/components/manage/custom-fields/custom-fields.component.ts + 103 + + This operation will permanently delete this field. + + + Deleted field "" + + src/app/components/manage/custom-fields/custom-fields.component.ts + 112 + + Deleted field "" + + + Error deleting field "". + + src/app/components/manage/custom-fields/custom-fields.component.ts + 121 + + Error deleting field "". + + + document type + + src/app/components/manage/document-type-list/document-type-list.component.ts + 43 + + document type + + + document types + + src/app/components/manage/document-type-list/document-type-list.component.ts + 44 + + document types + + + Do you really want to delete the document type ""? + + src/app/components/manage/document-type-list/document-type-list.component.ts + 49 + + Do you really want to delete the document type ""? + + + Mail Settings + + src/app/components/manage/mail/mail.component.html + 2 + + Mail Settings + + + Mail accounts + + src/app/components/manage/mail/mail.component.html + 12 + + Mail accounts + + + Add Account + + src/app/components/manage/mail/mail.component.html + 14 + + Add Account + + + Connect Gmail Account + + src/app/components/manage/mail/mail.component.html + 18 + + Connect Gmail Account + + + Connect Outlook Account + + src/app/components/manage/mail/mail.component.html + 23 + + Connect Outlook Account + + + Server + + src/app/components/manage/mail/mail.component.html + 31 + + Server + + + Process Mail + + src/app/components/manage/mail/mail.component.html + 68 + + + src/app/components/manage/mail/mail.component.html + 86 + + Process Mail + + + No mail accounts defined. + + src/app/components/manage/mail/mail.component.html + 95 + + No mail accounts defined. + + + Mail rules + + src/app/components/manage/mail/mail.component.html + 103 + + Mail rules + + + Add Rule + + src/app/components/manage/mail/mail.component.html + 105 + + Add Rule + + + Sort Order + + src/app/components/manage/mail/mail.component.html + 112 + + Sort Order + + + Disabled + + src/app/components/manage/mail/mail.component.html + 137 + + + src/app/components/manage/workflows/workflows.component.html + 41 + + Disabled + + + View Processed Mail + + src/app/components/manage/mail/mail.component.html + 143 + + View Processed Mail + + + No mail rules defined. + + src/app/components/manage/mail/mail.component.html + 183 + + No mail rules defined. + + + Error retrieving mail accounts + + src/app/components/manage/mail/mail.component.ts + 105 + + Error retrieving mail accounts + + + Error retrieving mail rules + + src/app/components/manage/mail/mail.component.ts + 127 + + Error retrieving mail rules + + + OAuth2 authentication success + + src/app/components/manage/mail/mail.component.ts + 135 + + OAuth2 authentication success + + + OAuth2 authentication failed, see logs for details + + src/app/components/manage/mail/mail.component.ts + 146 + + OAuth2 authentication failed, see logs for details + + + Saved account "". + + src/app/components/manage/mail/mail.component.ts + 170 + + Saved account "". + + + Error saving account. + + src/app/components/manage/mail/mail.component.ts + 182 + + Error saving account. + + + Confirm delete mail account + + src/app/components/manage/mail/mail.component.ts + 190 + + Confirm delete mail account + + + This operation will permanently delete this mail account. + + src/app/components/manage/mail/mail.component.ts + 191 + + This operation will permanently delete this mail account. + + + Deleted mail account "" + + src/app/components/manage/mail/mail.component.ts + 201 + + Deleted mail account "" + + + Error deleting mail account "". + + src/app/components/manage/mail/mail.component.ts + 212 + + Error deleting mail account "". + + + Processing mail account "" + + src/app/components/manage/mail/mail.component.ts + 224 + + Processing mail account "" + + + Error processing mail account "" + + src/app/components/manage/mail/mail.component.ts + 229 + + Error processing mail account "" + + + Saved rule "". + + src/app/components/manage/mail/mail.component.ts + 247 + + Saved rule "". + + + Error saving rule. + + src/app/components/manage/mail/mail.component.ts + 258 + + Error saving rule. + + + Rule "" enabled. + + src/app/components/manage/mail/mail.component.ts + 274 + + Rule "" enabled. + + + Rule "" disabled. + + src/app/components/manage/mail/mail.component.ts + 275 + + Rule "" disabled. + + + Error toggling rule "". + + src/app/components/manage/mail/mail.component.ts + 280 + + Error toggling rule "". + + + Confirm delete mail rule + + src/app/components/manage/mail/mail.component.ts + 291 + + Confirm delete mail rule + + + This operation will permanently delete this mail rule. + + src/app/components/manage/mail/mail.component.ts + 292 + + This operation will permanently delete this mail rule. + + + Deleted mail rule "" + + src/app/components/manage/mail/mail.component.ts + 302 + + Deleted mail rule "" + + + Error deleting mail rule "". + + src/app/components/manage/mail/mail.component.ts + 313 + + Error deleting mail rule "". + + + Permissions updated + + src/app/components/manage/mail/mail.component.ts + 337 + + Permissions updated + + + Error updating permissions + + src/app/components/manage/mail/mail.component.ts + 342 + + + src/app/components/manage/management-list/management-list.component.ts + 353 + + Error updating permissions + + + Processed Mail for + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 2 + + Processed Mail for + + + No processed email messages found. + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 20 + + No processed email messages found. + + + Received + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 33 + + Received + + + Processed + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 34 + + Processed + + + Processed mail(s) deleted + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.ts + 72 + + Processed mail(s) deleted + + + Filter by: + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + Filter by: + + + Matching + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + Matching + + + Document count + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + Document count + + + {VAR_PLURAL, plural, =1 {One } other { total }} + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + {VAR_PLURAL, plural, =1 {One } other { total }} + + + Automatic + + src/app/components/manage/management-list/management-list.component.ts + 122 + + + src/app/data/matching-model.ts + 15 + + Automatic + + + Successfully created . + + src/app/components/manage/management-list/management-list.component.ts + 200 + + Successfully created . + + + Error occurred while creating . + + src/app/components/manage/management-list/management-list.component.ts + 205 + + Error occurred while creating . + + + Successfully updated "". + + src/app/components/manage/management-list/management-list.component.ts + 220 + + Successfully updated "". + + + Error occurred while saving . + + src/app/components/manage/management-list/management-list.component.ts + 225 + + Error occurred while saving . + + + Associated documents will not be deleted. + + src/app/components/manage/management-list/management-list.component.ts + 245 + + Associated documents will not be deleted. + + + Error while deleting element + + src/app/components/manage/management-list/management-list.component.ts + 261 + + Error while deleting element + + + Permissions updated successfully + + src/app/components/manage/management-list/management-list.component.ts + 346 + + Permissions updated successfully + + + This operation will permanently delete all objects. + + src/app/components/manage/management-list/management-list.component.ts + 367 + + This operation will permanently delete all objects. + + + Objects deleted successfully + + src/app/components/manage/management-list/management-list.component.ts + 381 + + Objects deleted successfully + + + Error deleting objects + + src/app/components/manage/management-list/management-list.component.ts + 387 + + Error deleting objects + + + Customize the views of your documents. + + src/app/components/manage/saved-views/saved-views.component.html + 4 + + Customize the views of your documents. + + + Documents page size + + src/app/components/manage/saved-views/saved-views.component.html + 41 + + Documents page size + + + Display as + + src/app/components/manage/saved-views/saved-views.component.html + 44 + + Display as + + + Table + + src/app/components/manage/saved-views/saved-views.component.html + 46 + + Table + + + Small Cards + + src/app/components/manage/saved-views/saved-views.component.html + 47 + + Small Cards + + + Large Cards + + src/app/components/manage/saved-views/saved-views.component.html + 48 + + Large Cards + + + No saved views defined. + + src/app/components/manage/saved-views/saved-views.component.html + 61 + + No saved views defined. + + + Saved view "" deleted. + + src/app/components/manage/saved-views/saved-views.component.ts + 133 + + Saved view "" deleted. + + + Views saved successfully. + + src/app/components/manage/saved-views/saved-views.component.ts + 158 + + Views saved successfully. + + + Error while saving views. + + src/app/components/manage/saved-views/saved-views.component.ts + 163 + + Error while saving views. + + + storage path + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 43 + + storage path + + + storage paths + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 44 + + storage paths + + + Do you really want to delete the storage path ""? + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 60 + + Do you really want to delete the storage path ""? + + + tag + + src/app/components/manage/tag-list/tag-list.component.ts + 43 + + tag + + + tags + + src/app/components/manage/tag-list/tag-list.component.ts + 44 + + tags + + + Do you really want to delete the tag ""? + + src/app/components/manage/tag-list/tag-list.component.ts + 60 + + Do you really want to delete the tag ""? + + + Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. + + src/app/components/manage/workflows/workflows.component.html + 4 + + Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. + + + Add Workflow + + src/app/components/manage/workflows/workflows.component.html + 9 + + Add Workflow + + + No workflows defined. + + src/app/components/manage/workflows/workflows.component.html + 80 + + No workflows defined. + + + Saved workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 90 + + Saved workflow "". + + + Error saving workflow. + + src/app/components/manage/workflows/workflows.component.ts + 98 + + Error saving workflow. + + + Confirm delete workflow + + src/app/components/manage/workflows/workflows.component.ts + 131 + + Confirm delete workflow + + + This operation will permanently delete this workflow. + + src/app/components/manage/workflows/workflows.component.ts + 132 + + This operation will permanently delete this workflow. + + + Deleted workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 142 + + Deleted workflow "". + + + Error deleting workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 149 + + Error deleting workflow "". + + + Enabled workflow "" + + src/app/components/manage/workflows/workflows.component.ts + 162 + + Enabled workflow "" + + + Disabled workflow "" + + src/app/components/manage/workflows/workflows.component.ts + 163 + + Disabled workflow "" + + + Error toggling workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 170 + + Error toggling workflow "". + + + Not Found + + src/app/components/not-found/not-found.component.html + 6 + + Not Found + + + Go to Dashboard + + src/app/components/not-found/not-found.component.html + 9 + + Go to Dashboard + + + Equal to + + src/app/data/custom-field-query.ts + 24 + + Equal to + + + In + + src/app/data/custom-field-query.ts + 25 + + In + + + Is null + + src/app/data/custom-field-query.ts + 26 + + Is null + + + Exists + + src/app/data/custom-field-query.ts + 27 + + Exists + + + Contains + + src/app/data/custom-field-query.ts + 28 + + Contains + + + Contains (case-insensitive) + + src/app/data/custom-field-query.ts + 29 + + Contains (case-insensitive) + + + Greater than + + src/app/data/custom-field-query.ts + 30 + + Greater than + + + Greater than or equal to + + src/app/data/custom-field-query.ts + 31 + + Greater than or equal to + + + Less than + + src/app/data/custom-field-query.ts + 32 + + Less than + + + Less than or equal to + + src/app/data/custom-field-query.ts + 33 + + Less than or equal to + + + Range + + src/app/data/custom-field-query.ts + 34 + + Range + + + Boolean + + src/app/data/custom-field.ts + 19 + + Boolean + + + Date + + src/app/data/custom-field.ts + 23 + + Date + + + Integer + + src/app/data/custom-field.ts + 27 + + Integer + + + Number + + src/app/data/custom-field.ts + 31 + + Number + + + Monetary + + src/app/data/custom-field.ts + 35 + + Monetary + + + Text + + src/app/data/custom-field.ts + 39 + + Text + + + Url + + src/app/data/custom-field.ts + 43 + + Url + + + Document Link + + src/app/data/custom-field.ts + 47 + + Document Link + + + Long Text + + src/app/data/custom-field.ts + 55 + + Long Text + + + Search score + + src/app/data/document.ts + 103 + + Score is a value returned by the full text search engine and specifies how well a result matches the given query + Search score + + + Auto: Learn matching automatically + + src/app/data/matching-model.ts + 16 + + Auto: Learn matching automatically + + + Any word + + src/app/data/matching-model.ts + 20 + + Any word + + + Any: Document contains any of these words (space separated) + + src/app/data/matching-model.ts + 21 + + Any: Document contains any of these words (space separated) + + + All words + + src/app/data/matching-model.ts + 25 + + All words + + + All: Document contains all of these words (space separated) + + src/app/data/matching-model.ts + 26 + + All: Document contains all of these words (space separated) + + + Exact match + + src/app/data/matching-model.ts + 30 + + Exact match + + + Exact: Document contains this string + + src/app/data/matching-model.ts + 31 + + Exact: Document contains this string + + + Regular expression + + src/app/data/matching-model.ts + 35 + + Regular expression + + + Regular expression: Document matches this regular expression + + src/app/data/matching-model.ts + 36 + + Regular expression: Document matches this regular expression + + + Fuzzy word + + src/app/data/matching-model.ts + 40 + + Fuzzy word + + + Fuzzy: Document contains a word similar to this word + + src/app/data/matching-model.ts + 41 + + Fuzzy: Document contains a word similar to this word + + + None: Disable matching + + src/app/data/matching-model.ts + 46 + + None: Disable matching + + + General Settings + + src/app/data/paperless-config.ts + 50 + + General Settings + + + OCR Settings + + src/app/data/paperless-config.ts + 51 + + OCR Settings + + + Barcode Settings + + src/app/data/paperless-config.ts + 52 + + Barcode Settings + + + Output Type + + src/app/data/paperless-config.ts + 76 + + Output Type + + + Language + + src/app/data/paperless-config.ts + 84 + + Language + + + Mode + + src/app/data/paperless-config.ts + 98 + + Mode + + + Skip Archive File + + src/app/data/paperless-config.ts + 106 + + Skip Archive File + + + Image DPI + + src/app/data/paperless-config.ts + 114 + + Image DPI + + + Clean + + src/app/data/paperless-config.ts + 121 + + Clean + + + Deskew + + src/app/data/paperless-config.ts + 129 + + Deskew + + + Rotate Pages + + src/app/data/paperless-config.ts + 136 + + Rotate Pages + + + Rotate Pages Threshold + + src/app/data/paperless-config.ts + 143 + + Rotate Pages Threshold + + + Max Image Pixels + + src/app/data/paperless-config.ts + 150 + + Max Image Pixels + + + Color Conversion Strategy + + src/app/data/paperless-config.ts + 157 + + Color Conversion Strategy + + + OCR Arguments + + src/app/data/paperless-config.ts + 165 + + OCR Arguments + + + Application Logo + + src/app/data/paperless-config.ts + 172 + + Application Logo + + + Application Title + + src/app/data/paperless-config.ts + 179 + + Application Title + + + Enable Barcodes + + src/app/data/paperless-config.ts + 186 + + Enable Barcodes + + + Enable TIFF Support + + src/app/data/paperless-config.ts + 193 + + Enable TIFF Support + + + Barcode String + + src/app/data/paperless-config.ts + 200 + + Barcode String + + + Retain Split Pages + + src/app/data/paperless-config.ts + 207 + + Retain Split Pages + + + Enable ASN + + src/app/data/paperless-config.ts + 214 + + Enable ASN + + + ASN Prefix + + src/app/data/paperless-config.ts + 221 + + ASN Prefix + + + Upscale + + src/app/data/paperless-config.ts + 228 + + Upscale + + + DPI + + src/app/data/paperless-config.ts + 235 + + DPI + + + Max Pages + + src/app/data/paperless-config.ts + 242 + + Max Pages + + + Enable Tag Detection + + src/app/data/paperless-config.ts + 249 + + Enable Tag Detection + + + Tag Mapping + + src/app/data/paperless-config.ts + 256 + + Tag Mapping + + + Warning: You have unsaved changes to your document(s). + + src/app/guards/dirty-doc.guard.ts + 16 + + Warning: You have unsaved changes to your document(s). + + + Unsaved Changes + + src/app/guards/dirty-form.guard.ts + 15 + + + src/app/guards/dirty-saved-view.guard.ts + 27 + + + src/app/services/open-documents.service.ts + 122 + + + src/app/services/open-documents.service.ts + 149 + + Unsaved Changes + + + You have unsaved changes. + + src/app/guards/dirty-form.guard.ts + 16 + + + src/app/services/open-documents.service.ts + 150 + + You have unsaved changes. + + + Are you sure you want to leave? + + src/app/guards/dirty-form.guard.ts + 17 + + Are you sure you want to leave? + + + Leave page + + src/app/guards/dirty-form.guard.ts + 19 + + Leave page + + + You have unsaved changes to the saved view + + src/app/guards/dirty-saved-view.guard.ts + 29 + + You have unsaved changes to the saved view + + + Are you sure you want to close this saved view? + + src/app/guards/dirty-saved-view.guard.ts + 33 + + Are you sure you want to close this saved view? + + + Save and close + + src/app/guards/dirty-saved-view.guard.ts + 37 + + Save and close + + + You don't have permissions to do that + + src/app/guards/permissions.guard.ts + 34 + + You don't have permissions to do that + + + Last year + + src/app/pipes/custom-date.pipe.ts + 14 + + Last year + + + %s years ago + + src/app/pipes/custom-date.pipe.ts + 15 + + %s years ago + + + Last month + + src/app/pipes/custom-date.pipe.ts + 19 + + Last month + + + %s months ago + + src/app/pipes/custom-date.pipe.ts + 20 + + %s months ago + + + Last week + + src/app/pipes/custom-date.pipe.ts + 24 + + Last week + + + %s weeks ago + + src/app/pipes/custom-date.pipe.ts + 25 + + %s weeks ago + + + %s days ago + + src/app/pipes/custom-date.pipe.ts + 30 + + %s days ago + + + %s hour ago + + src/app/pipes/custom-date.pipe.ts + 34 + + %s hour ago + + + %s hours ago + + src/app/pipes/custom-date.pipe.ts + 35 + + %s hours ago + + + %s minute ago + + src/app/pipes/custom-date.pipe.ts + 39 + + %s minute ago + + + %s minutes ago + + src/app/pipes/custom-date.pipe.ts + 40 + + %s minutes ago + + + Just now + + src/app/pipes/custom-date.pipe.ts + 73 + + Just now + + + (no title) + + src/app/pipes/document-title.pipe.ts + 11 + + (no title) + + + You have unsaved changes to the document + + src/app/services/open-documents.service.ts + 124 + + You have unsaved changes to the document + + + Are you sure you want to close this document? + + src/app/services/open-documents.service.ts + 128 + + Are you sure you want to close this document? + + + Are you sure you want to close all documents? + + src/app/services/open-documents.service.ts + 151 + + Are you sure you want to close all documents? + + + Close documents + + src/app/services/open-documents.service.ts + 153 + + Close documents + + + English (US) + + src/app/services/settings.service.ts + 51 + + English (US) + + + Afrikaans + + src/app/services/settings.service.ts + 57 + + Afrikaans + + + Arabic + + src/app/services/settings.service.ts + 63 + + Arabic + + + Belarusian + + src/app/services/settings.service.ts + 69 + + Belarusian + + + Bulgarian + + src/app/services/settings.service.ts + 75 + + Bulgarian + + + Catalan + + src/app/services/settings.service.ts + 81 + + Catalan + + + Czech + + src/app/services/settings.service.ts + 87 + + Czech + + + Danish + + src/app/services/settings.service.ts + 93 + + Danish + + + German + + src/app/services/settings.service.ts + 99 + + German + + + Greek + + src/app/services/settings.service.ts + 105 + + Greek + + + English (GB) + + src/app/services/settings.service.ts + 111 + + English (GB) + + + Spanish + + src/app/services/settings.service.ts + 117 + + Spanish + + + Finnish + + src/app/services/settings.service.ts + 123 + + Finnish + + + French + + src/app/services/settings.service.ts + 129 + + French + + + Hungarian + + src/app/services/settings.service.ts + 135 + + Hungarian + + + Italian + + src/app/services/settings.service.ts + 141 + + Italian + + + Japanese + + src/app/services/settings.service.ts + 147 + + Japanese + + + Korean + + src/app/services/settings.service.ts + 153 + + Korean + + + Luxembourgish + + src/app/services/settings.service.ts + 159 + + Luxembourgish + + + Dutch + + src/app/services/settings.service.ts + 165 + + Dutch + + + Norwegian + + src/app/services/settings.service.ts + 171 + + Norwegian + + + Persian + + src/app/services/settings.service.ts + 177 + + Persian + + + Polish + + src/app/services/settings.service.ts + 183 + + Polish + + + Portuguese (Brazil) + + src/app/services/settings.service.ts + 189 + + Portuguese (Brazil) + + + Portuguese + + src/app/services/settings.service.ts + 195 + + Portuguese + + + Romanian + + src/app/services/settings.service.ts + 201 + + Romanian + + + Russian + + src/app/services/settings.service.ts + 207 + + Russian + + + Slovak + + src/app/services/settings.service.ts + 213 + + Slovak + + + Slovenian + + src/app/services/settings.service.ts + 219 + + Slovenian + + + Serbian + + src/app/services/settings.service.ts + 225 + + Serbian + + + Swedish + + src/app/services/settings.service.ts + 231 + + Swedish + + + Turkish + + src/app/services/settings.service.ts + 237 + + Turkish + + + Ukrainian + + src/app/services/settings.service.ts + 243 + + Ukrainian + + + Vietnamese + + src/app/services/settings.service.ts + 249 + + Vietnamese + + + Chinese Simplified + + src/app/services/settings.service.ts + 255 + + Chinese Simplified + + + Chinese Traditional + + src/app/services/settings.service.ts + 261 + + Chinese Traditional + + + ISO 8601 + + src/app/services/settings.service.ts + 269 + + ISO 8601 + + + Successfully completed one-time migratration of settings to the database! + + src/app/services/settings.service.ts + 603 + + Successfully completed one-time migratration of settings to the database! + + + Unable to migrate settings to the database, please try saving manually. + + src/app/services/settings.service.ts + 604 + + Unable to migrate settings to the database, please try saving manually. + + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 677 + + You can restart the tour from the settings page. + + + Connecting... + + src/app/services/upload-documents.service.ts + 25 + + Connecting... + + + Uploading... + + src/app/services/upload-documents.service.ts + 37 + + Uploading... + + + Upload complete, waiting... + + src/app/services/upload-documents.service.ts + 40 + + Upload complete, waiting... + + + HTTP error: + + src/app/services/upload-documents.service.ts + 53 + + HTTP error: + + + Document already exists. + + src/app/services/websocket-status.service.ts + 24 + + Document already exists. + + + Document already exists. Note: existing document is in the trash. + + src/app/services/websocket-status.service.ts + 25 + + Document already exists. Note: existing document is in the trash. + + + Document with ASN already exists. + + src/app/services/websocket-status.service.ts + 26 + + Document with ASN already exists. + + + Document with ASN already exists. Note: existing document is in the trash. + + src/app/services/websocket-status.service.ts + 27 + + Document with ASN already exists. Note: existing document is in the trash. + + + File not found. + + src/app/services/websocket-status.service.ts + 28 + + File not found. + + + Pre-consume script does not exist. + + src/app/services/websocket-status.service.ts + 29 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Pre-consume script does not exist. + + + Error while executing pre-consume script. + + src/app/services/websocket-status.service.ts + 30 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing pre-consume script. + + + Post-consume script does not exist. + + src/app/services/websocket-status.service.ts + 31 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Post-consume script does not exist. + + + Error while executing post-consume script. + + src/app/services/websocket-status.service.ts + 32 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing post-consume script. + + + Received new file. + + src/app/services/websocket-status.service.ts + 33 + + Received new file. + + + File type not supported. + + src/app/services/websocket-status.service.ts + 34 + + File type not supported. + + + Processing document... + + src/app/services/websocket-status.service.ts + 35 + + Processing document... + + + Generating thumbnail... + + src/app/services/websocket-status.service.ts + 36 + + Generating thumbnail... + + + Retrieving date from document... + + src/app/services/websocket-status.service.ts + 37 + + Retrieving date from document... + + + Saving document... + + src/app/services/websocket-status.service.ts + 38 + + Saving document... + + + Finished. + + src/app/services/websocket-status.service.ts + 39 + + Finished. + + + + diff --git a/src-ui/src/locale/messages.hr_HR.xlf b/src-ui/src/locale/messages.hr_HR.xlf index 093b08bee2..e6dad3509e 100644 --- a/src-ui/src/locale/messages.hr_HR.xlf +++ b/src-ui/src/locale/messages.hr_HR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zatvori @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Prethodno @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Sljedeće @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Prethodni mjesec @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Sljedeći mjesec @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zatvori @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Odaberi mjesec @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sati @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Odaberi godinu @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minute @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prvi @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povećanje sati @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prethodni @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanjenje sati @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sljedeći @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povečanje minuta @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zadnji @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanjenje minuta @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunde @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povečanje sekundi @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanjenje sekundi @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenti @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Učitavanje... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Advanced search @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirm delete @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potvrda @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - sada - From @@ -3882,11 +3878,19 @@ Added + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + sada + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Putanja @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Boja @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nije dodijeljen @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Without any tag @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 putanja pohrane @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 putanje pohrane @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 oznaka @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 oznake @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.hu_HU.xlf b/src-ui/src/locale/messages.hu_HU.xlf index c08a74e957..0d33486348 100644 --- a/src-ui/src/locale/messages.hu_HU.xlf +++ b/src-ui/src/locale/messages.hu_HU.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Bezár @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Előző @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Következő @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Előző hónap @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 A következő hónapban @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Bezár @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Válassza ki a hónapot @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 "" @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Órák @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 " @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 " @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Év kiválasztása @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Percek @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 "" @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Első @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Növekvő órák @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Előző @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Órák csökkentése @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Következő @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Növekvő percek @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Last @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Percek csökkentése @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Másodpercek @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Növekvő másodpercek @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Másodpercek csökkentése @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumentumok @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Engedélyezés @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Betöltés... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Ugrás az oldal aljára + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Speciális keresés @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Törlés megerősítése @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 A jelszó megváltozott, Önt kiléptetjük a rendszerből. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Megerősítés @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relatív dátumok - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - most - From @@ -3882,11 +3878,19 @@ Hozzáadva + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + most + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Egy héten belül @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Egy hónapon belül @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Három hónapon belül @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Egy éven belül @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Idén @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Ebben a hónapban @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Tegnap + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Előző hét + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Előző hónap + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Előző negyedév + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Előző év + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Útvonal @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Színes @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Kétlépcsős hitelesítés @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Kétlépcsős hitelesítés letiltása @@ -5194,13 +5230,13 @@ Szűrési útvonal - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Alkalmazza az erre az elérési útvonalra vonatkozó dokumentumokra. A *-gal megadott helyettesítő karakterek engedélyezettek. Nagy- és kisbetűkre nem érzékeny.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5240,7 +5276,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Advanced Filters + Haladó szűrők Add filter @@ -5248,7 +5284,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Add filter + Szűrő hozzáadása No advanced workflow filters defined. @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nincs hozzárendelve @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 filter megnyitása @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Olvasd be a QR kódot a hitelesítő alkalmazással, és add meg a kapott kódot alább @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Hitelesítő titkos kód @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Elmentheted ezt a titkos kódot, hogy fel tudd használni, amennyiben újra kell telepítened a hitelesítő alkalmazásodat. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kód @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 A helyreállítási kódot nem lehet később megjeleníteni, mindenképpen mentsd el. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kód másolása @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Az emaileknek egyezniük kell @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 A jelszavaknak egyezniük kell @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil frissítése sikeresen megtörtént @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Hiba a profil mentésekor @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Hiba az auth token létrehozásakor @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Hiba a közösségi fiók szétkapcsolásakor @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Hiba a TOTP beállítások lekérésekor @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP aktiválása sikeres @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Sikertelen TOTP aktiválás @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deaktiválása sikeres @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Sikertelen TOTP deaktiválás @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Egyéni mezők @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Cím & tartalom @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Fájltípus @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Bővebben @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 egyenlő @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 üres @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 nem üres @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 nagyobb, mint @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 kevesebb, mint @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Levelezőpartner: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Kapcsolattartó nélkül @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Dokumentumtípus: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Dokumentumtípus nélkül @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Tárolási útvonal: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Tárolási útvonal nélkül @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Címke: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Címke nélkül @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Egyéni mező lekérdezés @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Cím: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Tulajdonos: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 A tulajdonos nincs: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Tulajdonos nélkül @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Dokumentumok szűrése () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Hiba az engedélyek frissítésében @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Sikeresen létrehozta a . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Hiba történt a létrehozásakor. @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 "" sikeresen frissítve. @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Hiba történt a mentése közben. @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 A kapcsolódó dokumentumok nem kerülnek törlésre. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Hiba elem törlése közben @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Az engedélyek sikeresen frissültek @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Ez a művelet véglegesen törli az összes objektumot. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objektumok sikeresen törölve @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Hiba az objektumok törlésekor @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 tárolási útvonal @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 tárolási útvonalak @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Tényleg törölni szeretné a "" tárolási útvonalat? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 címke @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 címkék @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Tényleg törölni szeretné a "" címkét? diff --git a/src-ui/src/locale/messages.id_ID.xlf b/src-ui/src/locale/messages.id_ID.xlf index cf6db149eb..268c253d0f 100644 --- a/src-ui/src/locale/messages.id_ID.xlf +++ b/src-ui/src/locale/messages.id_ID.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Tutup @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Sebelumnya @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Selanjutnya @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Bulan sebelumnya @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Bulan depan @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Tutup @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pilih bulan @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Jam @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pilih tahun @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Menit @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pertama @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Penambahan jam @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sebelumnya @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pengurangan jam @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selanjutnya @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Penambahan menit @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Terahkir @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pengurangan menit @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Detik @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Penambahan detik @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pengurangan detik @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumen @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Aktifkan @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Memuat... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Pencarian lanjutan @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Konfirmasi hapus @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Kata sandi telah diubah, anda akan dikeluarkan sesaat lagi. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Konfirmasi @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Tanggal relatif - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - sekarang - From @@ -3882,11 +3878,19 @@ Ditambahkan + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + sekarang + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Dalam 1 minggu @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Dalam 1 bulan @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Dalam 3 bulan @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Dalam 1 tahun @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Tahun ini @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Bulan ini @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Kemarin + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Lokasi folder/file @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Warna @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autentikasi dua faktor @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Nonaktifkan autentikasi dua faktor @@ -5194,13 +5230,13 @@ Filter lokasi - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Terapkan pada dokumen yang sepenuhnya cocok dengan lokasi ini. Karakter pengganti seperti * diperbolehkan. Huruf dinormalisasi.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Tidak ditugaskan @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Buka saring @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Pindai kode QR dengan aplikasi autentikator lalu masukkan kodenya di bawah ini @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Kode rahasia autentikator @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Kamu bisa simpan kode rahasia ini untuk menginstal ulang aplikasi autentikator nanti. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kode @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Kode pemulihan tidak akan ditampilkan lagi, pastikan untuk menyimpannya. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Salin kode @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Surel harus cocok @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Kata sandi harus cocok @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil berhasil diperbarui @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Kesalahan saat menyimpan profil @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Kesalahan saat membuat token autentikasi @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Kesalahan saat melepaskan akun sosial @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Gagal mengambil pengaturan TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP berhasil diaktifkan @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Gagal mengaktifkan TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP berhasil dinonaktifkan @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Gagal menonaktifkan TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Bidang khusus @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 kosong @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 tidak kosong @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 lebih besar dari @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 kurang dari @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Tanpa koresponden @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Tanpa tipe dokumen @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Tanpa lokasi penyimpanan @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Tanpa label apapun @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Tanpa pemilik @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 lokasi penyimpanan @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 lokasi penyimpanan @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tandai @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.it_IT.xlf b/src-ui/src/locale/messages.it_IT.xlf index ac8918219b..6ed3975264 100644 --- a/src-ui/src/locale/messages.it_IT.xlf +++ b/src-ui/src/locale/messages.it_IT.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Chiudi @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Precedente @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Successivo @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mese precedente @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Il prossimo mese @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Chiudi @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleziona il mese @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ore @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seleziona anno @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuti @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primo @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementa ore @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Precedente @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrementa ore @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Successivo @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementa minuti @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ultimo @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrementa minuti @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Secondi @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incremento in secondi @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decremento in secondi @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documenti @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Abilita @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + righe Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Caricamento in corso... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Ricerca avanzata @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2148,7 +2156,7 @@ src/app/components/admin/tasks/tasks.component.ts 161 - Error dismissing tasks + Errore nel rimuovere l'attività Error dismissing task @@ -2156,7 +2164,7 @@ src/app/components/admin/tasks/tasks.component.ts 170 - Error dismissing task + Errore nel rimuovere le attività queued @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Conferma eliminazione @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 La password è stata cambiata, sarai disconnesso momentaneamente. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Conferma @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Date relative - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - adesso - From @@ -3882,11 +3878,19 @@ Aggiunto + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + adesso + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Entro una settimana @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Entro 1 mese @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Entro 3 mesi @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Entro 1 anno @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Quest'anno @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Questo mese @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Ieri + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Percorso @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Colore @@ -4816,7 +4852,7 @@ src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html 15 - Parent + Parent Inbox tag @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autenticazione a due fattori @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disabilita autenticazione a due fattori @@ -5194,13 +5230,13 @@ Filtro percorso - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Applica ai documenti che corrispondono a questo percorso. I caratteri jolly specificati come * sono consentiti. Case-normalizzato.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5240,7 +5276,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Advanced Filters + Filtri Avanzati Add filter @@ -5248,7 +5284,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Add filter + Aggiungi filtro No advanced workflow filters defined. @@ -5256,7 +5292,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 195 - No advanced workflow filters defined. + Nessun filtro avanzato del workflow definito. Complete the custom field query configuration. @@ -5264,7 +5300,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 224,226 - Complete the custom field query configuration. + Completa la configurazione della query di campo personalizzato. Action type @@ -5644,7 +5680,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 203 - Has any of these tags + Ha qualcuna di queste etichette Has all of these tags @@ -5652,7 +5688,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - Has all of these tags + Ha tutte queste etichette Does not have these tags @@ -5660,7 +5696,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 217 - Does not have these tags + Non ha queste etichette Has correspondent @@ -5676,7 +5712,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 232 - Does not have correspondents + Non ha corrispondenti Has document type @@ -5692,7 +5728,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 248 - Does not have document types + Non ha questi tipi di documento Has storage path @@ -5700,7 +5736,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 256 - Has storage path + Ha percorso di archiviazione Does not have storage paths @@ -5708,7 +5744,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 264 - Does not have storage paths + Non ha percorso di archiviazione Matches custom field query @@ -5716,7 +5752,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 272 - Matches custom field query + Corrisponde a campo personalizzato Create new workflow @@ -5792,7 +5828,7 @@ src/app/components/common/email-document-dialog/email-document-dialog.component.html 37 - Some email servers may reject messages with large attachments. + Alcuni server di posta elettronica possono rifiutare messaggi con allegati di grandi dimensioni. Email sent @@ -5808,7 +5844,7 @@ src/app/components/common/email-document-dialog/email-document-dialog.component.ts 69 - Error emailing documents + Errore durante l'invio dei documenti Error emailing document @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Non assegnato @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Apri filtro @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scansiona il codice QR con la tua app di autenticazione e poi inserisci il codice qui sotto @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Secret di autenticazione @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Puoi memorizzare questo secret e usarlo per reinstallare la tua app di autenticazione in un secondo momento. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Codice @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 I codici di recupero non verranno mostrati di nuovo, assicurati di salvarli. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copia codici @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Le email devono corrispondere @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Le password devono corrispondere @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profilo aggiornato con successo @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Errore durante il salvataggio del profilo @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Errore nella generazione del token di autenticazione @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Errore disconnessione account social @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Errore nel recupero delle impostazioni TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP attivato con successo @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Errore nell'attivazione del TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP disattivato con successo @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Errore nella disattivazione del TOTP @@ -7062,7 +7098,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 261 - OK + Ok Copy Raw Error @@ -7444,7 +7480,7 @@ src/app/components/document-detail/document-detail.component.html 58 - Print + Stampa More like this @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8032,7 +8068,7 @@ src/app/components/document-detail/document-detail.component.ts 1460 - Print failed. + Stampa non riuscita. Error loading document for printing. @@ -8040,7 +8076,7 @@ src/app/components/document-detail/document-detail.component.ts 1472 - Error loading document for printing. + Errore nel caricamento del documento per la stampa. An error occurred loading tiff: @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Campi personalizzati @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Seleziona: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titolo & contenuto @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Tipo di file @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Più come @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 uguale a @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 è vuoto @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 non è vuoto @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 maggiore di @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 minore di @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Corrispondente: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Senza corrispondente @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Tipo di documento: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Senza tipo di documento @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Percorso di archiviazione: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Senza percorso di archiviazione @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Etichetta: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Senza alcun tag @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Query campi personalizzati @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titolo: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Proprietario: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Proprietario non in: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Senza proprietario @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtra Documenti () @@ -9591,7 +9627,7 @@ src/app/components/manage/mail/mail.component.html 143 - View Processed Mail + Visualizza Email Elaborata No mail rules defined. @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Errore durante l'aggiornamento dei permnessi @@ -9795,7 +9831,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 2 - Processed Mail for + Posta processata per No processed email messages found. @@ -9803,7 +9839,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 20 - No processed email messages found. + Nessun messaggio email elaborato trovato. Received @@ -9811,7 +9847,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 33 - Received + Ricevuto Processed @@ -9819,7 +9855,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 34 - Processed + Elaborato Processed mail(s) deleted @@ -9827,7 +9863,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.ts 72 - Processed mail(s) deleted + Email processate cancellate Filter by: @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 è stato creato con successo. @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Errore durante la creazione di . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 "" aggiornato con successo. @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Errore durante e il salvataggio di . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 I documenti associati non verranno eliminati. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Errore durante l'eliminazione dell'elemento @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permessi aggiornati @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Questa operazione eliminerà permanentemente tutti gli oggetti. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Oggetti eliminati con successo @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Errore nell'eliminazione degli oggetti @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 percorso di archiviazione @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 percorsi di archiviazione @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Vuoi eliminare il percorso di archiviazione ""? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tag @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Vuoi eliminare il tag ""? @@ -10399,7 +10435,7 @@ src/app/data/custom-field.ts 55 - Long Text + Testo Lungo Search score diff --git a/src-ui/src/locale/messages.ja_JP.xlf b/src-ui/src/locale/messages.ja_JP.xlf index 3edc2a4a94..04f3efa604 100644 --- a/src-ui/src/locale/messages.ja_JP.xlf +++ b/src-ui/src/locale/messages.ja_JP.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 閉じる @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 前へ @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 次へ @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 前月 @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 翌月 @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 閉じる @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 月を選択 @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 西暦を選択 @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 先頭ページ @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 時の増加 @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 前へ @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 時の減少 @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 次へ @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 分の増加 @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 最終ページ @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 分の減少 @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 秒の増加 @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 秒の減少 @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 ドキュメント @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 有効にする @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ 読み込み中... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 高度な検索 @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 本当に削除しますか? @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 パスワードが変更されました。一時的にログアウトされます。 @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 確認 @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ 相対的な日付 - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - 現在 - From @@ -3882,11 +3878,19 @@ 追加日 + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + 現在 + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 1週間以内 @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 1か月間以内 @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 3か月間以内 @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 1年以内 @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 今年 @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 今月 @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ 昨日 + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 フォルダーのパス @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 2要素認証 @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 2要素認証を無効にする @@ -5194,13 +5230,13 @@ パスのフィルター - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - このパスにマッチするドキュメントに適用されます。 * で指定されたワイルドカードが使用できます。大文字・小文字を区別しません。 + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned 未割り当て @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 フィルタを開く @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 認証アプリでQRコードをスキャンし、以下のコードを入力してください @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 認証シークレット @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 このシークレットを保存して後で認証アプリを再インストールすることができます。 @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 コード @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 リカバリコードは再度表示されないので、必ず保存してください。 @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 コードをコピー @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 メールアドレスが一致しません @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 パスワードが一致しません @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 プロフィールは正常に更新されました @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 プロフィールの保存に失敗しました @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 認証トークンの生成に失敗しました @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 ソーシャルアカウントの接続解除に失敗しました @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 TOTP設定の取得中にエラーが発生しました @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTPが正常に有効になりました @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 TOTPの有効化に失敗しました @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTPを無効にしました @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 TOTPの無効化に失敗しました @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 カスタム項目 @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 タイトルと内容 @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 ファイル形式 @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 類似 @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 が次の値と等しい @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 が空である @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 が空でない @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 が次の値より大きい @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 が次の値より小さい @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 発信元: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 発信元なし @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 ドキュメントタイプ: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 ドキュメントタイプなし @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 ストレージパス: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 フォルダーなし @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 タグ: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 タグなし @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 カスタムフィールドのクエリ @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 タイトル: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 所有者: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 所有者がいない: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 所有者なし @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 ドキュメントのフィルター () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 権限の更新に失敗しました @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 は正常に作成されました @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 の作成中にエラーが発生しました @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 "" を正常に更新しました。 @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 の保存中にエラーが発生しました @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 割り当てられたドキュメントは削除されません @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 要素の削除中にエラーが発生しました @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 権限は正常に更新されました @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 この操作により、すべてのオブジェクトは完全に削除されます。 @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 オブジェクトは正常に削除されました @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 オブジェクトの削除に失敗しました @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 フォルダー @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 フォルダー @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 フォルダー "" を削除してもよろしいですか? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 タグ @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 タグ @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 タグ "" を削除してもよろしいですか? diff --git a/src-ui/src/locale/messages.ko_KR.xlf b/src-ui/src/locale/messages.ko_KR.xlf index cdf1d86962..17013b8f1e 100644 --- a/src-ui/src/locale/messages.ko_KR.xlf +++ b/src-ui/src/locale/messages.ko_KR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 닫기 @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 이전 @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 다음 @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 지난달 @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 다음 달 @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 닫기 @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 월 선택 @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 시간 @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 연도 선택 @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 처음 @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 시간 증가 @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 이전 @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 감소 시간 @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 다음 @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 분 단위 증가 @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 마지막 @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 분 감소 @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 초 단위 증가 @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 초 단위로 감소 @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 문서 @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 사용 @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ 로딩 중... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 고급 검색 @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 삭제 검토 @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 비밀번호가 변경되었습니다. 곧 로그아웃됩니다. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 최종확인 @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ 상대적 날짜 - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - 지금 - From @@ -3882,11 +3878,19 @@ 추가됨 + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + 지금 + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 1주일 이내 @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 1개월 이내 @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 3개월 이내 @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 1년 이내 @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 올해 @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 이번 달 @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ 어제 + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 경로 @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 색상 @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 2단계 인증 @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 2단계 인증 비활성화 @@ -5194,13 +5230,13 @@ 필터 경로 - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - 이 경로와 일치하는 문서에 적용합니다. 와일드카드는 *로 지정할 수 있습니다. 대/소문자 정규화.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned 할당되지 않음 @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 "" 필터 열기 @@ -6186,7 +6222,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 9 - Select all pages + 모든 페이지 선택 Deselect all pages @@ -6194,7 +6230,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 12 - Deselect all pages + 모든 페이지 선택 해제 Rotate selected pages counter-clockwise @@ -6202,7 +6238,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 17 - Rotate selected pages counter-clockwise + 선택한 페이지 반시계방향으로 회전 Rotate selected pages clockwise @@ -6210,7 +6246,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 20 - Rotate selected pages clockwise + 선택한 페이지 시계방향으로 회전 Delete selected pages @@ -6218,7 +6254,7 @@ src/app/components/common/pdf-editor/pdf-editor.component.html 23 - Delete selected pages + 선택한 페이지 삭제 Rotate page counter-clockwise @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 인증 앱으로 QR 코드를 스캔한 다음 아래 코드를 입력합니다. @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 인증(Authenticator) 비밀키 @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 이 비밀 번호를 저장하여 나중에 인증 앱을 다시 설치할 때 사용할 수 있습니다. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 코드 @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 복구 코드는 다시 표시되지 않으므로 반드시 저장하세요. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 코드 복사 @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 이메일이 일치해야 합니다 @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 비밀번호가 일치해야 합니다 @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 프로필 업데이트 성공 @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 프로필을 저장하는 중 오류가 발생하였습니다 @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 인증 토큰을 생성하는 중 오류가 발생하였습니다 @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 소셜 계정 연결 해제 @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 TOTP 설정 가져오기 오류 @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP가 성공적으로 활성화되었습니다. @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 TOTP 활성화 오류 @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP가 성공적으로 비활성화되었습니다. @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 TOTP 비활성화 오류 @@ -6958,7 +6994,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 105 - Tasks Queue + 작업 대기열 Redis Status @@ -7006,7 +7042,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 245 - Run Task + 작업 실행 Last Updated @@ -7054,7 +7090,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 257 - WebSocket Connection + WebSocket 연결 OK @@ -7444,7 +7480,7 @@ src/app/components/document-detail/document-detail.component.html 58 - Print + 인쇄 More like this @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8000,7 +8036,7 @@ src/app/components/document-detail/document-detail.component.ts 1096 - Error downloading document + 문서 다운로드 중 오류 발생 Page Fit @@ -8032,7 +8068,7 @@ src/app/components/document-detail/document-detail.component.ts 1460 - Print failed. + 인쇄 실패. Error loading document for printing. @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 사용자 정의 필드 @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 제목 & 자료 @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 파일 종류 @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 더 비슷한 @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 일치 @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 는(은) 비어 있습니다. @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 가 비어 있지 않습니다. @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 보다 큰 @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 미만 @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 담당자 없음 @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 문서 유형: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 문서 유형 없음 @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 저장 경로 없음 @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 어떤 태그도 없이 @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 사용자 정의 필드 쿼리 @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 제목: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 소유자: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 소유자가 다음에 없습니다: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 소유자 없음 @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 문서 필터링 () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 권한 업데이트 중 오류 발생 @@ -9812,7 +9848,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 33 - Received + 받음 Processed @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 이(가) 성공적으로 생성되었습니다. @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 을(를) 생성하는 동안 오류가 발생했습니다. @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 을(를) 저장하는 동안 오류가 발생했습니다. @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 연결된 문서는 삭제되지 않습니다. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 요소 삭제 중 오류 발생 @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 권한을 성공적으로 업데이트하였습니다 @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 이 작업은 모든 개체를 영구적으로 삭제합니다. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 개체가 성공적으로 삭제됨 @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 개체 삭제 중 오류 발생 @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 저장소 경로 @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 저장소 경로 @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 정말로 저장 경로 를 삭제하시겠습니까? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 태그 @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 태그 @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 정말로 태그 를 삭제하시겠습니까? diff --git a/src-ui/src/locale/messages.lb_LU.xlf b/src-ui/src/locale/messages.lb_LU.xlf index 0a7d1db8a9..5de4007f70 100644 --- a/src-ui/src/locale/messages.lb_LU.xlf +++ b/src-ui/src/locale/messages.lb_LU.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zoumaachen @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Zréck @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Weider @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mount virdrun @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Nächste Mount @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zoumaachen @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Mount auswielen @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stonnen @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Joer auswielen @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutten @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ufank @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stonnen eropsetzen @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zréck @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stonnen erofsetzen @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Weider @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutten erhéijen @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Schluss @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutten erofsetzen @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekonnen @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekonnen eropsetzen @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekonnen erofsetzen @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenter @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Lueden... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Erweidert Sich @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Läsche bestätegen @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 D’Passwuert gouf geännert, Dir gitt elo ofgemellt. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bestätegung @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - elo - From @@ -3882,11 +3878,19 @@ Dobäigesat + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + elo + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Bannent 1 Woch @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Bannent 1 Mount @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Bannent 3 Méint @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Bannent 1 Joer @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Dëst Joer @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Dëse Mount @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Gëschter + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Pfad @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Faarf @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Net zougewisen @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel an Inhalt @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Méi ähnleches @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 ass gläich @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 ass eidel @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 ass net eidel @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 ass méi grouss ewéi @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 ass méi kleng ewéi @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Ouni Korrespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Ouni Dokumententyp @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Ouni Etikett @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 Späicherpfad @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 Späicherpfaden @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 Etikett @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 Etiketten @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Soll d'Etikett "" wierklech geläscht ginn? diff --git a/src-ui/src/locale/messages.lt_LT.xlf b/src-ui/src/locale/messages.lt_LT.xlf index 709f826ab8..804effc96d 100644 --- a/src-ui/src/locale/messages.lt_LT.xlf +++ b/src-ui/src/locale/messages.lt_LT.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Uždaryti @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Ankstesnis @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Kitas @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Ankstesnis mėnuo @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Kitas mėnuo @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Uždaryti @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pasirinktas mėnuo @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Valandos @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pasirinkti metus @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutės @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pirmas @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Padidinti valandas @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ankstesnis @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sumažinti valandas @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Kitas @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Padidinti minutes @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Paskutinis @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sumažinti minutes @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundės @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Padidinti sekundes @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sumažinti sekundes @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumentai @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Įjungti @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Įkeliama... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Advanced search @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirm delete @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmation @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Added + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Path @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Color @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Not assigned @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Without any tag @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tags @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.lv_LV.xlf b/src-ui/src/locale/messages.lv_LV.xlf index 993cf0b429..b5733aa1fd 100644 --- a/src-ui/src/locale/messages.lv_LV.xlf +++ b/src-ui/src/locale/messages.lv_LV.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Aizvērt @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Iepriekšējais @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Nākamais @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Iepriekšējais mēnesis @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Nākamais mēnesis @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Aizvērt @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Izvēlieties mēnesi @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stundas @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Izvēlieties gadu @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minūtes @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pirmā @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Palielināt stundas @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Iepriekšējā @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Samazināt stundas @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Nākamā @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Palielināt minūtes @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pēdējā @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Samazināt minūtes @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundes @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Palielināt sekundes @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Samazināt sekundes @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokuments @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Iespējot @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Ielāde... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Paplašinātā meklēšana @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirm delete @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Apstiprinājums @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Pievienots + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Path @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Krāsa @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nav piešķirts @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Parolēm jāsakrīt @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profils tika sekmīgi atjaunināts @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Pielāgojami lauki @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 ir tukšs @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 lielāks par @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 mazāk kā @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Bez birkas @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tags @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.mk_MK.xlf b/src-ui/src/locale/messages.mk_MK.xlf new file mode 100644 index 0000000000..ab25c7e3fe --- /dev/null +++ b/src-ui/src/locale/messages.mk_MK.xlf @@ -0,0 +1,11480 @@ + + + + + + Close + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts + 50 + + Close + + + Slide of + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 131,135 + + Currently selected slide number read by screen reader + Slide of + + + Previous + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 157,159 + + Previous + + + Next + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts + 198 + + Next + + + Previous month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 83,85 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + Previous month + + + Next month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts + 112 + + Next month + + + HH + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + HH + + + Close + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Close + + + Select month + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Select month + + + «« + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + «« + + + Hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Hours + + + « + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + « + + + MM + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + MM + + + » + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + » + + + Select year + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Select year + + + Minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Minutes + + + »» + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + »» + + + First + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + First + + + Increment hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment hours + + + Previous + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Previous + + + Decrement hours + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement hours + + + Next + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Next + + + Increment minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment minutes + + + Last + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Last + + + Decrement minutes + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement minutes + + + SS + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + SS + + + Seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Seconds + + + Increment seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Increment seconds + + + Decrement seconds + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + Decrement seconds + + + + + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts + 13 + + + + + + + + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts + 41,42 + + + + + Document was added to Paperless-ngx. + + src/app/app.component.ts + 95 + + + src/app/app.component.ts + 104 + + Document was added to Paperless-ngx. + + + Open document + + src/app/app.component.ts + 97 + + + src/app/components/admin/trash/trash.component.ts + 146 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 44 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 47 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 50 + + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 58 + + Open document + + + Could not add : + + src/app/app.component.ts + 119 + + Could not add : + + + Document is being processed by Paperless-ngx. + + src/app/app.component.ts + 134 + + Document is being processed by Paperless-ngx. + + + Dashboard + + src/app/app.component.ts + 141 + + + src/app/components/app-frame/app-frame.component.html + 84 + + + src/app/components/app-frame/app-frame.component.html + 86 + + + src/app/components/dashboard/dashboard.component.html + 1 + + Dashboard + + + Documents + + src/app/app.component.ts + 152 + + + src/app/components/app-frame/app-frame.component.html + 91 + + + src/app/components/app-frame/app-frame.component.html + 93 + + + src/app/components/document-list/document-list.component.ts + 192 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 61 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + + src/app/components/manage/management-list/management-list.component.html + 139 + + Documents + + + Settings + + src/app/app.component.ts + 164 + + + src/app/components/admin/settings/settings.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 51 + + + src/app/components/app-frame/app-frame.component.html + 255 + + + src/app/components/app-frame/app-frame.component.html + 257 + + Settings + + + Prev + + src/app/app.component.ts + 170 + + Prev + + + Next + + src/app/app.component.ts + 171 + + + src/app/components/document-detail/document-detail.component.html + 113 + + Next + + + End + + src/app/app.component.ts + 172 + + End + + + The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. + + src/app/app.component.ts + 178 + + The dashboard can be used to show saved views, such as an 'Inbox'. Views are found under Manage > Saved Views once you have created some. + + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + src/app/app.component.ts + 185 + + Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. + + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + src/app/app.component.ts + 190 + + The documents list shows all of your documents and allows for filtering as well as bulk-editing. There are three different view styles: list, small cards and large cards. A list of documents currently opened for editing is shown in the sidebar. + + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + src/app/app.component.ts + 197 + + The filtering tools allow you to quickly find documents using various searches, dates, tags, etc. + + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + src/app/app.component.ts + 203 + + Any combination of filters can be saved as a 'view' which can then be displayed on the dashboard and / or sidebar. + + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + src/app/app.component.ts + 208 + + Tags, correspondents, document types and storage paths can all be managed using these pages. They can also be created from the document edit view. + + + Manage e-mail accounts and rules for automatically importing documents. + + src/app/app.component.ts + 216 + + + src/app/components/manage/mail/mail.component.html + 4 + + Manage e-mail accounts and rules for automatically importing documents. + + + Workflows give you more control over the document pipeline. + + src/app/app.component.ts + 224 + + Workflows give you more control over the document pipeline. + + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + src/app/app.component.ts + 232 + + + src/app/components/admin/tasks/tasks.component.html + 4 + + File Tasks shows you documents that have been consumed, are waiting to be, or may have failed during the process. + + + Check out the settings for various tweaks to the web app. + + src/app/app.component.ts + 240 + + Check out the settings for various tweaks to the web app. + + + Thank you! 🙏 + + src/app/app.component.ts + 248 + + Thank you! 🙏 + + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + src/app/app.component.ts + 250 + + There are <em>tons</em> more features and info we didn't cover here, but this should get you started. Check out the documentation or visit the project on GitHub to learn more or to report issues. + + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + src/app/app.component.ts + 252 + + Lastly, on behalf of every contributor to this community-supported project, thank you for using Paperless-ngx! + + + Application Configuration + + src/app/components/admin/config/config.component.html + 2 + + Application Configuration + + + Global app configuration options which apply to <strong>every</strong> user of this install of Paperless-ngx. Options can also be set using environment variables or the configuration file but the value here will always take precedence. + + src/app/components/admin/config/config.component.html + 4 + + Global app configuration options which apply to <strong>every</strong> user of this install of Paperless-ngx. Options can also be set using environment variables or the configuration file but the value here will always take precedence. + + + Read the documentation about this setting + + src/app/components/admin/config/config.component.html + 25 + + Read the documentation about this setting + + + Enable + + src/app/components/admin/config/config.component.html + 34 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 125 + + Enable + + + Discard + + src/app/components/admin/config/config.component.html + 53 + + + src/app/components/document-detail/document-detail.component.html + 374 + + Discard + + + Save + + src/app/components/admin/config/config.component.html + 56 + + + src/app/components/admin/settings/settings.component.html + 362 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 26 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 52 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 28 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 20 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 40 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 77 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 31 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 57 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 116 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 185 + + + src/app/components/document-detail/document-detail.component.html + 367 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 83 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 21 + + + src/app/components/manage/saved-views/saved-views.component.html + 74 + + Save + + + Error retrieving config + + src/app/components/admin/config/config.component.ts + 103 + + Error retrieving config + + + Invalid JSON + + src/app/components/admin/config/config.component.ts + 129 + + Invalid JSON + + + Configuration updated + + src/app/components/admin/config/config.component.ts + 173 + + Configuration updated + + + An error occurred updating configuration + + src/app/components/admin/config/config.component.ts + 178 + + An error occurred updating configuration + + + File successfully updated + + src/app/components/admin/config/config.component.ts + 200 + + File successfully updated + + + An error occurred uploading file + + src/app/components/admin/config/config.component.ts + 205 + + An error occurred uploading file + + + Logs + + src/app/components/admin/logs/logs.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 290 + + + src/app/components/app-frame/app-frame.component.html + 293 + + Logs + + + Review the log files for the application and for email checking. + + src/app/components/admin/logs/logs.component.html + 4 + + Review the log files for the application and for email checking. + + + Show + + src/app/components/admin/logs/logs.component.html + 8 + + + src/app/components/document-list/document-list.component.html + 37 + + + src/app/components/manage/saved-views/saved-views.component.html + 52 + + Show + + + lines + + src/app/components/admin/logs/logs.component.html + 17 + + lines + + + Auto refresh + + src/app/components/admin/logs/logs.component.html + 21 + + + src/app/components/admin/tasks/tasks.component.html + 41 + + Auto refresh + + + Loading... + + src/app/components/admin/logs/logs.component.html + 38 + + + src/app/components/admin/logs/logs.component.html + 48 + + + src/app/components/admin/tasks/tasks.component.html + 48 + + + src/app/components/admin/trash/trash.component.html + 45 + + + src/app/components/admin/users-groups/users-groups.component.html + 92 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 35 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 50 + + + src/app/components/common/input/document-link/document-link.component.html + 58 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 23 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 110 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 128 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 10 + + + src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html + 18 + + + src/app/components/document-detail/document-detail.component.html + 387 + + + src/app/components/document-list/document-list.component.html + 134 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 26 + + + src/app/components/manage/mail/mail.component.html + 40 + + + src/app/components/manage/mail/mail.component.html + 123 + + + src/app/components/manage/mail/mail.component.html + 192 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 16 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/management-list/management-list.component.html + 52 + + + src/app/components/manage/saved-views/saved-views.component.html + 68 + + + src/app/components/manage/workflows/workflows.component.html + 28 + + Loading... + + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + + + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. + + src/app/components/admin/settings/settings.component.html + 4 + + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. + + + Start tour + + src/app/components/admin/settings/settings.component.html + 8 + + Start tour + + + System Status + + src/app/components/admin/settings/settings.component.html + 27 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 2 + + System Status + + + Open Django Admin + + src/app/components/admin/settings/settings.component.html + 30 + + Open Django Admin + + + General + + src/app/components/admin/settings/settings.component.html + 40 + + General + + + Appearance + + src/app/components/admin/settings/settings.component.html + 44 + + Appearance + + + Display language + + src/app/components/admin/settings/settings.component.html + 47 + + Display language + + + You need to reload the page after applying a new language. + + src/app/components/admin/settings/settings.component.html + 60 + + You need to reload the page after applying a new language. + + + Date display + + src/app/components/admin/settings/settings.component.html + 68 + + Date display + + + Date format + + src/app/components/admin/settings/settings.component.html + 85 + + Date format + + + Short: + + src/app/components/admin/settings/settings.component.html + 91,92 + + Short: + + + Medium: + + src/app/components/admin/settings/settings.component.html + 95,96 + + Medium: + + + Long: + + src/app/components/admin/settings/settings.component.html + 99,100 + + Long: + + + Items per page + + src/app/components/admin/settings/settings.component.html + 107 + + Items per page + + + Sidebar + + src/app/components/admin/settings/settings.component.html + 123 + + Sidebar + + + Use 'slim' sidebar (icons only) + + src/app/components/admin/settings/settings.component.html + 127 + + Use 'slim' sidebar (icons only) + + + Dark mode + + src/app/components/admin/settings/settings.component.html + 134 + + Dark mode + + + Use system settings + + src/app/components/admin/settings/settings.component.html + 137 + + Use system settings + + + Enable dark mode + + src/app/components/admin/settings/settings.component.html + 138 + + Enable dark mode + + + Invert thumbnails in dark mode + + src/app/components/admin/settings/settings.component.html + 139 + + Invert thumbnails in dark mode + + + Theme Color + + src/app/components/admin/settings/settings.component.html + 145 + + Theme Color + + + Reset + + src/app/components/admin/settings/settings.component.html + 152 + + Reset + + + Update checking + + src/app/components/admin/settings/settings.component.html + 157 + + Update checking + + + Enable update checking + + src/app/components/admin/settings/settings.component.html + 160 + + Enable update checking + + + What's this? + + src/app/components/admin/settings/settings.component.html + 161 + + + src/app/components/common/page-header/page-header.component.html + 9 + + + src/app/components/common/permissions-select/permissions-select.component.html + 4 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 3 + + What's this? + + + Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + src/app/components/admin/settings/settings.component.html + 165,167 + + Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + + + No tracking data is collected by the app in any way. + + src/app/components/admin/settings/settings.component.html + 169 + + No tracking data is collected by the app in any way. + + + Saved Views + + src/app/components/admin/settings/settings.component.html + 175 + + + src/app/components/app-frame/app-frame.component.html + 215 + + + src/app/components/app-frame/app-frame.component.html + 217 + + + src/app/components/manage/saved-views/saved-views.component.html + 2 + + Saved Views + + + Show warning when closing saved views with unsaved changes + + src/app/components/admin/settings/settings.component.html + 178 + + Show warning when closing saved views with unsaved changes + + + Show document counts in sidebar saved views + + src/app/components/admin/settings/settings.component.html + 179 + + Show document counts in sidebar saved views + + + Document editing + + src/app/components/admin/settings/settings.component.html + 185 + + Document editing + + + Use PDF viewer provided by the browser + + src/app/components/admin/settings/settings.component.html + 189 + + Use PDF viewer provided by the browser + + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + src/app/components/admin/settings/settings.component.html + 189 + + This is usually faster for displaying large PDF documents, but it might not work on some browsers. + + + Default zoom + + src/app/components/admin/settings/settings.component.html + 195 + + Default zoom + + + Fit width + + src/app/components/admin/settings/settings.component.html + 199 + + Fit width + + + Fit page + + src/app/components/admin/settings/settings.component.html + 200 + + Fit page + + + Only applies to the Paperless-ngx PDF viewer. + + src/app/components/admin/settings/settings.component.html + 202 + + Only applies to the Paperless-ngx PDF viewer. + + + Automatically remove inbox tag(s) on save + + src/app/components/admin/settings/settings.component.html + 208 + + Automatically remove inbox tag(s) on save + + + Show document thumbnail during loading + + src/app/components/admin/settings/settings.component.html + 214 + + Show document thumbnail during loading + + + Global search + + src/app/components/admin/settings/settings.component.html + 218 + + + src/app/components/app-frame/global-search/global-search.component.ts + 122 + + Global search + + + Do not include advanced search results + + src/app/components/admin/settings/settings.component.html + 221 + + Do not include advanced search results + + + Full search links to + + src/app/components/admin/settings/settings.component.html + 227 + + Full search links to + + + Title and content search + + src/app/components/admin/settings/settings.component.html + 231 + + Title and content search + + + Advanced search + + src/app/components/admin/settings/settings.component.html + 232 + + + src/app/components/app-frame/global-search/global-search.component.html + 24 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 208 + + Advanced search + + + Bulk editing + + src/app/components/admin/settings/settings.component.html + 237 + + Bulk editing + + + Show confirmation dialogs + + src/app/components/admin/settings/settings.component.html + 240 + + Show confirmation dialogs + + + Apply on close + + src/app/components/admin/settings/settings.component.html + 241 + + Apply on close + + + Notes + + src/app/components/admin/settings/settings.component.html + 245 + + + src/app/components/document-list/document-list.component.html + 242 + + + src/app/data/document.ts + 58 + + + src/app/data/document.ts + 95 + + Notes + + + Enable notes + + src/app/components/admin/settings/settings.component.html + 248 + + Enable notes + + + Permissions + + src/app/components/admin/settings/settings.component.html + 259 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 51 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 2 + + + src/app/components/document-detail/document-detail.component.html + 343 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 78 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 101 + + + src/app/components/manage/mail/mail.component.html + 66 + + + src/app/components/manage/mail/mail.component.html + 78 + + + src/app/components/manage/mail/mail.component.html + 154 + + + src/app/components/manage/mail/mail.component.html + 166 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + + src/app/components/manage/management-list/management-list.component.html + 7 + + Permissions + + + Default Permissions + + src/app/components/admin/settings/settings.component.html + 262 + + Default Permissions + + + Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. + + src/app/components/admin/settings/settings.component.html + 266,268 + + Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. + + + Default Owner + + src/app/components/admin/settings/settings.component.html + 273 + + Default Owner + + + Objects without an owner can be viewed and edited by all users + + src/app/components/admin/settings/settings.component.html + 277 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 32 + + Objects without an owner can be viewed and edited by all users + + + Default View Permissions + + src/app/components/admin/settings/settings.component.html + 282 + + Default View Permissions + + + Users: + + src/app/components/admin/settings/settings.component.html + 287 + + + src/app/components/admin/settings/settings.component.html + 314 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 278 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 297 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 364 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 383 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 38 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 57 + + Users: + + + Groups: + + src/app/components/admin/settings/settings.component.html + 297 + + + src/app/components/admin/settings/settings.component.html + 324 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 286 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 305 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 372 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 391 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 46 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 65 + + Groups: + + + Default Edit Permissions + + src/app/components/admin/settings/settings.component.html + 309 + + Default Edit Permissions + + + Edit permissions also grant viewing permissions + + src/app/components/admin/settings/settings.component.html + 333 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 311 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 397 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 71 + + Edit permissions also grant viewing permissions + + + Notifications + + src/app/components/admin/settings/settings.component.html + 341 + + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 11 + + Notifications + + + Document processing + + src/app/components/admin/settings/settings.component.html + 344 + + Document processing + + + Show notifications when new documents are detected + + src/app/components/admin/settings/settings.component.html + 348 + + Show notifications when new documents are detected + + + Show notifications when document processing completes successfully + + src/app/components/admin/settings/settings.component.html + 349 + + Show notifications when document processing completes successfully + + + Show notifications when document processing fails + + src/app/components/admin/settings/settings.component.html + 350 + + Show notifications when document processing fails + + + Suppress notifications on dashboard + + src/app/components/admin/settings/settings.component.html + 351 + + Suppress notifications on dashboard + + + This will suppress all messages about document processing status on the dashboard. + + src/app/components/admin/settings/settings.component.html + 351 + + This will suppress all messages about document processing status on the dashboard. + + + Cancel + + src/app/components/admin/settings/settings.component.html + 361 + + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 47 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 25 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 51 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 75 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 76 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 30 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 56 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 115 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 25 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 184 + + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 81 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 20 + + + src/app/components/manage/saved-views/saved-views.component.html + 73 + + Cancel + + + Use system language + + src/app/components/admin/settings/settings.component.ts + 78 + + Use system language + + + Use date format of display language + + src/app/components/admin/settings/settings.component.ts + 81 + + Use date format of display language + + + Error retrieving users + + src/app/components/admin/settings/settings.component.ts + 226 + + + src/app/components/admin/users-groups/users-groups.component.ts + 75 + + Error retrieving users + + + Error retrieving groups + + src/app/components/admin/settings/settings.component.ts + 245 + + + src/app/components/admin/users-groups/users-groups.component.ts + 89 + + Error retrieving groups + + + Settings were saved successfully. + + src/app/components/admin/settings/settings.component.ts + 548 + + Settings were saved successfully. + + + Settings were saved successfully. Reload is required to apply some changes. + + src/app/components/admin/settings/settings.component.ts + 552 + + Settings were saved successfully. Reload is required to apply some changes. + + + Reload now + + src/app/components/admin/settings/settings.component.ts + 553 + + Reload now + + + An error occurred while saving settings. + + src/app/components/admin/settings/settings.component.ts + 563 + + + src/app/components/app-frame/app-frame.component.ts + 180 + + An error occurred while saving settings. + + + File Tasks + + src/app/components/admin/tasks/tasks.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 278 + + + src/app/components/app-frame/app-frame.component.html + 280 + + File Tasks + + + Clear selection + + src/app/components/admin/tasks/tasks.component.html + 9 + + + src/app/components/admin/trash/trash.component.html + 8 + + + src/app/components/document-list/document-list.component.html + 153 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + + src/app/components/manage/management-list/management-list.component.html + 4 + + Clear selection + + + Filter by + + src/app/components/admin/tasks/tasks.component.html + 16 + + Filter by + + + Name + + src/app/components/admin/tasks/tasks.component.html + 61 + + + src/app/components/admin/tasks/tasks.component.ts + 45 + + + src/app/components/admin/trash/trash.component.html + 35 + + + src/app/components/admin/users-groups/users-groups.component.html + 21 + + + src/app/components/admin/users-groups/users-groups.component.html + 58 + + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 12 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 11 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 13 + + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 8 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 17 + + + src/app/components/manage/mail/mail.component.html + 30 + + + src/app/components/manage/mail/mail.component.html + 111 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 21 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/management-list/management-list.component.html + 38 + + + src/app/components/manage/workflows/workflows.component.html + 17 + + Name + + + Created + + src/app/components/admin/tasks/tasks.component.html + 62 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 8 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 94 + + + src/app/components/document-list/document-list.component.html + 269 + + + src/app/data/document.ts + 34 + + + src/app/data/document.ts + 92 + + Created + + + Results + + src/app/components/admin/tasks/tasks.component.html + 64 + + Results + + + Info + + src/app/components/admin/tasks/tasks.component.html + 66 + + Info + + + Actions + + src/app/components/admin/tasks/tasks.component.html + 67 + + + src/app/components/admin/trash/trash.component.html + 37 + + + src/app/components/admin/users-groups/users-groups.component.html + 23 + + + src/app/components/admin/users-groups/users-groups.component.html + 61 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 67 + + + src/app/components/document-detail/document-detail.component.html + 50 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 87 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 19 + + + src/app/components/manage/mail/mail.component.html + 33 + + + src/app/components/manage/mail/mail.component.html + 116 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/management-list/management-list.component.html + 44 + + + src/app/components/manage/saved-views/saved-views.component.html + 28 + + + src/app/components/manage/workflows/workflows.component.html + 21 + + Actions + + + click for full output + + src/app/components/admin/tasks/tasks.component.html + 97 + + click for full output + + + Dismiss + + src/app/components/admin/tasks/tasks.component.html + 110 + + + src/app/components/admin/tasks/tasks.component.ts + 155 + + Dismiss + + + Open Document + + src/app/components/admin/tasks/tasks.component.html + 115 + + Open Document + + + {VAR_PLURAL, plural, =1 {One task} other { total tasks}} + + src/app/components/admin/tasks/tasks.component.html + 134 + + {VAR_PLURAL, plural, =1 {One task} other { total tasks}} + + +  ( selected) + + src/app/components/admin/tasks/tasks.component.html + 136 + +  ( selected) + + + Failed + + src/app/components/admin/tasks/tasks.component.html + 148,150 + + Failed + + + Complete + + src/app/components/admin/tasks/tasks.component.html + 156,158 + + Complete + + + Started + + src/app/components/admin/tasks/tasks.component.html + 164,166 + + Started + + + Queued + + src/app/components/admin/tasks/tasks.component.html + 172,174 + + Queued + + + Result + + src/app/components/admin/tasks/tasks.component.ts + 46 + + Result + + + Dismiss selected + + src/app/components/admin/tasks/tasks.component.ts + 110 + + Dismiss selected + + + Dismiss all + + src/app/components/admin/tasks/tasks.component.ts + 111 + + Dismiss all + + + Confirm Dismiss All + + src/app/components/admin/tasks/tasks.component.ts + 152 + + Confirm Dismiss All + + + Dismiss all tasks? + + src/app/components/admin/tasks/tasks.component.ts + 153 + + Dismiss all tasks? + + + Error dismissing tasks + + src/app/components/admin/tasks/tasks.component.ts + 161 + + Error dismissing tasks + + + Error dismissing task + + src/app/components/admin/tasks/tasks.component.ts + 170 + + Error dismissing task + + + queued + + src/app/components/admin/tasks/tasks.component.ts + 246 + + queued + + + started + + src/app/components/admin/tasks/tasks.component.ts + 248 + + started + + + completed + + src/app/components/admin/tasks/tasks.component.ts + 250 + + completed + + + failed + + src/app/components/admin/tasks/tasks.component.ts + 252 + + failed + + + Trash + + src/app/components/admin/trash/trash.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 238 + + + src/app/components/app-frame/app-frame.component.html + 241 + + Trash + + + Manage trashed documents that are pending deletion. + + src/app/components/admin/trash/trash.component.html + 4 + + Manage trashed documents that are pending deletion. + + + Restore selected + + src/app/components/admin/trash/trash.component.html + 11 + + Restore selected + + + Delete selected + + src/app/components/admin/trash/trash.component.html + 14 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 87 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 89 + + Delete selected + + + Empty trash + + src/app/components/admin/trash/trash.component.html + 17 + + Empty trash + + + Remaining + + src/app/components/admin/trash/trash.component.html + 36 + + Remaining + + + days + + src/app/components/admin/trash/trash.component.html + 63 + + days + + + Restore + + src/app/components/admin/trash/trash.component.html + 71 + + + src/app/components/admin/trash/trash.component.html + 78 + + Restore + + + Delete + + src/app/components/admin/trash/trash.component.html + 72 + + + src/app/components/admin/trash/trash.component.html + 81 + + + src/app/components/admin/trash/trash.component.ts + 82 + + + src/app/components/admin/trash/trash.component.ts + 116 + + + src/app/components/admin/users-groups/users-groups.component.html + 38 + + + src/app/components/admin/users-groups/users-groups.component.html + 76 + + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 27 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 87 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 45 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 89 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 242 + + + src/app/components/common/permissions-select/permissions-select.component.html + 19 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 36 + + + src/app/components/document-detail/document-detail.component.html + 24 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 145 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 43 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 55 + + + src/app/components/manage/mail/mail.component.html + 67 + + + src/app/components/manage/mail/mail.component.html + 81 + + + src/app/components/manage/mail/mail.component.html + 155 + + + src/app/components/manage/mail/mail.component.html + 169 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 10 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 121 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.html + 133 + + + src/app/components/manage/management-list/management-list.component.ts + 247 + + + src/app/components/manage/saved-views/saved-views.component.html + 30 + + + src/app/components/manage/workflows/workflows.component.html + 55 + + + src/app/components/manage/workflows/workflows.component.html + 66 + + Delete + + + {VAR_PLURAL, plural, =1 {One document in trash} other { total documents in trash}} + + src/app/components/admin/trash/trash.component.html + 94 + + {VAR_PLURAL, plural, =1 {One document in trash} other { total documents in trash}} + + + Confirm delete + + src/app/components/admin/trash/trash.component.ts + 78 + + + src/app/components/admin/trash/trash.component.ts + 110 + + + src/app/components/manage/management-list/management-list.component.ts + 243 + + + src/app/components/manage/management-list/management-list.component.ts + 366 + + Confirm delete + + + This operation will permanently delete this document. + + src/app/components/admin/trash/trash.component.ts + 79 + + This operation will permanently delete this document. + + + This operation cannot be undone. + + src/app/components/admin/trash/trash.component.ts + 80 + + + src/app/components/admin/trash/trash.component.ts + 114 + + + src/app/components/admin/users-groups/users-groups.component.ts + 145 + + + src/app/components/admin/users-groups/users-groups.component.ts + 198 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 104 + + + src/app/components/manage/mail/mail.component.ts + 192 + + + src/app/components/manage/mail/mail.component.ts + 293 + + + src/app/components/manage/management-list/management-list.component.ts + 368 + + + src/app/components/manage/workflows/workflows.component.ts + 133 + + This operation cannot be undone. + + + Document "" deleted + + src/app/components/admin/trash/trash.component.ts + 90 + + Document "" deleted + + + Error deleting document "" + + src/app/components/admin/trash/trash.component.ts + 97 + + Error deleting document "" + + + This operation will permanently delete the selected documents. + + src/app/components/admin/trash/trash.component.ts + 112 + + This operation will permanently delete the selected documents. + + + This operation will permanently delete all documents in the trash. + + src/app/components/admin/trash/trash.component.ts + 113 + + This operation will permanently delete all documents in the trash. + + + Document(s) deleted + + src/app/components/admin/trash/trash.component.ts + 124 + + Document(s) deleted + + + Error deleting document(s) + + src/app/components/admin/trash/trash.component.ts + 131 + + Error deleting document(s) + + + Document "" restored + + src/app/components/admin/trash/trash.component.ts + 144 + + Document "" restored + + + Error restoring document "" + + src/app/components/admin/trash/trash.component.ts + 155 + + Error restoring document "" + + + Document(s) restored + + src/app/components/admin/trash/trash.component.ts + 167 + + Document(s) restored + + + Error restoring document(s) + + src/app/components/admin/trash/trash.component.ts + 173 + + Error restoring document(s) + + + Users & Groups + + src/app/components/admin/users-groups/users-groups.component.html + 2 + + + src/app/components/app-frame/app-frame.component.html + 269 + + + src/app/components/app-frame/app-frame.component.html + 271 + + Users & Groups + + + Create, delete and edit users and groups. + + src/app/components/admin/users-groups/users-groups.component.html + 4 + + Create, delete and edit users and groups. + + + Users + + src/app/components/admin/users-groups/users-groups.component.html + 12 + + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 76 + + Users + + + Add User + + src/app/components/admin/users-groups/users-groups.component.html + 14 + + Add User + + + Username + + src/app/components/admin/users-groups/users-groups.component.html + 20 + + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 19 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 13 + + + src/app/components/manage/mail/mail.component.html + 32 + + Username + + + Groups + + src/app/components/admin/users-groups/users-groups.component.html + 22 + + + src/app/components/admin/users-groups/users-groups.component.html + 50 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 34 + + Groups + + + Edit + + src/app/components/admin/users-groups/users-groups.component.html + 35 + + + src/app/components/admin/users-groups/users-groups.component.html + 73 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 53 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 42 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 52 + + + src/app/components/manage/mail/mail.component.html + 65 + + + src/app/components/manage/mail/mail.component.html + 75 + + + src/app/components/manage/mail/mail.component.html + 153 + + + src/app/components/manage/mail/mail.component.html + 163 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 120 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/management-list/management-list.component.html + 130 + + + src/app/components/manage/workflows/workflows.component.html + 54 + + + src/app/components/manage/workflows/workflows.component.html + 63 + + Edit + + + Add Group + + src/app/components/admin/users-groups/users-groups.component.html + 52 + + Add Group + + + No groups defined + + src/app/components/admin/users-groups/users-groups.component.html + 84 + + No groups defined + + + Password has been changed, you will be logged out momentarily. + + src/app/components/admin/users-groups/users-groups.component.ts + 116 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 201 + + Password has been changed, you will be logged out momentarily. + + + Saved user "". + + src/app/components/admin/users-groups/users-groups.component.ts + 125 + + Saved user "". + + + Error saving user. + + src/app/components/admin/users-groups/users-groups.component.ts + 135 + + Error saving user. + + + Confirm delete user account + + src/app/components/admin/users-groups/users-groups.component.ts + 143 + + Confirm delete user account + + + This operation will permanently delete this user account. + + src/app/components/admin/users-groups/users-groups.component.ts + 144 + + This operation will permanently delete this user account. + + + Proceed + + src/app/components/admin/users-groups/users-groups.component.ts + 147 + + + src/app/components/admin/users-groups/users-groups.component.ts + 200 + + + src/app/components/document-detail/document-detail.component.ts + 1028 + + + src/app/components/document-detail/document-detail.component.ts + 1393 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 798 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 831 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 850 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 106 + + + src/app/components/manage/mail/mail.component.ts + 194 + + + src/app/components/manage/mail/mail.component.ts + 295 + + + src/app/components/manage/management-list/management-list.component.ts + 370 + + + src/app/components/manage/workflows/workflows.component.ts + 135 + + Proceed + + + Deleted user "" + + src/app/components/admin/users-groups/users-groups.component.ts + 153 + + Deleted user "" + + + Error deleting user "". + + src/app/components/admin/users-groups/users-groups.component.ts + 160 + + Error deleting user "". + + + Saved group "". + + src/app/components/admin/users-groups/users-groups.component.ts + 180 + + Saved group "". + + + Error saving group. + + src/app/components/admin/users-groups/users-groups.component.ts + 188 + + Error saving group. + + + Confirm delete user group + + src/app/components/admin/users-groups/users-groups.component.ts + 196 + + Confirm delete user group + + + This operation will permanently delete this user group. + + src/app/components/admin/users-groups/users-groups.component.ts + 197 + + This operation will permanently delete this user group. + + + Deleted group "" + + src/app/components/admin/users-groups/users-groups.component.ts + 206 + + Deleted group "" + + + Error deleting group "". + + src/app/components/admin/users-groups/users-groups.component.ts + 213 + + Error deleting group "". + + + by Paperless-ngx + + src/app/components/app-frame/app-frame.component.html + 20 + + by Paperless-ngx + + + Logged in as + + src/app/components/app-frame/app-frame.component.html + 43 + + Logged in as + + + My Profile + + src/app/components/app-frame/app-frame.component.html + 47 + + My Profile + + + Logout + + src/app/components/app-frame/app-frame.component.html + 54 + + Logout + + + Documentation + + src/app/components/app-frame/app-frame.component.html + 59 + + + src/app/components/app-frame/app-frame.component.html + 299 + + + src/app/components/app-frame/app-frame.component.html + 302 + + Documentation + + + Saved views + + src/app/components/app-frame/app-frame.component.html + 101 + + + src/app/components/app-frame/app-frame.component.html + 106 + + Saved views + + + Open documents + + src/app/components/app-frame/app-frame.component.html + 141 + + Open documents + + + Close all + + src/app/components/app-frame/app-frame.component.html + 161 + + + src/app/components/app-frame/app-frame.component.html + 163 + + Close all + + + Manage + + src/app/components/app-frame/app-frame.component.html + 172 + + Manage + + + Correspondents + + src/app/components/app-frame/app-frame.component.html + 178 + + + src/app/components/app-frame/app-frame.component.html + 180 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 107 + + Correspondents + + + Tags + + src/app/components/app-frame/app-frame.component.html + 185 + + + src/app/components/app-frame/app-frame.component.html + 188 + + + src/app/components/common/input/tags/tags.component.ts + 80 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 94 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 5 + + + src/app/components/document-list/document-list.component.html + 224 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 39 + + + src/app/data/document.ts + 42 + + Tags + + + Document Types + + src/app/components/app-frame/app-frame.component.html + 194 + + + src/app/components/app-frame/app-frame.component.html + 196 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 120 + + Document Types + + + Storage Paths + + src/app/components/app-frame/app-frame.component.html + 201 + + + src/app/components/app-frame/app-frame.component.html + 203 + + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 133 + + Storage Paths + + + Custom Fields + + src/app/components/app-frame/app-frame.component.html + 208 + + + src/app/components/app-frame/app-frame.component.html + 210 + + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 4 + + + src/app/components/manage/custom-fields/custom-fields.component.html + 2 + + Custom Fields + + + Workflows + + src/app/components/app-frame/app-frame.component.html + 224 + + + src/app/components/app-frame/app-frame.component.html + 226 + + + src/app/components/manage/workflows/workflows.component.html + 2 + + Workflows + + + Mail + + src/app/components/app-frame/app-frame.component.html + 231 + + + src/app/components/app-frame/app-frame.component.html + 234 + + Mail + + + Administration + + src/app/components/app-frame/app-frame.component.html + 249 + + Administration + + + Configuration + + src/app/components/app-frame/app-frame.component.html + 262 + + + src/app/components/app-frame/app-frame.component.html + 264 + + Configuration + + + GitHub + + src/app/components/app-frame/app-frame.component.html + 309 + + GitHub + + + is available. + + src/app/components/app-frame/app-frame.component.html + 318,319 + + is available. + + + Click to view. + + src/app/components/app-frame/app-frame.component.html + 319 + + Click to view. + + + Paperless-ngx can automatically check for updates + + src/app/components/app-frame/app-frame.component.html + 323 + + Paperless-ngx can automatically check for updates + + + How does this work? + + src/app/components/app-frame/app-frame.component.html + 330,332 + + How does this work? + + + Update available + + src/app/components/app-frame/app-frame.component.html + 343 + + Update available + + + Sidebar views updated + + src/app/components/app-frame/app-frame.component.ts + 264 + + Sidebar views updated + + + Error updating sidebar views + + src/app/components/app-frame/app-frame.component.ts + 267 + + Error updating sidebar views + + + An error occurred while saving update checking settings. + + src/app/components/app-frame/app-frame.component.ts + 288 + + An error occurred while saving update checking settings. + + + Search + + src/app/components/app-frame/global-search/global-search.component.html + 8 + + + src/app/components/app-frame/global-search/global-search.component.html + 26 + + Search + + + Open + + src/app/components/app-frame/global-search/global-search.component.html + 53 + + + src/app/components/app-frame/global-search/global-search.component.html + 56 + + + src/app/components/app-frame/global-search/global-search.component.html + 59 + + + src/app/components/app-frame/global-search/global-search.component.html + 76 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 72 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 143 + + Open + + + Filter documents + + src/app/components/app-frame/global-search/global-search.component.html + 62 + + Filter documents + + + Download + + src/app/components/app-frame/global-search/global-search.component.html + 73 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 104 + + + src/app/components/document-detail/document-detail.component.html + 34 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 117 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 78 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 149 + + Download + + + No results + + src/app/components/app-frame/global-search/global-search.component.html + 87 + + No results + + + Documents + + src/app/components/app-frame/global-search/global-search.component.html + 90 + + Documents + + + Saved Views + + src/app/components/app-frame/global-search/global-search.component.html + 96 + + Saved Views + + + Tags + + src/app/components/app-frame/global-search/global-search.component.html + 103 + + Tags + + + Correspondents + + src/app/components/app-frame/global-search/global-search.component.html + 110 + + Correspondents + + + Document types + + src/app/components/app-frame/global-search/global-search.component.html + 117 + + Document types + + + Storage paths + + src/app/components/app-frame/global-search/global-search.component.html + 124 + + Storage paths + + + Users + + src/app/components/app-frame/global-search/global-search.component.html + 131 + + Users + + + Groups + + src/app/components/app-frame/global-search/global-search.component.html + 138 + + Groups + + + Custom fields + + src/app/components/app-frame/global-search/global-search.component.html + 145 + + Custom fields + + + Mail accounts + + src/app/components/app-frame/global-search/global-search.component.html + 152 + + Mail accounts + + + Mail rules + + src/app/components/app-frame/global-search/global-search.component.html + 159 + + Mail rules + + + Workflows + + src/app/components/app-frame/global-search/global-search.component.html + 166 + + Workflows + + + Successfully updated object. + + src/app/components/app-frame/global-search/global-search.component.ts + 211 + + + src/app/components/app-frame/global-search/global-search.component.ts + 249 + + Successfully updated object. + + + Error occurred saving object. + + src/app/components/app-frame/global-search/global-search.component.ts + 214 + + + src/app/components/app-frame/global-search/global-search.component.ts + 252 + + Error occurred saving object. + + + Clear All + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 16 + + Clear All + + + No notifications + + src/app/components/app-frame/toasts-dropdown/toasts-dropdown.component.html + 20 + + No notifications + + + Clear + + src/app/components/common/clearable-badge/clearable-badge.component.html + 2 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 85 + + Clear + + + Are you sure? + + src/app/components/common/confirm-button/confirm-button.component.ts + 22 + + Are you sure? + + + Confirmation + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 23 + + Confirmation + + + Confirm + + src/app/components/common/confirm-dialog/confirm-dialog.component.ts + 35 + + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 26 + + + src/app/components/document-detail/document-detail.component.ts + 981 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 441 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 481 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 519 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 557 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 619 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 752 + + Confirm + + + Documents: + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 9 + + Documents: + + + Use metadata from: + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 22 + + Use metadata from: + + + Regenerate all metadata + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 24 + + Regenerate all metadata + + + Try to include archive version in merge for non-PDF files + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 32 + + Try to include archive version in merge for non-PDF files + + + Delete original documents after successful merge + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 36 + + Delete original documents after successful merge + + + Note that only PDFs will be included. + + src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html + 39 + + Note that only PDFs will be included. + + + Note that only PDFs will be rotated. + + src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html + 25 + + Note that only PDFs will be rotated. + + + View + + src/app/components/common/custom-field-display/custom-field-display.component.html + 22 + + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 34 + + + src/app/components/common/permissions-select/permissions-select.component.html + 20 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 75 + + View + + + Search fields + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 10 + + Search fields + + + Create new field + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html + 21 + + Create new field + + + Saved field "". + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts + 130 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 85 + + Saved field "". + + + Error saving field. + + src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts + 139 + + + src/app/components/manage/custom-fields/custom-fields.component.ts + 94 + + Error saving field. + + + Today + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 47 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 52 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 76 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 128 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 152 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 111 + + + src/app/components/common/input/date/date.component.html + 21 + + Today + + + Close + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 48 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 53 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 77 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 129 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 153 + + + src/app/components/common/input/date/date.component.html + 22 + + + src/app/components/document-detail/document-detail.component.html + 107 + + + src/app/guards/dirty-saved-view.guard.ts + 35 + + Close + + + True + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 55 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 95 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 101 + + True + + + False + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 56 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 96 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 102 + + False + + + Search docs... + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 70 + + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 118 + + Search docs... + + + Any + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 150 + + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 17 + + Any + + + All + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 152 + + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 15 + + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 16 + + + src/app/components/common/permissions-select/permissions-select.component.html + 16 + + + src/app/components/common/permissions-select/permissions-select.component.html + 27 + + + src/app/components/document-list/document-list.component.html + 30 + + All + + + Not + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 155 + + Not + + + Add query + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 174 + + Add query + + + Add expression + + src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html + 177 + + Add expression + + + Relative dates + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 25 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 101 + + Relative dates + + + From + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 44 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 120 + + From + + + To + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 68 + + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 144 + + To + + + Added + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 84 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 90 + + + src/app/components/document-list/document-list.component.html + 278 + + + src/app/data/document.ts + 38 + + + src/app/data/document.ts + 93 + + Added + + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + + + Within 1 week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 81 + + Within 1 week + + + Within 1 month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 86 + + Within 1 month + + + Within 3 months + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 91 + + Within 3 months + + + Within 1 year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 96 + + Within 1 year + + + This year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 101 + + This year + + + This month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 106 + + This month + + + Yesterday + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 116 + + + src/app/pipes/custom-date.pipe.ts + 29 + + Yesterday + + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + + + Matching algorithm + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 13 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 64 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 18 + + Matching algorithm + + + Matching pattern + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 15 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 66 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 20 + + Matching pattern + + + Case insensitive + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html + 16 + + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.html + 17 + + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 67 + + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 21 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 173 + + Case insensitive + + + Create new correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 43 + + Create new correspondent + + + Edit correspondent + + src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.ts + 47 + + Edit correspondent + + + Data type + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 12 + + Data type + + + Data type cannot be changed after a field is created + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 14 + + Data type cannot be changed after a field is created + + + Add option + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 20 + + Add option + + + Default Currency + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + Default Currency + + + 3-character currency code + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + 3-character currency code + + + Use locale + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html + 44 + + Use locale + + + Create new custom field + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts + 118 + + Create new custom field + + + Edit custom field + + src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts + 122 + + Edit custom field + + + Create new document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 43 + + Create new document type + + + Edit document type + + src/app/components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component.ts + 47 + + Edit document type + + + Create new item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 121 + + Create new item + + + Edit item + + src/app/components/common/edit-dialog/edit-dialog.component.ts + 125 + + Edit item + + + Create new user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 36 + + Create new user group + + + Edit user group + + src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts + 40 + + Edit user group + + + IMAP Server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 14 + + IMAP Server + + + IMAP Port + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 15 + + IMAP Port + + + IMAP Security + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 16 + + IMAP Security + + + Password + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 20 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 15 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 20 + + Password + + + Password is token + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 21 + + Password is token + + + Check if the password above is a token used for authentication + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 21 + + Check if the password above is a token used for authentication + + + Character Set + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 22 + + Character Set + + + Test + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.html + 37 + + Test + + + No encryption + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 20 + + No encryption + + + SSL + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 21 + + SSL + + + STARTTLS + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 22 + + STARTTLS + + + Create new mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 54 + + Create new mail account + + + Edit mail account + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 58 + + Edit mail account + + + Successfully connected to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 103 + + Successfully connected to the mail server + + + Unable to connect to the mail server + + src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts + 104 + + Unable to connect to the mail server + + + Account + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 16 + + + src/app/components/manage/mail/mail.component.html + 113 + + Account + + + Order + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 19 + + Order + + + Enabled + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 22 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 19 + + + src/app/components/manage/mail/mail.component.html + 137 + + + src/app/components/manage/workflows/workflows.component.html + 41 + + Enabled + + + Paperless will only process mails that match all of the criteria specified below. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 27 + + Paperless will only process mails that match all of the criteria specified below. + + + Folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 29 + + Folder + + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 29 + + Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server. + + + Maximum age (days) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 30 + + Maximum age (days) + + + Filter from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 33 + + Filter from + + + Filter to + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 34 + + Filter to + + + Filter subject + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 35 + + Filter subject + + + Filter body + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 36 + + Filter body + + + Consumption scope + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 42 + + Consumption scope + + + See docs for .eml processing requirements + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 42 + + See docs for .eml processing requirements + + + Attachment type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 43 + + Attachment type + + + PDF layout + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 44 + + PDF layout + + + Include only files matching + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 47 + + Include only files matching + + + Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 47 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 48 + + Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. + + + Exclude files matching + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 48 + + Exclude files matching + + + Action + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 54 + + Action + + + Only performed if the mail is processed. + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 54 + + Only performed if the mail is processed. + + + Action parameter + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 56 + + Action parameter + + + Assign title from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 58 + + Assign title from + + + Assign owner from rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 59 + + Assign owner from rule + + + Assign document type + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 63 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 265 + + Assign document type + + + Assign correspondent from + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 64 + + Assign correspondent from + + + Assign correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 66 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 266 + + Assign correspondent + + + Error + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html + 73 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 113 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 186 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 220 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 254 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 264 + + + src/app/components/common/toast/toast.component.html + 30 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 36 + + Error + + + Only process attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 38 + + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 49 + + Only process attachments + + + Process all files, including 'inline' attachments + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 42 + + Process all files, including 'inline' attachments + + + Process message as .eml + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 53 + + Process message as .eml + + + Process message as .eml and attachments separately + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 57 + + Process message as .eml and attachments separately + + + System default + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 64 + + System default + + + Text, then HTML + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 68 + + Text, then HTML + + + HTML, then text + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 72 + + HTML, then text + + + HTML only + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 76 + + HTML only + + + Text only + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 80 + + Text only + + + Move to specified folder + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 91 + + Move to specified folder + + + Mark as read, don't process read mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 95 + + Mark as read, don't process read mails + + + Flag the mail, don't process flagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 99 + + Flag the mail, don't process flagged mails + + + Tag the mail with specified tag, don't process tagged mails + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 103 + + Tag the mail with specified tag, don't process tagged mails + + + Use subject as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 110 + + Use subject as title + + + Use attachment filename as title + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 114 + + Use attachment filename as title + + + Do not assign title from this rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 118 + + Do not assign title from this rule + + + Do not assign a correspondent + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 125 + + Do not assign a correspondent + + + Use mail address + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 129 + + Use mail address + + + Use name (or mail address if not available) + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 133 + + Use name (or mail address if not available) + + + Use correspondent selected below + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 137 + + Use correspondent selected below + + + Create new mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 191 + + Create new mail rule + + + Edit mail rule + + src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts + 195 + + Edit mail rule + + + Path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 13 + + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 49 + + Path + + + See <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>the documentation</a>. + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 13 + + See <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>the documentation</a>. + + + Preview + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 18 + + + src/app/components/document-detail/document-detail.component.html + 309 + + Preview + + + Path test failed + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 30 + + Path test failed + + + No document selected + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 32 + + No document selected + + + Search for a document + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 38 + + Search for a document + + + No documents found + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html + 39 + + + src/app/components/common/input/document-link/document-link.component.ts + 72 + + No documents found + + + Create new storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 82 + + Create new storage path + + + Edit storage path + + src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.ts + 86 + + Edit storage path + + + Color + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 13 + + + src/app/components/manage/tag-list/tag-list.component.ts + 49 + + Color + + + Parent + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 15 + + Parent + + + Inbox tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 17 + + Inbox tag + + + Inbox tags are automatically assigned to all consumed documents. + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html + 17 + + Inbox tags are automatically assigned to all consumed documents. + + + Create new tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 51 + + Create new tag + + + Edit tag + + src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.ts + 55 + + Edit tag + + + Email + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 14 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 136 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 10 + + + src/app/components/document-detail/document-detail.component.html + 92 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 101 + + Email + + + First name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 16 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 30 + + First name + + + Last name + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 17 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 31 + + Last name + + + Active + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 22 + + Active + + + Admin + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 26 + + Admin + + + Access logs, Django backend + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 26 + + Access logs, Django backend + + + Superuser + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 30 + + Superuser + + + (Grants all permissions and can view objects) + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 30 + + (Grants all permissions and can view objects) + + + Two-factor Authentication + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 37 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 103 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 139 + + Two-factor Authentication + + + Disable Two-factor Authentication + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 39 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html + 41 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 170 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 172 + + Disable Two-factor Authentication + + + Create new user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 72 + + Create new user account + + + Edit user account + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 76 + + Edit user account + + + Totp deactivated + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 132 + + Totp deactivated + + + Totp deactivation failed + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 135 + + + src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.ts + 140 + + Totp deactivation failed + + + Sort order + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 16 + + + src/app/components/manage/workflows/workflows.component.html + 18 + + Sort order + + + Triggers + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 25 + + + src/app/components/manage/workflows/workflows.component.html + 20 + + Triggers + + + Trigger Workflow On: + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 31 + + Trigger Workflow On: + + + Add Trigger + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 33 + + Add Trigger + + + Apply Actions: + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 73 + + Apply Actions: + + + Add Action + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 75 + + Add Action + + + Trigger type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 123 + + Trigger type + + + Set scheduled trigger offset and which date field to use. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 125 + + Set scheduled trigger offset and which date field to use. + + + Offset days + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 130 + + Offset days + + + Positive values will trigger after the date, negative values before. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 134 + + Positive values will trigger after the date, negative values before. + + + Relative to + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 139 + + Relative to + + + Custom field + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 143 + + Custom field + + + Custom field to use for date. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 143 + + Custom field to use for date. + + + Recurring + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 149 + + Recurring + + + Trigger is recurring. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 149 + + Trigger is recurring. + + + Recurring interval days + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 153 + + Recurring interval days + + + Repeat the trigger every n days. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 153 + + Repeat the trigger every n days. + + + Trigger for documents that match all filters specified below. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 158 + + Trigger for documents that match all filters specified below. + + + Filter filename + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 161 + + Filter filename + + + Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 161 + + Apply to documents that match this filename. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive. + + + Filter sources + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 163 + + Filter sources + + + Filter path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 164 + + Filter path + + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 164 + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. + + + Filter mail rule + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 165 + + Filter mail rule + + + Apply to documents consumed via this mail rule. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 165 + + Apply to documents consumed via this mail rule. + + + Content matching algorithm + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 168 + + Content matching algorithm + + + Content matching pattern + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 170 + + Content matching pattern + + + Advanced Filters + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 183 + + Advanced Filters + + + Add filter + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 190 + + Add filter + + + No advanced workflow filters defined. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 195 + + No advanced workflow filters defined. + + + Complete the custom field query configuration. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 224,226 + + Complete the custom field query configuration. + + + Action type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 258 + + Action type + + + Assign title + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 263 + + Assign title + + + Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 263 + + Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. + + + Assign tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 264 + + Assign tags + + + Assign storage path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 267 + + Assign storage path + + + Assign custom fields + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 268 + + Assign custom fields + + + Assign owner + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 272 + + Assign owner + + + Assign view permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 274 + + Assign view permissions + + + Assign edit permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 293 + + Assign edit permissions + + + Remove tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 320 + + Remove tags + + + Remove all + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 321 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 327 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 333 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 339 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 345 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 352 + + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 358 + + Remove all + + + Remove correspondents + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 326 + + Remove correspondents + + + Remove document types + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 332 + + Remove document types + + + Remove storage paths + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 338 + + Remove storage paths + + + Remove custom fields + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 344 + + Remove custom fields + + + Remove owners + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 351 + + Remove owners + + + Remove permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 357 + + Remove permissions + + + View permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 360 + + View permissions + + + Edit permissions + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 379 + + Edit permissions + + + Email subject + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 407 + + Email subject + + + Email body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 408 + + Email body + + + Email recipients + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 409 + + Email recipients + + + Attach document + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 410 + + Attach document + + + Webhook url + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 418 + + Webhook url + + + Use parameters for webhook body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 420 + + Use parameters for webhook body + + + Send webhook payload as JSON + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 421 + + Send webhook payload as JSON + + + Webhook params + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 424 + + Webhook params + + + Webhook body + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 426 + + Webhook body + + + Webhook headers + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 428 + + Webhook headers + + + Include document + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html + 429 + + Include document + + + Consume Folder + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 71 + + Consume Folder + + + API Upload + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 75 + + API Upload + + + Mail Fetch + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 79 + + Mail Fetch + + + Web UI + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 83 + + Web UI + + + Modified + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 98 + + + src/app/data/document.ts + 94 + + Modified + + + Custom Field + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 102 + + Custom Field + + + Consumption Started + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 109 + + Consumption Started + + + Document Added + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 113 + + Document Added + + + Document Updated + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 117 + + Document Updated + + + Scheduled + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 121 + + Scheduled + + + Assignment + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 128 + + Assignment + + + Removal + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 132 + + Removal + + + Webhook + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 140 + + Webhook + + + Has any of these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 203 + + Has any of these tags + + + Has all of these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 210 + + Has all of these tags + + + Does not have these tags + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 217 + + Does not have these tags + + + Has correspondent + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 224 + + Has correspondent + + + Does not have correspondents + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 232 + + Does not have correspondents + + + Has document type + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 240 + + Has document type + + + Does not have document types + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 248 + + Does not have document types + + + Has storage path + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 256 + + Has storage path + + + Does not have storage paths + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 264 + + Does not have storage paths + + + Matches custom field query + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 272 + + Matches custom field query + + + Create new workflow + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 474 + + Create new workflow + + + Edit workflow + + src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts + 478 + + Edit workflow + + + {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 2,6 + + {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} + + + Email address(es) + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 11 + + Email address(es) + + + Subject + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 15 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 32 + + Subject + + + Message + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 19 + + Message + + + Use archive version + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 27 + + Use archive version + + + Send email + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 33 + + Send email + + + Some email servers may reject messages with large attachments. + + src/app/components/common/email-document-dialog/email-document-dialog.component.html + 37 + + Some email servers may reject messages with large attachments. + + + Email sent + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 63 + + Email sent + + + Error emailing documents + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 69 + + Error emailing documents + + + Error emailing document + + src/app/components/common/email-document-dialog/email-document-dialog.component.ts + 70 + + Error emailing document + + + Include + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 25 + + Include + + + Exclude + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 27 + + Exclude + + + Create + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 58 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 65 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + + src/app/components/manage/management-list/management-list.component.html + 13 + + Create + + + Apply + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 64 + + Apply + + + Click again to exclude items. + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.html + 77 + + Click again to exclude items. + + + Not assigned + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts + 95 + + Filter drop down element to filter for documents with no correspondent/type/tag assigned + Not assigned + + + Open filter + + src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts + 767 + + Open filter + + + Keyboard shortcuts + + src/app/components/common/hotkey-dialog/hotkey-dialog.component.ts + 24 + + Keyboard shortcuts + + + Remove + + src/app/components/common/input/check/check.component.html + 8 + + + src/app/components/common/input/date/date.component.html + 7 + + + src/app/components/common/input/document-link/document-link.component.html + 12 + + + src/app/components/common/input/file/file.component.html + 9 + + + src/app/components/common/input/file/file.component.html + 21 + + + src/app/components/common/input/monetary/monetary.component.html + 9 + + + src/app/components/common/input/number/number.component.html + 9 + + + src/app/components/common/input/select/select.component.html + 10 + + + src/app/components/common/input/switch/switch.component.html + 13 + + + src/app/components/common/input/text/text.component.html + 9 + + + src/app/components/common/input/textarea/textarea.component.html + 9 + + + src/app/components/common/input/url/url.component.html + 7 + + Remove + + + Invalid date. + + src/app/components/common/input/date/date.component.html + 31 + + Invalid date. + + + Suggestions: + + src/app/components/common/input/date/date.component.html + 37 + + + src/app/components/common/input/select/select.component.html + 61 + + + src/app/components/common/input/tags/tags.component.html + 65 + + Suggestions: + + + Filter documents with this + + src/app/components/common/input/date/date.component.ts + 120 + + + src/app/components/common/input/select/select.component.ts + 172 + + Filter documents with this + + + Remove link + + src/app/components/common/input/document-link/document-link.component.html + 43 + + + src/app/components/common/input/document-link/document-link.component.html + 50 + + Remove link + + + Open link + + src/app/components/common/input/document-link/document-link.component.html + 46 + + + src/app/components/common/input/url/url.component.html + 14 + + Open link + + + Not found + + src/app/components/common/input/document-link/document-link.component.html + 51 + + Not found + + + Search for documents + + src/app/components/common/input/document-link/document-link.component.ts + 81 + + Search for documents + + + Selected items + + src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts + 25 + + Selected items + + + No items selected + + src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts + 31 + + No items selected + + + Add + + src/app/components/common/input/entries/entries.component.html + 8 + + + src/app/components/common/permissions-select/permissions-select.component.html + 17 + + Add + + + Upload + + src/app/components/common/input/file/file.component.html + 15 + + Upload + + + Show password + + src/app/components/common/input/password/password.component.html + 6 + + Show password + + + Edit Permissions + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 9 + + Edit Permissions + + + Owner: + + src/app/components/common/input/permissions/permissions-form/permissions-form.component.html + 26 + + Owner: + + + Add item + + src/app/components/common/input/select/select.component.html + 25 + + Used for both types, correspondents, storage paths + Add item + + + Private + + src/app/components/common/input/select/select.component.ts + 71 + + + src/app/components/common/tag/tag.component.html + 20 + + + src/app/components/common/tag/tag.component.html + 23 + + + src/app/pipes/object-name.pipe.ts + 40 + + + src/app/pipes/object-name.pipe.ts + 46 + + Private + + + No items found + + src/app/components/common/input/select/select.component.ts + 106 + + No items found + + + Note: value has not yet been set and will not apply until explicitly changed + + src/app/components/common/input/switch/switch.component.html + 39 + + Note: value has not yet been set and will not apply until explicitly changed + + + Add tag + + src/app/components/common/input/tags/tags.component.html + 17 + + Add tag + + + Remove tag + + src/app/components/common/input/tags/tags.component.html + 23 + + Remove tag + + + Filter documents with these Tags + + src/app/components/common/input/tags/tags.component.html + 55 + + Filter documents with these Tags + + + Read more + + src/app/components/common/page-header/page-header.component.html + 15 + + + src/app/components/common/permissions-select/permissions-select.component.html + 9 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 7 + + Read more + + + Select all pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 9 + + Select all pages + + + Deselect all pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 12 + + Deselect all pages + + + Rotate selected pages counter-clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 17 + + Rotate selected pages counter-clockwise + + + Rotate selected pages clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 20 + + Rotate selected pages clockwise + + + Delete selected pages + + src/app/components/common/pdf-editor/pdf-editor.component.html + 23 + + Delete selected pages + + + Rotate page counter-clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 33 + + Rotate page counter-clockwise + + + Rotate page clockwise + + src/app/components/common/pdf-editor/pdf-editor.component.html + 36 + + Rotate page clockwise + + + Delete page + + src/app/components/common/pdf-editor/pdf-editor.component.html + 41 + + Delete page + + + Add / remove document split here + + src/app/components/common/pdf-editor/pdf-editor.component.html + 44 + + Add / remove document split here + + + Split here + + src/app/components/common/pdf-editor/pdf-editor.component.html + 70 + + Split here + + + Create new document(s) + + src/app/components/common/pdf-editor/pdf-editor.component.html + 82 + + Create new document(s) + + + Update existing document + + src/app/components/common/pdf-editor/pdf-editor.component.html + 87 + + Update existing document + + + Copy metadata + + src/app/components/common/pdf-editor/pdf-editor.component.html + 94 + + Copy metadata + + + Delete original + + src/app/components/common/pdf-editor/pdf-editor.component.html + 98 + + Delete original + + + Merge with existing permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.html + 14 + + Merge with existing permissions + + + Set permissions + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 41 + + Set permissions + + + Edit permissions for + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 46 + + Edit permissions for + + + Existing owner, user and group permissions will be merged with these settings. + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 87 + + Existing owner, user and group permissions will be merged with these settings. + + + Any and all existing owner, user and group permissions will be replaced. + + src/app/components/common/permissions-dialog/permissions-dialog.component.ts + 88 + + Any and all existing owner, user and group permissions will be replaced. + + + My documents + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 26 + + My documents + + + Shared with me + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 36 + + Shared with me + + + Shared by me + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 46 + + Shared by me + + + Unowned + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 56 + + Unowned + + + Hide unowned + + src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html + 86 + + Hide unowned + + + Global permissions define what areas of the app and API endpoints users can access. + + src/app/components/common/permissions-select/permissions-select.component.html + 8 + + Global permissions define what areas of the app and API endpoints users can access. + + + Type + + src/app/components/common/permissions-select/permissions-select.component.html + 15 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 56 + + Type + + + Change + + src/app/components/common/permissions-select/permissions-select.component.html + 18 + + Change + + + Inherited from group + + src/app/components/common/permissions-select/permissions-select.component.ts + 78 + + Inherited from group + + + Error loading preview + + src/app/components/common/preview-popup/preview-popup.component.html + 10 + + Error loading preview + + + Open preview + + src/app/components/common/preview-popup/preview-popup.component.ts + 52 + + Open preview + + + Edit Profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 3 + + Edit Profile + + + Confirm Email + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 15 + + Confirm Email + + + Confirm Password + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 25 + + Confirm Password + + + API Auth Token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 33 + + API Auth Token + + + Copy + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 37 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 44 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 157 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 28 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 284 + + + src/app/components/manage/mail/mail.component.html + 156 + + + src/app/components/manage/mail/mail.component.html + 174 + + + src/app/components/manage/workflows/workflows.component.html + 56 + + + src/app/components/manage/workflows/workflows.component.html + 71 + + Copy + + + Regenerate auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 47 + + Regenerate auth token + + + Copied! + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 54 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 164 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 39 + + Copied! + + + Warning: changing the token cannot be undone + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 56 + + Warning: changing the token cannot be undone + + + Connected social accounts + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 62 + + Connected social accounts + + + Set a password before disconnecting social account. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 66 + + Set a password before disconnecting social account. + + + Disconnect + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 72 + + Disconnect + + + Disconnect social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 74 + + Disconnect social account + + + Warning: disconnecting social accounts cannot be undone + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 84 + + Warning: disconnecting social accounts cannot be undone + + + Connect new social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 89 + + Connect new social account + + + Scan the QR code with your authenticator app and then enter the code below + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 116 + + Scan the QR code with your authenticator app and then enter the code below + + + Authenticator secret + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 119 + + Authenticator secret + + + You can store this secret and use it to reinstall your authenticator app at a later time. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 120 + + You can store this secret and use it to reinstall your authenticator app at a later time. + + + Code + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 123 + + Code + + + Recovery codes will not be shown again, make sure to save them. + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 142 + + Recovery codes will not be shown again, make sure to save them. + + + Copy codes + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html + 160 + + Copy codes + + + Emails must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 148 + + Emails must match + + + Passwords must match + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 176 + + Passwords must match + + + Profile updated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 198 + + Profile updated successfully + + + Error saving profile + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 212 + + Error saving profile + + + Error generating auth token + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 230 + + Error generating auth token + + + Error disconnecting social account + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 255 + + Error disconnecting social account + + + Error fetching TOTP settings + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 274 + + Error fetching TOTP settings + + + TOTP activated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 295 + + TOTP activated successfully + + + Error activating TOTP + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 297 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 303 + + Error activating TOTP + + + TOTP deactivated successfully + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 319 + + TOTP deactivated successfully + + + Error deactivating TOTP + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 321 + + + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts + 326 + + Error deactivating TOTP + + + No existing links + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 8,10 + + No existing links + + + Share + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 32 + + Share + + + Share archive version + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 48 + + Share archive version + + + Expires + + src/app/components/common/share-links-dialog/share-links-dialog.component.html + 52 + + Expires + + + 1 day + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 25 + + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 102 + + 1 day + + + 7 days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 26 + + 7 days + + + 30 days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 27 + + 30 days + + + Never + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 28 + + Never + + + Share Links + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 32 + + + src/app/components/document-detail/document-detail.component.html + 88 + + Share Links + + + Error retrieving links + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 83 + + Error retrieving links + + + days + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 102 + + days + + + Error deleting link + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 131 + + Error deleting link + + + Error creating link + + src/app/components/common/share-links-dialog/share-links-dialog.component.ts + 159 + + Error creating link + + + Environment + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 18 + + Environment + + + Paperless-ngx Version + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 22 + + Paperless-ngx Version + + + Install Type + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 35 + + Install Type + + + Server OS + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 37 + + Server OS + + + Media Storage + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 39 + + Media Storage + + + available + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 42 + + available + + + total + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 42 + + total + + + Database + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 52 + + Database + + + Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 58 + + + src/app/components/common/toast/toast.component.html + 28 + + + src/app/components/manage/mail/mail.component.html + 114 + + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 35 + + + src/app/components/manage/workflows/workflows.component.html + 19 + + Status + + + Migration Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 76 + + Migration Status + + + Up to date + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 80 + + Up to date + + + Latest Migration + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 85 + + Latest Migration + + + Pending Migrations + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 87 + + Pending Migrations + + + Tasks Queue + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 105 + + Tasks Queue + + + Redis Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 109 + + Redis Status + + + Celery Status + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 127 + + Celery Status + + + Health + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 153 + + Health + + + Search Index + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 157 + + Search Index + + + Run Task + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 177 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 211 + + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 245 + + Run Task + + + Last Updated + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 184 + + Last Updated + + + Classifier + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 189 + + Classifier + + + Last Trained + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 218 + + Last Trained + + + Sanity Checker + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 223 + + Sanity Checker + + + Last Run + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 252 + + Last Run + + + WebSocket Connection + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 257 + + WebSocket Connection + + + OK + + src/app/components/common/system-status-dialog/system-status-dialog.component.html + 261 + + OK + + + Copy Raw Error + + src/app/components/common/toast/toast.component.html + 43 + + Copy Raw Error + + + Hint: saved views can be created from the documents list + + src/app/components/dashboard/dashboard.component.html + 42 + + Hint: saved views can be created from the documents list + + + Hello , welcome to + + src/app/components/dashboard/dashboard.component.ts + 61 + + Hello , welcome to + + + Welcome to + + src/app/components/dashboard/dashboard.component.ts + 63 + + Welcome to + + + Dashboard updated + + src/app/components/dashboard/dashboard.component.ts + 94 + + Dashboard updated + + + Error updating dashboard + + src/app/components/dashboard/dashboard.component.ts + 97 + + Error updating dashboard + + + Show all + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 10 + + Show all + + + Filter by correspondent + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 54 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 25 + + + src/app/components/document-list/document-list.component.html + 323 + + Filter by correspondent + + + Filter by document type + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 64 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 96 + + + src/app/components/document-list/document-list.component.html + 363 + + Filter by document type + + + Filter by storage path + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 69 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 102 + + + src/app/components/document-list/document-list.component.html + 370 + + Filter by storage path + + + Filter by owner + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 74 + + Filter by owner + + + Yes + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 84 + + + src/app/components/document-list/document-list.component.html + 391 + + Yes + + + No + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 84 + + + src/app/components/document-list/document-list.component.html + 391 + + No + + + No documents + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 149 + + No documents + + + Statistics + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 1 + + Statistics + + + Go to inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 28 + + Go to inbox + + + Documents in inbox + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 29 + + Documents in inbox + + + Go to documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 33 + + Go to documents + + + Total documents + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 34 + + Total documents + + + Total characters + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 38 + + Total characters + + + Current ASN + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html + 43 + + Current ASN + + + Other + + src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.ts + 79 + + Other + + + Upload documents + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 6 + + Upload documents + + + or drop files anywhere + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 7 + + or drop files anywhere + + + Dismiss completed + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html + 23 + + This button dismisses all status messages about processed documents on the dashboard (failed and successful) + Dismiss completed + + + Processing: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 57 + + Processing: + + + Failed: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 60 + + Failed: + + + Added: + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 63 + + Added: + + + , + + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.ts + 66 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 386 + + this string is used to separate processing, failed and added on the file upload widget + , + + + Paperless-ngx is running! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 2 + + Paperless-ngx is running! + + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 3 + + You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 4 + + More detail on how to use and configure Paperless-ngx is always available in the documentation. + + + Thanks for being a part of the Paperless-ngx community! + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 7 + + Thanks for being a part of the Paperless-ngx community! + + + Start the tour + + src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html + 8 + + Start the tour + + + Searching document with asn + + src/app/components/document-asn/document-asn.component.html + 1 + + Searching document with asn + + + Page + + src/app/components/document-detail/document-detail.component.html + 5 + + + src/app/components/document-list/document-list.component.html + 27 + + Page + + + of + + src/app/components/document-detail/document-detail.component.html + 7,8 + + of + + + - + + src/app/components/document-detail/document-detail.component.html + 11 + + - + + + + + + src/app/components/document-detail/document-detail.component.html + 19 + + + + + + Download original + + src/app/components/document-detail/document-detail.component.html + 41 + + Download original + + + Reprocess + + src/app/components/document-detail/document-detail.component.html + 54 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 91 + + Reprocess + + + Print + + src/app/components/document-detail/document-detail.component.html + 58 + + Print + + + More like this + + src/app/components/document-detail/document-detail.component.html + 62 + + + src/app/components/document-list/document-card-large/document-card-large.component.html + 69 + + More like this + + + PDF Editor + + src/app/components/document-detail/document-detail.component.html + 66 + + + src/app/components/document-detail/document-detail.component.ts + 1392 + + PDF Editor + + + Send + + src/app/components/document-detail/document-detail.component.html + 84 + + Send + + + Previous + + src/app/components/document-detail/document-detail.component.html + 110 + + Previous + + + Details + + src/app/components/document-detail/document-detail.component.html + 123 + + Details + + + Title + + src/app/components/document-detail/document-detail.component.html + 126 + + + src/app/components/document-list/document-list.component.html + 221 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 195 + + + src/app/data/document.ts + 30 + + + src/app/data/document.ts + 90 + + Title + + + Archive serial number + + src/app/components/document-detail/document-detail.component.html + 127 + + Archive serial number + + + Date created + + src/app/components/document-detail/document-detail.component.html + 128 + + Date created + + + Correspondent + + src/app/components/document-detail/document-detail.component.html + 130 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 19 + + + src/app/components/document-list/document-list.component.html + 211 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 50 + + + src/app/data/document.ts + 46 + + + src/app/data/document.ts + 89 + + Correspondent + + + Document type + + src/app/components/document-detail/document-detail.component.html + 132 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 33 + + + src/app/components/document-list/document-list.component.html + 251 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 61 + + + src/app/data/document.ts + 50 + + + src/app/data/document.ts + 91 + + Document type + + + Storage path + + src/app/components/document-detail/document-detail.component.html + 134 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 47 + + + src/app/components/document-list/document-list.component.html + 260 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 72 + + + src/app/data/document.ts + 54 + + Storage path + + + Default + + src/app/components/document-detail/document-detail.component.html + 135 + + + src/app/components/manage/saved-views/saved-views.component.html + 52 + + Default + + + Content + + src/app/components/document-detail/document-detail.component.html + 239 + + Content + + + Metadata + + src/app/components/document-detail/document-detail.component.html + 248 + + + src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts + 20 + + Metadata + + + Date modified + + src/app/components/document-detail/document-detail.component.html + 255 + + Date modified + + + Date added + + src/app/components/document-detail/document-detail.component.html + 259 + + Date added + + + Media filename + + src/app/components/document-detail/document-detail.component.html + 263 + + Media filename + + + Original filename + + src/app/components/document-detail/document-detail.component.html + 267 + + Original filename + + + Original MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 271 + + Original MD5 checksum + + + Original file size + + src/app/components/document-detail/document-detail.component.html + 275 + + Original file size + + + Original mime type + + src/app/components/document-detail/document-detail.component.html + 279 + + Original mime type + + + Archive MD5 checksum + + src/app/components/document-detail/document-detail.component.html + 284 + + Archive MD5 checksum + + + Archive file size + + src/app/components/document-detail/document-detail.component.html + 290 + + Archive file size + + + Original document metadata + + src/app/components/document-detail/document-detail.component.html + 299 + + Original document metadata + + + Archived document metadata + + src/app/components/document-detail/document-detail.component.html + 302 + + Archived document metadata + + + Notes + + src/app/components/document-detail/document-detail.component.html + 321,324 + + Notes + + + History + + src/app/components/document-detail/document-detail.component.html + 332 + + History + + + Save & next + + src/app/components/document-detail/document-detail.component.html + 369 + + Save & next + + + Save & close + + src/app/components/document-detail/document-detail.component.html + 372 + + Save & close + + + Document loading... + + src/app/components/document-detail/document-detail.component.html + 382 + + Document loading... + + + Enter Password + + src/app/components/document-detail/document-detail.component.html + 436 + + Enter Password + + + An error occurred loading content: + + src/app/components/document-detail/document-detail.component.ts + 416,418 + + An error occurred loading content: + + + Document changes detected + + src/app/components/document-detail/document-detail.component.ts + 450 + + Document changes detected + + + The version of this document in your browser session appears older than the existing version. + + src/app/components/document-detail/document-detail.component.ts + 451 + + The version of this document in your browser session appears older than the existing version. + + + Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + + src/app/components/document-detail/document-detail.component.ts + 452 + + Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + + + Ok + + src/app/components/document-detail/document-detail.component.ts + 454 + + Ok + + + Next document + + src/app/components/document-detail/document-detail.component.ts + 580 + + Next document + + + Previous document + + src/app/components/document-detail/document-detail.component.ts + 590 + + Previous document + + + Close document + + src/app/components/document-detail/document-detail.component.ts + 598 + + + src/app/services/open-documents.service.ts + 130 + + Close document + + + Save document + + src/app/components/document-detail/document-detail.component.ts + 605 + + Save document + + + Save and close / next + + src/app/components/document-detail/document-detail.component.ts + 614 + + Save and close / next + + + Error retrieving metadata + + src/app/components/document-detail/document-detail.component.ts + 669 + + Error retrieving metadata + + + Error retrieving suggestions. + + src/app/components/document-detail/document-detail.component.ts + 698 + + Error retrieving suggestions. + + + Document "" saved successfully. + + src/app/components/document-detail/document-detail.component.ts + 870 + + + src/app/components/document-detail/document-detail.component.ts + 894 + + Document "" saved successfully. + + + Error saving document "" + + src/app/components/document-detail/document-detail.component.ts + 900 + + Error saving document "" + + + Error saving document + + src/app/components/document-detail/document-detail.component.ts + 950 + + Error saving document + + + Do you really want to move the document "" to the trash? + + src/app/components/document-detail/document-detail.component.ts + 982 + + Do you really want to move the document "" to the trash? + + + Documents can be restored prior to permanent deletion. + + src/app/components/document-detail/document-detail.component.ts + 983 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 754 + + Documents can be restored prior to permanent deletion. + + + Move to trash + + src/app/components/document-detail/document-detail.component.ts + 985 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 756 + + Move to trash + + + Error deleting document + + src/app/components/document-detail/document-detail.component.ts + 1004 + + Error deleting document + + + Reprocess confirm + + src/app/components/document-detail/document-detail.component.ts + 1024 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 794 + + Reprocess confirm + + + This operation will permanently recreate the archive file for this document. + + src/app/components/document-detail/document-detail.component.ts + 1025 + + This operation will permanently recreate the archive file for this document. + + + The archive file will be re-generated with the current settings. + + src/app/components/document-detail/document-detail.component.ts + 1026 + + The archive file will be re-generated with the current settings. + + + Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + src/app/components/document-detail/document-detail.component.ts + 1036 + + Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + + + Error executing operation + + src/app/components/document-detail/document-detail.component.ts + 1047 + + Error executing operation + + + Error downloading document + + src/app/components/document-detail/document-detail.component.ts + 1096 + + Error downloading document + + + Page Fit + + src/app/components/document-detail/document-detail.component.ts + 1173 + + Page Fit + + + PDF edit operation for "" will begin in the background. + + src/app/components/document-detail/document-detail.component.ts + 1411 + + PDF edit operation for "" will begin in the background. + + + Error executing PDF edit operation + + src/app/components/document-detail/document-detail.component.ts + 1423 + + Error executing PDF edit operation + + + Print failed. + + src/app/components/document-detail/document-detail.component.ts + 1460 + + Print failed. + + + Error loading document for printing. + + src/app/components/document-detail/document-detail.component.ts + 1472 + + Error loading document for printing. + + + An error occurred loading tiff: + + src/app/components/document-detail/document-detail.component.ts + 1537 + + + src/app/components/document-detail/document-detail.component.ts + 1541 + + An error occurred loading tiff: + + + No entries found. + + src/app/components/document-history/document-history.component.html + 10 + + No entries found. + + + Edit: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 3 + + Edit: + + + Filter tags + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 6 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 40 + + Filter tags + + + Filter correspondents + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 20 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 51 + + Filter correspondents + + + Filter document types + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 34 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 62 + + Filter document types + + + Filter storage paths + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 48 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 73 + + Filter storage paths + + + Custom fields + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 61 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 84 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 203 + + Custom fields + + + Filter custom fields + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 62 + + Filter custom fields + + + Set values + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 70 + + Set values + + + Rotate + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 94 + + Rotate + + + Merge + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 97 + + Merge + + + Include: + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 123 + + Include: + + + Archived files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 127 + + Archived files + + + Original files + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 131 + + Original files + + + Use formatted filename + + src/app/components/document-list/bulk-editor/bulk-editor.component.html + 136 + + Use formatted filename + + + Error executing bulk operation + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 290 + + Error executing bulk operation + + + "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 378 + + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 384 + + "" + + + "" and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 380 + + This is for messages like 'modify "tag1" and "tag2"' + "" and "" + + + and "" + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 388,390 + + this is for messages like 'modify "tag1", "tag2" and "tag3"' + and "" + + + Confirm tags assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 405 + + Confirm tags assignment + + + This operation will add the tag "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 411 + + This operation will add the tag "" to selected document(s). + + + This operation will add the tags to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 416,418 + + This operation will add the tags to selected document(s). + + + This operation will remove the tag "" from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 424 + + This operation will remove the tag "" from selected document(s). + + + This operation will remove the tags from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 429,431 + + This operation will remove the tags from selected document(s). + + + This operation will add the tags and remove the tags on selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 433,437 + + This operation will add the tags and remove the tags on selected document(s). + + + Confirm correspondent assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 474 + + Confirm correspondent assignment + + + This operation will assign the correspondent "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 476 + + This operation will assign the correspondent "" to selected document(s). + + + This operation will remove the correspondent from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 478 + + This operation will remove the correspondent from selected document(s). + + + Confirm document type assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 512 + + Confirm document type assignment + + + This operation will assign the document type "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 514 + + This operation will assign the document type "" to selected document(s). + + + This operation will remove the document type from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 516 + + This operation will remove the document type from selected document(s). + + + Confirm storage path assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 550 + + Confirm storage path assignment + + + This operation will assign the storage path "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 552 + + This operation will assign the storage path "" to selected document(s). + + + This operation will remove the storage path from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 554 + + This operation will remove the storage path from selected document(s). + + + Confirm custom field assignment + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 583 + + Confirm custom field assignment + + + This operation will assign the custom field "" to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 589 + + This operation will assign the custom field "" to selected document(s). + + + This operation will assign the custom fields to selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 594,596 + + This operation will assign the custom fields to selected document(s). + + + This operation will remove the custom field "" from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 602 + + This operation will remove the custom field "" from selected document(s). + + + This operation will remove the custom fields from selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 607,609 + + This operation will remove the custom fields from selected document(s). + + + This operation will assign the custom fields and remove the custom fields on selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 611,615 + + This operation will assign the custom fields and remove the custom fields on selected document(s). + + + Move selected document(s) to the trash? + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 753 + + Move selected document(s) to the trash? + + + This operation will permanently recreate the archive files for selected document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 795 + + This operation will permanently recreate the archive files for selected document(s). + + + The archive files will be re-generated with the current settings. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 796 + + The archive files will be re-generated with the current settings. + + + Rotate confirm + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 828 + + Rotate confirm + + + This operation will permanently rotate the original version of document(s). + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 829 + + This operation will permanently rotate the original version of document(s). + + + Merge confirm + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 848 + + Merge confirm + + + This operation will merge selected documents into a new document. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 849 + + This operation will merge selected documents into a new document. + + + Merged document will be queued for consumption. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 868 + + Merged document will be queued for consumption. + + + Custom fields updated. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 892 + + Custom fields updated. + + + Error updating custom fields. + + src/app/components/document-list/bulk-editor/bulk-editor.component.ts + 901 + + Error updating custom fields. + + + {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 3,7 + + {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} + + + Select custom fields + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 13 + + Select custom fields + + + {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also + remove custom fields from the selected documents.}} + + src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html + 73,78 + + {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also + remove custom fields from the selected documents.}} + + + Filter by tag + + src/app/components/document-list/document-card-large/document-card-large.component.html + 36 + + + src/app/components/document-list/document-list.component.html + 339 + + Filter by tag + + + View notes + + src/app/components/document-list/document-card-large/document-card-large.component.html + 91 + + View notes + + + Created: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 115,116 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 76,77 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 91,92 + + Created: + + + Added: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 116,117 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 77,78 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 92,93 + + Added: + + + Modified: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 117,118 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 78,79 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 93,94 + + Modified: + + + {VAR_PLURAL, plural, =1 {1 page} other { pages}} + + src/app/components/document-list/document-card-large/document-card-large.component.html + 134 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 106 + + {VAR_PLURAL, plural, =1 {1 page} other { pages}} + + + Shared + + src/app/components/document-list/document-card-large/document-card-large.component.html + 144 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 125 + + + src/app/data/document.ts + 66 + + + src/app/pipes/username.pipe.ts + 35 + + Shared + + + Score: + + src/app/components/document-list/document-card-large/document-card-large.component.html + 149 + + Score: + + + Toggle tag filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 20 + + Toggle tag filter + + + Toggle correspondent filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 43 + + Toggle correspondent filter + + + Toggle document type filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 59 + + Toggle document type filter + + + Toggle storage path filter + + src/app/components/document-list/document-card-small/document-card-small.component.html + 66 + + Toggle storage path filter + + + Select + + src/app/components/document-list/document-list.component.html + 5 + + + src/app/data/custom-field.ts + 51 + + Select + + + Select none + + src/app/components/document-list/document-list.component.html + 11 + + Select none + + + Select page + + src/app/components/document-list/document-list.component.html + 12 + + + src/app/components/document-list/document-list.component.ts + 315 + + Select page + + + Select all + + src/app/components/document-list/document-list.component.html + 13 + + + src/app/components/document-list/document-list.component.ts + 308 + + Select all + + + Select: + + src/app/components/document-list/document-list.component.html + 18 + + Select: + + + None + + src/app/components/document-list/document-list.component.html + 23 + + + src/app/components/manage/management-list/management-list.component.ts + 124 + + + src/app/data/matching-model.ts + 45 + + None + + + Sort + + src/app/components/document-list/document-list.component.html + 68 + + Sort + + + Views + + src/app/components/document-list/document-list.component.html + 94 + + Views + + + Save "" + + src/app/components/document-list/document-list.component.html + 113 + + Save "" + + + Save as... + + src/app/components/document-list/document-list.component.html + 116 + + Save as... + + + All saved views + + src/app/components/document-list/document-list.component.html + 117 + + All saved views + + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + src/app/components/document-list/document-list.component.html + 137 + + {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} + + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + src/app/components/document-list/document-list.component.html + 141 + + {VAR_PLURAL, plural, =1 {One document} other { documents}} + + + (filtered) + + src/app/components/document-list/document-list.component.html + 143 + + (filtered) + + + Reset filters + + src/app/components/document-list/document-list.component.html + 148 + + + src/app/components/document-list/filter-editor/filter-editor.component.html + 107 + + Reset filters + + + Error while loading documents + + src/app/components/document-list/document-list.component.html + 169 + + Error while loading documents + + + Sort by ASN + + src/app/components/document-list/document-list.component.html + 198 + + Sort by ASN + + + ASN + + src/app/components/document-list/document-list.component.html + 202 + + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 200 + + + src/app/data/document.ts + 70 + + + src/app/data/document.ts + 88 + + ASN + + + Sort by correspondent + + src/app/components/document-list/document-list.component.html + 207 + + Sort by correspondent + + + Sort by title + + src/app/components/document-list/document-list.component.html + 216 + + Sort by title + + + Sort by owner + + src/app/components/document-list/document-list.component.html + 229 + + Sort by owner + + + Owner + + src/app/components/document-list/document-list.component.html + 233 + + + src/app/data/document.ts + 62 + + + src/app/data/document.ts + 96 + + Owner + + + Sort by notes + + src/app/components/document-list/document-list.component.html + 238 + + Sort by notes + + + Sort by document type + + src/app/components/document-list/document-list.component.html + 247 + + Sort by document type + + + Sort by storage path + + src/app/components/document-list/document-list.component.html + 256 + + Sort by storage path + + + Sort by created date + + src/app/components/document-list/document-list.component.html + 265 + + Sort by created date + + + Sort by added date + + src/app/components/document-list/document-list.component.html + 274 + + Sort by added date + + + Sort by number of pages + + src/app/components/document-list/document-list.component.html + 283 + + Sort by number of pages + + + Pages + + src/app/components/document-list/document-list.component.html + 287 + + + src/app/data/document.ts + 74 + + + src/app/data/document.ts + 97 + + + src/app/data/paperless-config.ts + 91 + + Pages + + + Shared + + src/app/components/document-list/document-list.component.html + 290,292 + + Shared + + + Sort by + + src/app/components/document-list/document-list.component.html + 297,298 + + Sort by + + + Edit document + + src/app/components/document-list/document-list.component.html + 331 + + Edit document + + + Preview document + + src/app/components/document-list/document-list.component.html + 332 + + Preview document + + + Reset filters / selection + + src/app/components/document-list/document-list.component.ts + 296 + + Reset filters / selection + + + Open first [selected] document + + src/app/components/document-list/document-list.component.ts + 324 + + Open first [selected] document + + + Previous page + + src/app/components/document-list/document-list.component.ts + 340 + + Previous page + + + Next page + + src/app/components/document-list/document-list.component.ts + 352 + + Next page + + + View "" saved successfully. + + src/app/components/document-list/document-list.component.ts + 385 + + View "" saved successfully. + + + Failed to save view "". + + src/app/components/document-list/document-list.component.ts + 391 + + Failed to save view "". + + + View "" created successfully. + + src/app/components/document-list/document-list.component.ts + 437 + + View "" created successfully. + + + Dates + + src/app/components/document-list/filter-editor/filter-editor.component.html + 90 + + Dates + + + Title & content + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 198 + + Title & content + + + File type + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 205 + + File type + + + More like + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 214 + + More like + + + equals + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 220 + + equals + + + is empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 224 + + is empty + + + is not empty + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 228 + + is not empty + + + greater than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 232 + + greater than + + + less than + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 236 + + less than + + + Correspondent: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 277,281 + + Correspondent: + + + Without correspondent + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 283 + + Without correspondent + + + Document type: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 289,293 + + Document type: + + + Without document type + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 295 + + Without document type + + + Storage path: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 301,305 + + Storage path: + + + Without storage path + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 307 + + Without storage path + + + Tag: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 311,313 + + Tag: + + + Without any tag + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 317 + + Without any tag + + + Custom fields query + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 321 + + Custom fields query + + + Title: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 324 + + Title: + + + ASN: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 327 + + ASN: + + + Owner: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 330 + + Owner: + + + Owner not in: + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 333 + + Owner not in: + + + Without an owner + + src/app/components/document-list/filter-editor/filter-editor.component.ts + 336 + + Without an owner + + + Save current view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 3 + + Save current view + + + Show in sidebar + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 9 + + + src/app/components/manage/saved-views/saved-views.component.html + 24 + + Show in sidebar + + + Show on dashboard + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 10 + + + src/app/components/manage/saved-views/saved-views.component.html + 20 + + Show on dashboard + + + Filter rules error occurred while saving this view + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 13 + + Filter rules error occurred while saving this view + + + The error returned was + + src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html + 14 + + The error returned was + + + Enter note + + src/app/components/document-notes/document-notes.component.html + 5 + + Enter note + + + Please enter a note. + + src/app/components/document-notes/document-notes.component.html + 6,8 + + Please enter a note. + + + Add note + + src/app/components/document-notes/document-notes.component.html + 14 + + Add note + + + Delete note + + src/app/components/document-notes/document-notes.component.html + 25 + + + src/app/components/document-notes/document-notes.component.html + 27 + + Delete note + + + Error saving note + + src/app/components/document-notes/document-notes.component.ts + 81 + + Error saving note + + + Error deleting note + + src/app/components/document-notes/document-notes.component.ts + 95 + + Error deleting note + + + Drop files to begin upload + + src/app/components/file-drop/file-drop.component.html + 6 + + Drop files to begin upload + + + Initiating upload... + + src/app/components/file-drop/file-drop.component.ts + 137 + + + src/app/components/file-drop/file-drop.component.ts + 146 + + Initiating upload... + + + Failed to read dropped items: + + src/app/components/file-drop/file-drop.component.ts + 142 + + Failed to read dropped items: + + + correspondent + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 47 + + correspondent + + + correspondents + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 48 + + correspondents + + + Last used + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 53 + + Last used + + + Do you really want to delete the correspondent ""? + + src/app/components/manage/correspondent-list/correspondent-list.component.ts + 78 + + Do you really want to delete the correspondent ""? + + + Customize the data fields that can be attached to documents. + + src/app/components/manage/custom-fields/custom-fields.component.html + 4 + + Customize the data fields that can be attached to documents. + + + Add Field + + src/app/components/manage/custom-fields/custom-fields.component.html + 9 + + Add Field + + + Data Type + + src/app/components/manage/custom-fields/custom-fields.component.html + 18 + + Data Type + + + Filter Documents () + + src/app/components/manage/custom-fields/custom-fields.component.html + 45 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + + src/app/components/manage/management-list/management-list.component.html + 123 + + Filter Documents () + + + No fields defined. + + src/app/components/manage/custom-fields/custom-fields.component.html + 70 + + No fields defined. + + + Confirm delete field + + src/app/components/manage/custom-fields/custom-fields.component.ts + 102 + + Confirm delete field + + + This operation will permanently delete this field. + + src/app/components/manage/custom-fields/custom-fields.component.ts + 103 + + This operation will permanently delete this field. + + + Deleted field "" + + src/app/components/manage/custom-fields/custom-fields.component.ts + 112 + + Deleted field "" + + + Error deleting field "". + + src/app/components/manage/custom-fields/custom-fields.component.ts + 121 + + Error deleting field "". + + + document type + + src/app/components/manage/document-type-list/document-type-list.component.ts + 43 + + document type + + + document types + + src/app/components/manage/document-type-list/document-type-list.component.ts + 44 + + document types + + + Do you really want to delete the document type ""? + + src/app/components/manage/document-type-list/document-type-list.component.ts + 49 + + Do you really want to delete the document type ""? + + + Mail Settings + + src/app/components/manage/mail/mail.component.html + 2 + + Mail Settings + + + Mail accounts + + src/app/components/manage/mail/mail.component.html + 12 + + Mail accounts + + + Add Account + + src/app/components/manage/mail/mail.component.html + 14 + + Add Account + + + Connect Gmail Account + + src/app/components/manage/mail/mail.component.html + 18 + + Connect Gmail Account + + + Connect Outlook Account + + src/app/components/manage/mail/mail.component.html + 23 + + Connect Outlook Account + + + Server + + src/app/components/manage/mail/mail.component.html + 31 + + Server + + + Process Mail + + src/app/components/manage/mail/mail.component.html + 68 + + + src/app/components/manage/mail/mail.component.html + 86 + + Process Mail + + + No mail accounts defined. + + src/app/components/manage/mail/mail.component.html + 95 + + No mail accounts defined. + + + Mail rules + + src/app/components/manage/mail/mail.component.html + 103 + + Mail rules + + + Add Rule + + src/app/components/manage/mail/mail.component.html + 105 + + Add Rule + + + Sort Order + + src/app/components/manage/mail/mail.component.html + 112 + + Sort Order + + + Disabled + + src/app/components/manage/mail/mail.component.html + 137 + + + src/app/components/manage/workflows/workflows.component.html + 41 + + Disabled + + + View Processed Mail + + src/app/components/manage/mail/mail.component.html + 143 + + View Processed Mail + + + No mail rules defined. + + src/app/components/manage/mail/mail.component.html + 183 + + No mail rules defined. + + + Error retrieving mail accounts + + src/app/components/manage/mail/mail.component.ts + 105 + + Error retrieving mail accounts + + + Error retrieving mail rules + + src/app/components/manage/mail/mail.component.ts + 127 + + Error retrieving mail rules + + + OAuth2 authentication success + + src/app/components/manage/mail/mail.component.ts + 135 + + OAuth2 authentication success + + + OAuth2 authentication failed, see logs for details + + src/app/components/manage/mail/mail.component.ts + 146 + + OAuth2 authentication failed, see logs for details + + + Saved account "". + + src/app/components/manage/mail/mail.component.ts + 170 + + Saved account "". + + + Error saving account. + + src/app/components/manage/mail/mail.component.ts + 182 + + Error saving account. + + + Confirm delete mail account + + src/app/components/manage/mail/mail.component.ts + 190 + + Confirm delete mail account + + + This operation will permanently delete this mail account. + + src/app/components/manage/mail/mail.component.ts + 191 + + This operation will permanently delete this mail account. + + + Deleted mail account "" + + src/app/components/manage/mail/mail.component.ts + 201 + + Deleted mail account "" + + + Error deleting mail account "". + + src/app/components/manage/mail/mail.component.ts + 212 + + Error deleting mail account "". + + + Processing mail account "" + + src/app/components/manage/mail/mail.component.ts + 224 + + Processing mail account "" + + + Error processing mail account "" + + src/app/components/manage/mail/mail.component.ts + 229 + + Error processing mail account "" + + + Saved rule "". + + src/app/components/manage/mail/mail.component.ts + 247 + + Saved rule "". + + + Error saving rule. + + src/app/components/manage/mail/mail.component.ts + 258 + + Error saving rule. + + + Rule "" enabled. + + src/app/components/manage/mail/mail.component.ts + 274 + + Rule "" enabled. + + + Rule "" disabled. + + src/app/components/manage/mail/mail.component.ts + 275 + + Rule "" disabled. + + + Error toggling rule "". + + src/app/components/manage/mail/mail.component.ts + 280 + + Error toggling rule "". + + + Confirm delete mail rule + + src/app/components/manage/mail/mail.component.ts + 291 + + Confirm delete mail rule + + + This operation will permanently delete this mail rule. + + src/app/components/manage/mail/mail.component.ts + 292 + + This operation will permanently delete this mail rule. + + + Deleted mail rule "" + + src/app/components/manage/mail/mail.component.ts + 302 + + Deleted mail rule "" + + + Error deleting mail rule "". + + src/app/components/manage/mail/mail.component.ts + 313 + + Error deleting mail rule "". + + + Permissions updated + + src/app/components/manage/mail/mail.component.ts + 337 + + Permissions updated + + + Error updating permissions + + src/app/components/manage/mail/mail.component.ts + 342 + + + src/app/components/manage/management-list/management-list.component.ts + 353 + + Error updating permissions + + + Processed Mail for + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 2 + + Processed Mail for + + + No processed email messages found. + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 20 + + No processed email messages found. + + + Received + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 33 + + Received + + + Processed + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html + 34 + + Processed + + + Processed mail(s) deleted + + src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.ts + 72 + + Processed mail(s) deleted + + + Filter by: + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + + src/app/components/manage/management-list/management-list.component.html + 20 + + Filter by: + + + Matching + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + + src/app/components/manage/management-list/management-list.component.html + 39 + + Matching + + + Document count + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + + src/app/components/manage/management-list/management-list.component.html + 40 + + Document count + + + {VAR_PLURAL, plural, =1 {One } other { total }} + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + + src/app/components/manage/management-list/management-list.component.html + 67 + + {VAR_PLURAL, plural, =1 {One } other { total }} + + + Automatic + + src/app/components/manage/management-list/management-list.component.ts + 122 + + + src/app/data/matching-model.ts + 15 + + Automatic + + + Successfully created . + + src/app/components/manage/management-list/management-list.component.ts + 200 + + Successfully created . + + + Error occurred while creating . + + src/app/components/manage/management-list/management-list.component.ts + 205 + + Error occurred while creating . + + + Successfully updated "". + + src/app/components/manage/management-list/management-list.component.ts + 220 + + Successfully updated "". + + + Error occurred while saving . + + src/app/components/manage/management-list/management-list.component.ts + 225 + + Error occurred while saving . + + + Associated documents will not be deleted. + + src/app/components/manage/management-list/management-list.component.ts + 245 + + Associated documents will not be deleted. + + + Error while deleting element + + src/app/components/manage/management-list/management-list.component.ts + 261 + + Error while deleting element + + + Permissions updated successfully + + src/app/components/manage/management-list/management-list.component.ts + 346 + + Permissions updated successfully + + + This operation will permanently delete all objects. + + src/app/components/manage/management-list/management-list.component.ts + 367 + + This operation will permanently delete all objects. + + + Objects deleted successfully + + src/app/components/manage/management-list/management-list.component.ts + 381 + + Objects deleted successfully + + + Error deleting objects + + src/app/components/manage/management-list/management-list.component.ts + 387 + + Error deleting objects + + + Customize the views of your documents. + + src/app/components/manage/saved-views/saved-views.component.html + 4 + + Customize the views of your documents. + + + Documents page size + + src/app/components/manage/saved-views/saved-views.component.html + 41 + + Documents page size + + + Display as + + src/app/components/manage/saved-views/saved-views.component.html + 44 + + Display as + + + Table + + src/app/components/manage/saved-views/saved-views.component.html + 46 + + Table + + + Small Cards + + src/app/components/manage/saved-views/saved-views.component.html + 47 + + Small Cards + + + Large Cards + + src/app/components/manage/saved-views/saved-views.component.html + 48 + + Large Cards + + + No saved views defined. + + src/app/components/manage/saved-views/saved-views.component.html + 61 + + No saved views defined. + + + Saved view "" deleted. + + src/app/components/manage/saved-views/saved-views.component.ts + 133 + + Saved view "" deleted. + + + Views saved successfully. + + src/app/components/manage/saved-views/saved-views.component.ts + 158 + + Views saved successfully. + + + Error while saving views. + + src/app/components/manage/saved-views/saved-views.component.ts + 163 + + Error while saving views. + + + storage path + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 43 + + storage path + + + storage paths + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 44 + + storage paths + + + Do you really want to delete the storage path ""? + + src/app/components/manage/storage-path-list/storage-path-list.component.ts + 60 + + Do you really want to delete the storage path ""? + + + tag + + src/app/components/manage/tag-list/tag-list.component.ts + 43 + + tag + + + tags + + src/app/components/manage/tag-list/tag-list.component.ts + 44 + + tags + + + Do you really want to delete the tag ""? + + src/app/components/manage/tag-list/tag-list.component.ts + 60 + + Do you really want to delete the tag ""? + + + Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. + + src/app/components/manage/workflows/workflows.component.html + 4 + + Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. + + + Add Workflow + + src/app/components/manage/workflows/workflows.component.html + 9 + + Add Workflow + + + No workflows defined. + + src/app/components/manage/workflows/workflows.component.html + 80 + + No workflows defined. + + + Saved workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 90 + + Saved workflow "". + + + Error saving workflow. + + src/app/components/manage/workflows/workflows.component.ts + 98 + + Error saving workflow. + + + Confirm delete workflow + + src/app/components/manage/workflows/workflows.component.ts + 131 + + Confirm delete workflow + + + This operation will permanently delete this workflow. + + src/app/components/manage/workflows/workflows.component.ts + 132 + + This operation will permanently delete this workflow. + + + Deleted workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 142 + + Deleted workflow "". + + + Error deleting workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 149 + + Error deleting workflow "". + + + Enabled workflow "" + + src/app/components/manage/workflows/workflows.component.ts + 162 + + Enabled workflow "" + + + Disabled workflow "" + + src/app/components/manage/workflows/workflows.component.ts + 163 + + Disabled workflow "" + + + Error toggling workflow "". + + src/app/components/manage/workflows/workflows.component.ts + 170 + + Error toggling workflow "". + + + Not Found + + src/app/components/not-found/not-found.component.html + 6 + + Not Found + + + Go to Dashboard + + src/app/components/not-found/not-found.component.html + 9 + + Go to Dashboard + + + Equal to + + src/app/data/custom-field-query.ts + 24 + + Equal to + + + In + + src/app/data/custom-field-query.ts + 25 + + In + + + Is null + + src/app/data/custom-field-query.ts + 26 + + Is null + + + Exists + + src/app/data/custom-field-query.ts + 27 + + Exists + + + Contains + + src/app/data/custom-field-query.ts + 28 + + Contains + + + Contains (case-insensitive) + + src/app/data/custom-field-query.ts + 29 + + Contains (case-insensitive) + + + Greater than + + src/app/data/custom-field-query.ts + 30 + + Greater than + + + Greater than or equal to + + src/app/data/custom-field-query.ts + 31 + + Greater than or equal to + + + Less than + + src/app/data/custom-field-query.ts + 32 + + Less than + + + Less than or equal to + + src/app/data/custom-field-query.ts + 33 + + Less than or equal to + + + Range + + src/app/data/custom-field-query.ts + 34 + + Range + + + Boolean + + src/app/data/custom-field.ts + 19 + + Boolean + + + Date + + src/app/data/custom-field.ts + 23 + + Date + + + Integer + + src/app/data/custom-field.ts + 27 + + Integer + + + Number + + src/app/data/custom-field.ts + 31 + + Number + + + Monetary + + src/app/data/custom-field.ts + 35 + + Monetary + + + Text + + src/app/data/custom-field.ts + 39 + + Text + + + Url + + src/app/data/custom-field.ts + 43 + + Url + + + Document Link + + src/app/data/custom-field.ts + 47 + + Document Link + + + Long Text + + src/app/data/custom-field.ts + 55 + + Long Text + + + Search score + + src/app/data/document.ts + 103 + + Score is a value returned by the full text search engine and specifies how well a result matches the given query + Search score + + + Auto: Learn matching automatically + + src/app/data/matching-model.ts + 16 + + Auto: Learn matching automatically + + + Any word + + src/app/data/matching-model.ts + 20 + + Any word + + + Any: Document contains any of these words (space separated) + + src/app/data/matching-model.ts + 21 + + Any: Document contains any of these words (space separated) + + + All words + + src/app/data/matching-model.ts + 25 + + All words + + + All: Document contains all of these words (space separated) + + src/app/data/matching-model.ts + 26 + + All: Document contains all of these words (space separated) + + + Exact match + + src/app/data/matching-model.ts + 30 + + Exact match + + + Exact: Document contains this string + + src/app/data/matching-model.ts + 31 + + Exact: Document contains this string + + + Regular expression + + src/app/data/matching-model.ts + 35 + + Regular expression + + + Regular expression: Document matches this regular expression + + src/app/data/matching-model.ts + 36 + + Regular expression: Document matches this regular expression + + + Fuzzy word + + src/app/data/matching-model.ts + 40 + + Fuzzy word + + + Fuzzy: Document contains a word similar to this word + + src/app/data/matching-model.ts + 41 + + Fuzzy: Document contains a word similar to this word + + + None: Disable matching + + src/app/data/matching-model.ts + 46 + + None: Disable matching + + + General Settings + + src/app/data/paperless-config.ts + 50 + + General Settings + + + OCR Settings + + src/app/data/paperless-config.ts + 51 + + OCR Settings + + + Barcode Settings + + src/app/data/paperless-config.ts + 52 + + Barcode Settings + + + Output Type + + src/app/data/paperless-config.ts + 76 + + Output Type + + + Language + + src/app/data/paperless-config.ts + 84 + + Language + + + Mode + + src/app/data/paperless-config.ts + 98 + + Mode + + + Skip Archive File + + src/app/data/paperless-config.ts + 106 + + Skip Archive File + + + Image DPI + + src/app/data/paperless-config.ts + 114 + + Image DPI + + + Clean + + src/app/data/paperless-config.ts + 121 + + Clean + + + Deskew + + src/app/data/paperless-config.ts + 129 + + Deskew + + + Rotate Pages + + src/app/data/paperless-config.ts + 136 + + Rotate Pages + + + Rotate Pages Threshold + + src/app/data/paperless-config.ts + 143 + + Rotate Pages Threshold + + + Max Image Pixels + + src/app/data/paperless-config.ts + 150 + + Max Image Pixels + + + Color Conversion Strategy + + src/app/data/paperless-config.ts + 157 + + Color Conversion Strategy + + + OCR Arguments + + src/app/data/paperless-config.ts + 165 + + OCR Arguments + + + Application Logo + + src/app/data/paperless-config.ts + 172 + + Application Logo + + + Application Title + + src/app/data/paperless-config.ts + 179 + + Application Title + + + Enable Barcodes + + src/app/data/paperless-config.ts + 186 + + Enable Barcodes + + + Enable TIFF Support + + src/app/data/paperless-config.ts + 193 + + Enable TIFF Support + + + Barcode String + + src/app/data/paperless-config.ts + 200 + + Barcode String + + + Retain Split Pages + + src/app/data/paperless-config.ts + 207 + + Retain Split Pages + + + Enable ASN + + src/app/data/paperless-config.ts + 214 + + Enable ASN + + + ASN Prefix + + src/app/data/paperless-config.ts + 221 + + ASN Prefix + + + Upscale + + src/app/data/paperless-config.ts + 228 + + Upscale + + + DPI + + src/app/data/paperless-config.ts + 235 + + DPI + + + Max Pages + + src/app/data/paperless-config.ts + 242 + + Max Pages + + + Enable Tag Detection + + src/app/data/paperless-config.ts + 249 + + Enable Tag Detection + + + Tag Mapping + + src/app/data/paperless-config.ts + 256 + + Tag Mapping + + + Warning: You have unsaved changes to your document(s). + + src/app/guards/dirty-doc.guard.ts + 16 + + Warning: You have unsaved changes to your document(s). + + + Unsaved Changes + + src/app/guards/dirty-form.guard.ts + 15 + + + src/app/guards/dirty-saved-view.guard.ts + 27 + + + src/app/services/open-documents.service.ts + 122 + + + src/app/services/open-documents.service.ts + 149 + + Unsaved Changes + + + You have unsaved changes. + + src/app/guards/dirty-form.guard.ts + 16 + + + src/app/services/open-documents.service.ts + 150 + + You have unsaved changes. + + + Are you sure you want to leave? + + src/app/guards/dirty-form.guard.ts + 17 + + Are you sure you want to leave? + + + Leave page + + src/app/guards/dirty-form.guard.ts + 19 + + Leave page + + + You have unsaved changes to the saved view + + src/app/guards/dirty-saved-view.guard.ts + 29 + + You have unsaved changes to the saved view + + + Are you sure you want to close this saved view? + + src/app/guards/dirty-saved-view.guard.ts + 33 + + Are you sure you want to close this saved view? + + + Save and close + + src/app/guards/dirty-saved-view.guard.ts + 37 + + Save and close + + + You don't have permissions to do that + + src/app/guards/permissions.guard.ts + 34 + + You don't have permissions to do that + + + Last year + + src/app/pipes/custom-date.pipe.ts + 14 + + Last year + + + %s years ago + + src/app/pipes/custom-date.pipe.ts + 15 + + %s years ago + + + Last month + + src/app/pipes/custom-date.pipe.ts + 19 + + Last month + + + %s months ago + + src/app/pipes/custom-date.pipe.ts + 20 + + %s months ago + + + Last week + + src/app/pipes/custom-date.pipe.ts + 24 + + Last week + + + %s weeks ago + + src/app/pipes/custom-date.pipe.ts + 25 + + %s weeks ago + + + %s days ago + + src/app/pipes/custom-date.pipe.ts + 30 + + %s days ago + + + %s hour ago + + src/app/pipes/custom-date.pipe.ts + 34 + + %s hour ago + + + %s hours ago + + src/app/pipes/custom-date.pipe.ts + 35 + + %s hours ago + + + %s minute ago + + src/app/pipes/custom-date.pipe.ts + 39 + + %s minute ago + + + %s minutes ago + + src/app/pipes/custom-date.pipe.ts + 40 + + %s minutes ago + + + Just now + + src/app/pipes/custom-date.pipe.ts + 73 + + Just now + + + (no title) + + src/app/pipes/document-title.pipe.ts + 11 + + (no title) + + + You have unsaved changes to the document + + src/app/services/open-documents.service.ts + 124 + + You have unsaved changes to the document + + + Are you sure you want to close this document? + + src/app/services/open-documents.service.ts + 128 + + Are you sure you want to close this document? + + + Are you sure you want to close all documents? + + src/app/services/open-documents.service.ts + 151 + + Are you sure you want to close all documents? + + + Close documents + + src/app/services/open-documents.service.ts + 153 + + Close documents + + + English (US) + + src/app/services/settings.service.ts + 51 + + English (US) + + + Afrikaans + + src/app/services/settings.service.ts + 57 + + Afrikaans + + + Arabic + + src/app/services/settings.service.ts + 63 + + Arabic + + + Belarusian + + src/app/services/settings.service.ts + 69 + + Belarusian + + + Bulgarian + + src/app/services/settings.service.ts + 75 + + Bulgarian + + + Catalan + + src/app/services/settings.service.ts + 81 + + Catalan + + + Czech + + src/app/services/settings.service.ts + 87 + + Czech + + + Danish + + src/app/services/settings.service.ts + 93 + + Danish + + + German + + src/app/services/settings.service.ts + 99 + + German + + + Greek + + src/app/services/settings.service.ts + 105 + + Greek + + + English (GB) + + src/app/services/settings.service.ts + 111 + + English (GB) + + + Spanish + + src/app/services/settings.service.ts + 117 + + Spanish + + + Finnish + + src/app/services/settings.service.ts + 123 + + Finnish + + + French + + src/app/services/settings.service.ts + 129 + + French + + + Hungarian + + src/app/services/settings.service.ts + 135 + + Hungarian + + + Italian + + src/app/services/settings.service.ts + 141 + + Italian + + + Japanese + + src/app/services/settings.service.ts + 147 + + Japanese + + + Korean + + src/app/services/settings.service.ts + 153 + + Korean + + + Luxembourgish + + src/app/services/settings.service.ts + 159 + + Luxembourgish + + + Dutch + + src/app/services/settings.service.ts + 165 + + Dutch + + + Norwegian + + src/app/services/settings.service.ts + 171 + + Norwegian + + + Persian + + src/app/services/settings.service.ts + 177 + + Persian + + + Polish + + src/app/services/settings.service.ts + 183 + + Polish + + + Portuguese (Brazil) + + src/app/services/settings.service.ts + 189 + + Portuguese (Brazil) + + + Portuguese + + src/app/services/settings.service.ts + 195 + + Portuguese + + + Romanian + + src/app/services/settings.service.ts + 201 + + Romanian + + + Russian + + src/app/services/settings.service.ts + 207 + + Russian + + + Slovak + + src/app/services/settings.service.ts + 213 + + Slovak + + + Slovenian + + src/app/services/settings.service.ts + 219 + + Slovenian + + + Serbian + + src/app/services/settings.service.ts + 225 + + Serbian + + + Swedish + + src/app/services/settings.service.ts + 231 + + Swedish + + + Turkish + + src/app/services/settings.service.ts + 237 + + Turkish + + + Ukrainian + + src/app/services/settings.service.ts + 243 + + Ukrainian + + + Vietnamese + + src/app/services/settings.service.ts + 249 + + Vietnamese + + + Chinese Simplified + + src/app/services/settings.service.ts + 255 + + Chinese Simplified + + + Chinese Traditional + + src/app/services/settings.service.ts + 261 + + Chinese Traditional + + + ISO 8601 + + src/app/services/settings.service.ts + 269 + + ISO 8601 + + + Successfully completed one-time migratration of settings to the database! + + src/app/services/settings.service.ts + 603 + + Successfully completed one-time migratration of settings to the database! + + + Unable to migrate settings to the database, please try saving manually. + + src/app/services/settings.service.ts + 604 + + Unable to migrate settings to the database, please try saving manually. + + + You can restart the tour from the settings page. + + src/app/services/settings.service.ts + 677 + + You can restart the tour from the settings page. + + + Connecting... + + src/app/services/upload-documents.service.ts + 25 + + Connecting... + + + Uploading... + + src/app/services/upload-documents.service.ts + 37 + + Uploading... + + + Upload complete, waiting... + + src/app/services/upload-documents.service.ts + 40 + + Upload complete, waiting... + + + HTTP error: + + src/app/services/upload-documents.service.ts + 53 + + HTTP error: + + + Document already exists. + + src/app/services/websocket-status.service.ts + 24 + + Document already exists. + + + Document already exists. Note: existing document is in the trash. + + src/app/services/websocket-status.service.ts + 25 + + Document already exists. Note: existing document is in the trash. + + + Document with ASN already exists. + + src/app/services/websocket-status.service.ts + 26 + + Document with ASN already exists. + + + Document with ASN already exists. Note: existing document is in the trash. + + src/app/services/websocket-status.service.ts + 27 + + Document with ASN already exists. Note: existing document is in the trash. + + + File not found. + + src/app/services/websocket-status.service.ts + 28 + + File not found. + + + Pre-consume script does not exist. + + src/app/services/websocket-status.service.ts + 29 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Pre-consume script does not exist. + + + Error while executing pre-consume script. + + src/app/services/websocket-status.service.ts + 30 + + Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing pre-consume script. + + + Post-consume script does not exist. + + src/app/services/websocket-status.service.ts + 31 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Post-consume script does not exist. + + + Error while executing post-consume script. + + src/app/services/websocket-status.service.ts + 32 + + Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation + Error while executing post-consume script. + + + Received new file. + + src/app/services/websocket-status.service.ts + 33 + + Received new file. + + + File type not supported. + + src/app/services/websocket-status.service.ts + 34 + + File type not supported. + + + Processing document... + + src/app/services/websocket-status.service.ts + 35 + + Processing document... + + + Generating thumbnail... + + src/app/services/websocket-status.service.ts + 36 + + Generating thumbnail... + + + Retrieving date from document... + + src/app/services/websocket-status.service.ts + 37 + + Retrieving date from document... + + + Saving document... + + src/app/services/websocket-status.service.ts + 38 + + Saving document... + + + Finished. + + src/app/services/websocket-status.service.ts + 39 + + Finished. + + + + diff --git a/src-ui/src/locale/messages.ms_MY.xlf b/src-ui/src/locale/messages.ms_MY.xlf index 249650d433..5e182ead76 100644 --- a/src-ui/src/locale/messages.ms_MY.xlf +++ b/src-ui/src/locale/messages.ms_MY.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Close @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Previous @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Next @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Previous month @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Next month @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Close @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Select month @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Hours @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Select year @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutes @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 First @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment hours @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Previous @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement hours @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Next @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment minutes @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Last @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement minutes @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seconds @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Increment seconds @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrement seconds @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documents @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Loading... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Advanced search @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirm delete @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmation @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - now - From @@ -3882,11 +3878,19 @@ Added + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + now + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Path @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Color @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Not assigned @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Title & content @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 More like @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Without any tag @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tags @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.nl_NL.xlf b/src-ui/src/locale/messages.nl_NL.xlf index 960fd6a2a1..ff2cf6a82c 100644 --- a/src-ui/src/locale/messages.nl_NL.xlf +++ b/src-ui/src/locale/messages.nl_NL.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Sluiten @@ -13,16 +13,16 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader - Slide of + Dia van Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Vorige @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Volgende @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Vorige maand @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Volgende maand @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 UU @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sluiten @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selecteer maand @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Uren @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Jaar selecteren @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Eerste @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Uren verhogen @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vorige @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Uren verlagen @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Volgende @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten verhogen @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Laatste @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuten verlagen @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seconden @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seconden verhogen @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seconden verlagen @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documenten @@ -496,7 +496,7 @@ src/app/components/manage/mail/mail.component.html 4 - E-mailaccounts en regels voor automatisch importeren van documenten beheren. + Beheer e-mailaccounts en regels voor het automatisch importeren van documenten. Workflows give you more control over the document pipeline. @@ -524,7 +524,7 @@ src/app/app.component.ts 240 - Check out the settings for various tweaks to the web app. + Bekijk de instellingen om de webapp naar wens in te stellen. Thank you! 🙏 @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Inschakelen @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -740,7 +740,7 @@ src/app/components/admin/logs/logs.component.html 4 - Bekijk de logbestanden voor de applicatie en voor het ophalen van e-mails. + Bekijk de logbestanden van de applicatie en voor het ophalen van e-mails. Show @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + regels Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,13 +886,21 @@ Laden... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Spring naar beneden + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. src/app/components/admin/settings/settings.component.html 4 - Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. + Opties om het uiterlijk, meldingen en meer aan te passen. De instellingen gelden alleen voor de <strong>huidige gebruiker</strong>. Start tour @@ -1108,7 +1116,7 @@ src/app/components/admin/settings/settings.component.html 165,167 - Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. + Updatecontrole werkt door de openbare GitHub API te pingen voor de nieuwste release en zo te bepalen of er een nieuwe versie beschikbaar is. Het daadwerkelijke bijwerken van de app moet nog steeds handmatig gebeuren. No tracking data is collected by the app in any way. @@ -1224,7 +1232,7 @@ src/app/components/admin/settings/settings.component.html 214 - Show document thumbnail during loading + Document thumbnail tonen tijdens het laden Global search @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Geavanceerd zoeken @@ -1408,7 +1416,7 @@ src/app/components/admin/settings/settings.component.html 266,268 - Settings apply to this user account for objects (Tags, Mail Rules, etc. but not documents) created via the web UI. + Instellingen zijn van toepassing op dit account voor objecten (tags, mailregels, enz., maar niet op documenten) die via de webinterface zijn aangemaakt. Default Owner @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -1948,7 +1956,7 @@ src/app/components/admin/tasks/tasks.component.html 64 - Resultaten + Resultaat Info @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Bevestig het verwijderen @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Wachtwoord is gewijzigd, je wordt zo uitgelogd. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bevestiging @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relatieve datums - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - nu - From @@ -3882,11 +3878,19 @@ Toegevoegd + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + nu + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Binnen 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Binnen 1 maand @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Binnen 3 maanden @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Binnen 1 jaar @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Dit jaar @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Deze maand @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Gisteren + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Vorige week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Vorige maand + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Vorig kwartaal + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Vorig jaar + Matching algorithm @@ -4576,7 +4612,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 64 - System default + Systeemstandaard Text, then HTML @@ -4664,7 +4700,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 118 - Titel van deze regel niet gebruiken + Geen titel van deze regel toewijzen Do not assign a correspondent @@ -4688,7 +4724,7 @@ src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 133 - Gebruik de naam (of het e-mailadres indien niet beschikbaar) + Gebruik de naam (of e-mailadres indien niet beschikbaar) Use correspondent selected below @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Pad @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Kleur @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Tweestapsverificatie @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Tweestapsverificatie uitschakelen @@ -5072,7 +5108,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 123 - Trigger type + Soort trigger Set scheduled trigger offset and which date field to use. @@ -5080,7 +5116,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 125 - Set scheduled trigger offset and which date field to use. + Stel het aantal dagen verschil in voor de geplande trigger en kies welk datumveld wordt gebruikt. Offset days @@ -5088,7 +5124,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 130 - Offset days + Aantal dagen verschil Positive values will trigger after the date, negative values before. @@ -5096,7 +5132,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 134 - Positive values will trigger after the date, negative values before. + Positieve waarden triggeren na de datum, negatieve waarden ervoor. Relative to @@ -5120,7 +5156,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 143 - Custom field to use for date. + Aangepast veld om voor datum te gebruiken. Recurring @@ -5136,7 +5172,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 149 - Trigger is recurring. + Trigger wordt herhaald. Recurring interval days @@ -5152,7 +5188,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 153 - Repeat the trigger every n days. + Herhaal de trigger elke n dagen. Trigger for documents that match all filters specified below. @@ -5194,13 +5230,13 @@ Filter op opslaglocatie - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Toepassen op documenten die overeenkomen met dit pad. Wildcards met * zijn toegestaan. Hoofdletters worden genormaliseerd.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5240,7 +5276,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Advanced Filters + Geavanceerde filters Add filter @@ -5248,7 +5284,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Add filter + Filter toevoegen No advanced workflow filters defined. @@ -5256,7 +5292,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 195 - No advanced workflow filters defined. + Er zijn geen geavanceerde workflow filters gedefinieerd. Complete the custom field query configuration. @@ -5264,7 +5300,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 224,226 - Complete the custom field query configuration. + Voltooi de query configuratie van het aangepaste veld. Action type @@ -5528,7 +5564,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 429 - Include document + Voeg document toe Consume Folder @@ -5644,7 +5680,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 203 - Has any of these tags + Heeft een van deze labels Has all of these tags @@ -5652,7 +5688,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - Has all of these tags + Heeft al deze labels Does not have these tags @@ -5660,7 +5696,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 217 - Does not have these tags + Geen van deze labels Has correspondent @@ -5676,7 +5712,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 232 - Does not have correspondents + Geen van deze correspondenten Has document type @@ -5692,7 +5728,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 248 - Does not have document types + Geen van deze documenttypes Has storage path @@ -5700,7 +5736,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 256 - Has storage path + Heeft opslagpad Does not have storage paths @@ -5708,7 +5744,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 264 - Does not have storage paths + Geen van deze opslagpaden Matches custom field query @@ -5716,7 +5752,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 272 - Matches custom field query + Komt overeen met aangepast veld query Create new workflow @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Zonder toewijzing @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan de QR-code met je authenticator-app en voer de code hieronder in @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Geheime sleutel voor authenticator @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Je kunt dit geheime sleutel opslaan en gebruiken om de authenticator-app later opnieuw te installeren. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Herstelcodes worden niet opnieuw getoond, zorg ervoor dat je ze opslaat. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Codes kopiëren @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 E-mailadressen moeten overeenkomen @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Wachtwoorden moeten overeenkomen @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profiel succesvol bijgewerkt @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Fout bij opslaan profiel @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Fout bij genereren authenticatie token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Fout bij ontkoppelen van sociaal account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Fout bij ophalen TOTP instellingen @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP succesvol ingeschakeld @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Fout bij inschakelen TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP is succesvol uitgeschakeld @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Fout bij uitschakelen TOTP @@ -6958,7 +6994,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 105 - Tasks Queue + Takenwachtrij Redis Status @@ -6982,7 +7018,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 153 - Health + Status Search Index @@ -7006,7 +7042,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 245 - Run Task + Taak uitvoeren Last Updated @@ -7046,7 +7082,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 252 - Last Run + Laatst uitgevoerd WebSocket Connection @@ -7286,7 +7322,7 @@ src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 7 - or drop files anywhere + of sleep bestanden hierheen Dismiss completed @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Aangepaste velden @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Selecteer: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9015,7 +9051,7 @@ src/app/components/document-list/document-list.component.ts 391 - Failed to save view "". + Fout bij het opslaan van weergave "". View "" created successfully. @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel en inhoud @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Bestandstype @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Meer zoals @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 gelijk aan @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is leeg @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is niet leeg @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 groter dan @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 kleiner dan @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Zonder correspondent @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Zonder documenttype @@ -9133,15 +9169,15 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 - Storage path: + Opslagpad: Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Zonder opslagpad @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Label: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Zonder label @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Aangepaste velden zoekopdracht @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Eigenaar: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Eigenaar niet in: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Zonder eigenaar @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter documenten () @@ -9591,7 +9627,7 @@ src/app/components/manage/mail/mail.component.html 143 - Bekijk verwerkte emailberichten + Bekijk verwerkte e-mails No mail rules defined. @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Fout bij bijwerken rechten @@ -9827,7 +9863,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.ts 72 - Verwerkte emailbericht(en) verwijderd + Verwerkte e-mail(s) verwijderd Filter by: @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Succesvol aangemaakt. @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Fout bij maken . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Succesvol bijgewerkt "". @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Fout bij opslaan . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Bijbehorende documenten worden niet verwijderd. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Fout tijdens het verwijderen van element @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Rechten succesvol bijgewerkt @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Deze bewerking zal alle objecten permanent verwijderen. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objecten succesvol verwijderd @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Fout bij verwijderen object @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 opslagpad @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 opslagpaden @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Wil je dit opslagpad echt verwijderen ""? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 label @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 labels @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Wil je dit label echt verwijderen ""? @@ -11240,7 +11276,7 @@ src/app/services/settings.service.ts 261 - Chinese Traditional + Chinees (traditioneel) ISO 8601 diff --git a/src-ui/src/locale/messages.no_NO.xlf b/src-ui/src/locale/messages.no_NO.xlf index 4e21185b72..51cfc9cc05 100644 --- a/src-ui/src/locale/messages.no_NO.xlf +++ b/src-ui/src/locale/messages.no_NO.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Lukk @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Forrige @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Neste @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Forrige måned @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Neste måned @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Lukk @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Velg en måned @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Timer @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Velg år @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutter @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Først @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Økende timer @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Forrige @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reduksjon i timer @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Neste @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Økende minutter @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Siste @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reduksjon i minutter @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunder @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Tilleggstid i sekund @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Reduksjon sekunder @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenter @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Aktiver @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Laster... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Avansert søk @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Bekreft sletting @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Passordet har blitt endret, du vil bli logget ut øyeblikkelig. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bekreftelse @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - - From @@ -3882,11 +3878,19 @@ Lagt til + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Sti @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Farger @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ikke tildelt @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Tittel & innhold @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Mer lik @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 er lik @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 er tom @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 er ikke tom @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 større enn @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 mindre enn @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Uten korrespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Uten dokumenttype @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Uten lagringssti @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Uten noen etiketter @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Tittel: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Eier: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Eier ikke i: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Uten en eier @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 lagringssti @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 lagringsstier @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Ønsker du virkelig å slette lagringsstien ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tagg @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tagger @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Ønsker du virkelig å slette taggen ""? diff --git a/src-ui/src/locale/messages.pl_PL.xlf b/src-ui/src/locale/messages.pl_PL.xlf index f91f903c91..69b43351a0 100644 --- a/src-ui/src/locale/messages.pl_PL.xlf +++ b/src-ui/src/locale/messages.pl_PL.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zamknij @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Poprzedni @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Następny @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Poprzedni miesiąc @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Następny miesiąc @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 GG @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zamknij @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Wybierz miesiąc @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Godziny @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Wybierz rok @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuty @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Pierwszy @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zwiększ godziny @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Poprzedni @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmniejsz godziny @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Następny @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zwiększ minuty @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ostatni @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmniejsz minuty @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundy @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zwiększa sekundy @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmniejsz sekundy @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenty @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Włącz @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + linie Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Wczytywanie... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Przejdź na dół + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Wyszukiwanie zaawansowane @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Potwierdź usunięcie @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Hasło zostało zmienione, zostaniesz natychmiast wylogowany. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potwierdzenie @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Daty względne - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - teraz - From @@ -3882,11 +3878,19 @@ Dodano + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + teraz + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 W ciągu 1 tygodnia @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 W ciągu 1 miesiąca @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 W ciągu 3 miesięcy @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 W ciągu 1 roku @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 W tym roku @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 W tym miesiącu @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Wczoraj + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Poprzedni tydzień + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Poprzedni miesiąc + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Poprzedni kwartał + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Poprzedni rok + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Ścieżka @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Kolor @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Weryfikacja dwuetapowa @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Wyłącz weryfikację dwuetapową @@ -5194,13 +5230,13 @@ Filtruj ścieżkę - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Zastosuj do dokumentów pasujących do tej ścieżki. Dozwolone są symbole wieloznaczne takie jak *. Wielkość liter nie ma znaczenia.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nieprzypisane @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Otwórz filtr @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Zeskanuj kod QR za pomocą aplikacji uwierzytelniającej, a następnie wprowadź kod poniżej @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Klucz uwierzytelniający @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Możesz przechowywać ten tajny klucz i użyć go do ponownej instalacji aplikacji uwierzytelniającej w późniejszym czasie. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kod @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Kody odzyskiwania nie zostaną wyświetlone ponownie, upewnij się, że zostały zapisane. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopiuj kody @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Adresy e-mail muszą być zgodne @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Hasła muszą być zgodne @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil został pomyślnie zaktualizowany @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Błąd podczas zapisywania profilu @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Błąd generowania tokenu autoryzacyjnego @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Błąd rozłączania konta społecznościowego @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Błąd pobierania ustawień TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP aktywowany pomyślnie @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Błąd aktywacji TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP dezaktywowany pomyślnie @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Błąd dezaktywacji TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Pola dodatkowe @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Wybierz: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Tytuł & treść @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Typ pliku @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Podobne do @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 równa się @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 jest pusty @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 nie jest pusty @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 większy niż @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 mniejsze niż @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Korespondent: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Bez nadawcy @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Typ dokumentu: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Bez typu dokumentu @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Ścieżka przechowywania: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Bez ścieżki zapisu @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Bez żadnego tagu @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Zapytanie o pola dodatkowe @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Tytuł: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Numer archiwum: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Właściciel: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Właściciel nie w: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Bez właściciela @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtrowanie dokumentów () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Błąd aktualizacji uprawnień @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Pomyślnie utworzono . @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Wystąpił błąd podczas tworzenia . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Pomyślnie zaktualizowano "". @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Wystąpił błąd podczas zapisywania . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Powiązane dokumenty nie zostaną usunięte. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Błąd podczas usuwania elementu @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Uprawnienia zostały pomyślnie zaktualizowane @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Ta operacja spowoduje trwałe usunięcie wszystkich obiektów. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Obiekty usunięte pomyślnie @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Błąd usuwania obiektów @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 ścieżki zapisu @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 ścieżki zapisu @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Czy na pewno chcesz usunąć ścieżkę zapisu ""? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tag @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 tagi @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Czy na pewno chcesz usunąć tag "? diff --git a/src-ui/src/locale/messages.pt_BR.xlf b/src-ui/src/locale/messages.pt_BR.xlf index 80157c66f8..55a5757ec6 100644 --- a/src-ui/src/locale/messages.pt_BR.xlf +++ b/src-ui/src/locale/messages.pt_BR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Fechar @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Anterior @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Próximo @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mês anterior @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Próximo mês @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Fechar @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selecione o mês @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Horas @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selecione o ano @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutos @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primeiro @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Acrescentar horas @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Anterior @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Deduzir horas @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Próximo @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Acrescentar minutos @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Último @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Deduzir minutos @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Segundos @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Acrescentar segundos @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Deduzir segundos @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documentos @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Habilitar @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Carregando... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Pesquisa avançada @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirmar exclusão @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 A senha foi alterada, você será deslogado momentaneamente. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmação @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Datas relacionadas - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - hoje - From @@ -3882,11 +3878,19 @@ Adicionado + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + hoje + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Em 1 semana @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Em 1 mês @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Em 3 meses @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Em 1 ano @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Este ano @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Este mês @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Ontem + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Caminho @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Cor @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autenticação de dois fatores @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Desativar a autenticação de dois fatores @@ -5194,13 +5230,13 @@ Filtro de caminho - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Aplica-se a documentos que correspondem a esse caminho. Caracteres curinga usando * são permitidos. Sem diferenciação de maiúsculas e minúsculas.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5883,7 +5919,7 @@ Erro ao enviar documentos por e-mail Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Não atribuído @@ -5892,7 +5928,7 @@ Erro ao enviar documentos por e-mail Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Abrir filtro @@ -6469,7 +6505,7 @@ Erro ao enviar documentos por e-mail src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6513,7 +6549,7 @@ Erro ao enviar documentos por e-mail src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6581,7 +6617,7 @@ Erro ao enviar documentos por e-mail Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Escaneie o código QR com o seu aplicativo de autenticação, e então digite o código abaixo @@ -6589,7 +6625,7 @@ Erro ao enviar documentos por e-mail Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Segredo autenticador @@ -6597,7 +6633,7 @@ Erro ao enviar documentos por e-mail You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Você pode armazenar este segredo e usá-lo para reinstalar seu aplicativo autenticador mais tarde. @@ -6605,7 +6641,7 @@ Erro ao enviar documentos por e-mail Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Código @@ -6613,7 +6649,7 @@ Erro ao enviar documentos por e-mail Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Os códigos de recuperação não serão exibidos novamente, certifique-se de salvá-los. @@ -6621,7 +6657,7 @@ Erro ao enviar documentos por e-mail Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copiar código @@ -6629,7 +6665,7 @@ Erro ao enviar documentos por e-mail Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Os e-mails devem ser iguais @@ -6637,7 +6673,7 @@ Erro ao enviar documentos por e-mail Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 As senhas devem ser iguais @@ -6645,7 +6681,7 @@ Erro ao enviar documentos por e-mail Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Perfil atualizado com sucesso @@ -6653,7 +6689,7 @@ Erro ao enviar documentos por e-mail Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Erro ao salvar o perfil @@ -6661,7 +6697,7 @@ Erro ao enviar documentos por e-mail Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Erro ao gerar token de autenticação @@ -6669,7 +6705,7 @@ Erro ao enviar documentos por e-mail Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Erro ao desconectar conta de rede social @@ -6677,7 +6713,7 @@ Erro ao enviar documentos por e-mail Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Erro ao obter configurações TOTP @@ -6685,7 +6721,7 @@ Erro ao enviar documentos por e-mail TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP ativado com sucesso @@ -6693,11 +6729,11 @@ Erro ao enviar documentos por e-mail Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Erro ao ativar TOTP @@ -6705,7 +6741,7 @@ Erro ao enviar documentos por e-mail TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP desativado com sucesso @@ -6713,11 +6749,11 @@ Erro ao enviar documentos por e-mail Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Erro ao desativar TOTP @@ -7507,7 +7543,7 @@ Erro ao enviar documentos por e-mail src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8131,7 +8167,7 @@ Erro ao enviar documentos por e-mail src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Campos personalizados @@ -8711,7 +8747,7 @@ Erro ao enviar documentos por e-mail src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8819,7 +8855,7 @@ Erro ao enviar documentos por e-mail src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9039,7 +9075,7 @@ Erro ao enviar documentos por e-mail Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Título & conteúdo @@ -9047,7 +9083,7 @@ Erro ao enviar documentos por e-mail File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Tipo de arquivo @@ -9055,7 +9091,7 @@ Erro ao enviar documentos por e-mail More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Mais parecido @@ -9063,7 +9099,7 @@ Erro ao enviar documentos por e-mail equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 igual a @@ -9071,7 +9107,7 @@ Erro ao enviar documentos por e-mail is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 está vazio @@ -9079,7 +9115,7 @@ Erro ao enviar documentos por e-mail is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 não está vazio @@ -9087,7 +9123,7 @@ Erro ao enviar documentos por e-mail greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 maior que @@ -9095,7 +9131,7 @@ Erro ao enviar documentos por e-mail less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 menor que @@ -9103,7 +9139,7 @@ Erro ao enviar documentos por e-mail Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondente: @@ -9111,7 +9147,7 @@ Erro ao enviar documentos por e-mail Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sem correspondente @@ -9119,7 +9155,7 @@ Erro ao enviar documentos por e-mail Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Tipo de documento: @@ -9127,7 +9163,7 @@ Erro ao enviar documentos por e-mail Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sem tipo de documento @@ -9135,7 +9171,7 @@ Erro ao enviar documentos por e-mail Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Caminho de armazenamento: @@ -9143,7 +9179,7 @@ Erro ao enviar documentos por e-mail Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Sem o caminho de armazenamento @@ -9151,7 +9187,7 @@ Erro ao enviar documentos por e-mail Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9159,7 +9195,7 @@ Erro ao enviar documentos por e-mail Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sem etiquetas @@ -9167,7 +9203,7 @@ Erro ao enviar documentos por e-mail Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Consulta de campos personalizados @@ -9175,7 +9211,7 @@ Erro ao enviar documentos por e-mail Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Título: @@ -9183,7 +9219,7 @@ Erro ao enviar documentos por e-mail ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 NSA: @@ -9191,7 +9227,7 @@ Erro ao enviar documentos por e-mail Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Proprietário: @@ -9199,7 +9235,7 @@ Erro ao enviar documentos por e-mail Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 @@ -9207,7 +9243,7 @@ Erro ao enviar documentos por e-mail Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Sem um proprietário @@ -9403,19 +9439,19 @@ Erro ao enviar documentos por e-mail src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtrar Documentos () @@ -9787,7 +9823,7 @@ Erro ao enviar documentos por e-mail src/app/components/manage/management-list/management-list.component.ts - 349 + 353 @@ -9915,7 +9951,7 @@ Erro ao enviar documentos por e-mail Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9927,7 +9963,7 @@ Erro ao enviar documentos por e-mail Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Criado com sucesso . @@ -9935,7 +9971,7 @@ Erro ao enviar documentos por e-mail Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Ocorreu um erro ao criar . @@ -9943,7 +9979,7 @@ Erro ao enviar documentos por e-mail Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Atualizado com sucesso "". @@ -9951,7 +9987,7 @@ Erro ao enviar documentos por e-mail Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Ocorreu um erro ao salvar . @@ -9959,7 +9995,7 @@ Erro ao enviar documentos por e-mail Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Documentos associados não serão excluídos. @@ -9967,7 +10003,7 @@ Erro ao enviar documentos por e-mail Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Erro ao excluir elemento @@ -9975,7 +10011,7 @@ Erro ao enviar documentos por e-mail Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissões atualizadas com sucesso @@ -9983,7 +10019,7 @@ Erro ao enviar documentos por e-mail This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Esta operação irá apagar permanentemente todos os objetos. @@ -9991,7 +10027,7 @@ Erro ao enviar documentos por e-mail Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objeto(s) excluído(s) com sucesso. @@ -9999,7 +10035,7 @@ Erro ao enviar documentos por e-mail Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Erro ao apagar objetos @@ -10087,7 +10123,7 @@ Erro ao enviar documentos por e-mail storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 caminho de armazenamento @@ -10095,7 +10131,7 @@ Erro ao enviar documentos por e-mail storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 caminhos de armazenamento @@ -10103,7 +10139,7 @@ Erro ao enviar documentos por e-mail Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Você realmente deseja excluir o caminho de armazenamento ""? @@ -10111,7 +10147,7 @@ Erro ao enviar documentos por e-mail tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiqueta @@ -10119,7 +10155,7 @@ Erro ao enviar documentos por e-mail tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etiquetas @@ -10127,7 +10163,7 @@ Erro ao enviar documentos por e-mail Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Você realmente deseja excluir a etiqueta ""? diff --git a/src-ui/src/locale/messages.pt_PT.xlf b/src-ui/src/locale/messages.pt_PT.xlf index 68f13e7fbe..17bff07379 100644 --- a/src-ui/src/locale/messages.pt_PT.xlf +++ b/src-ui/src/locale/messages.pt_PT.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Fechar @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Anterior @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Seguinte @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mês anterior @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Mês seguinte @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Fechar @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selecionar mês @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Horas @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selecionar ano @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minutos @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primeiro @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar horas @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Anterior @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Diminuir horas @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Seguinte @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar minutos @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Último @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Diminuir minutos @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Segundos @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementar segundos @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Diminuir segundos @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documentos @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Ativar @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ A carregar... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Pesquisa avançada @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirmar eliminação @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 A palavra passe foi alterada, terá a sessão atual terminada daqui a nada. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmação @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - agora - From @@ -3882,11 +3878,19 @@ Adicionado + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + agora + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Dentro de 1 semana @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Dentro de 1 mês @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Dentro de 3 meses @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Dentro de 1 ano @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Este ano @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Este mês @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Ontem + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Caminho @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Cor @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Autenticação em dois passos @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Desativar a autenticação em dois passos @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Não atribuído @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Título & conteúdo @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Semelhantes a @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 é igual a @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 está vazio @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 não está vazio @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 é maior que @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 é menor que @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Sem correspondente @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Sem tipo de documento @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Sem caminho de armazenamento @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Sem etiquetas @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Título: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 NSA: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Dono: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Erro ao atualizar permissões @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Criado com sucesso . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Ocorreu um erro ao criar . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Ocorreu um erro ao gravar . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 caminho de armazenamento @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 caminhos de armazenamento @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etiqueta @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etiquetas @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Tem a certeza que quer apagar a etiqueta ""? diff --git a/src-ui/src/locale/messages.ro_RO.xlf b/src-ui/src/locale/messages.ro_RO.xlf index 8f695339ee..4d6f5b01f1 100644 --- a/src-ui/src/locale/messages.ro_RO.xlf +++ b/src-ui/src/locale/messages.ro_RO.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Închide @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Anterior @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Următor @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Luna precedentă @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Luna următoare @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Închide @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selectați luna @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ore @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Selectați anul @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minute @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Primul @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementare ore @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Anteriorul @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrementare oră @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Următor @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementare minute @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ultima @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrementare minute @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Secunde @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Incrementare secunde @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Decrementare secunde @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Documente @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Activeaza @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Se încarcă... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Căutare avansată @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Confirmă ștergerea @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Parola a fost schimbată, vei fi deconectat momentan. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Confirmare @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - acum - From @@ -3882,11 +3878,19 @@ Adăugat + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + acum + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Cale @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Culoare @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filtrare cale - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nealocate @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titlu si conținut @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Asemănătoare @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 equals @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 is empty @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 is not empty @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 greater than @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 less than @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Fără corespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Fară tip @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Without storage path @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Fară etichete @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titlu: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Aviz prealabil de expediție: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Without an owner @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 storage path @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 storage paths @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 etichetă @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 etichete @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Sunteți sigur că doriți să ștergeți documentul ""? diff --git a/src-ui/src/locale/messages.ru_RU.xlf b/src-ui/src/locale/messages.ru_RU.xlf index c3df92c26a..6a02df3fac 100644 --- a/src-ui/src/locale/messages.ru_RU.xlf +++ b/src-ui/src/locale/messages.ru_RU.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Закрыть @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Предыдущий @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Следующий @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Предыдущий месяц @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Следующий месяц @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ЧЧ @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Закрыть @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Выберите месяц @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Часы @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Выберите год @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Минуты @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Первый @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличить часы @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Предыдущий @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Уменьшить часы @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Следующий @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличить минуты @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Последний @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Уменьшить минуты @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 СС @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Секунды @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Увеличить секунды @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Уменьшить секунды @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Документы @@ -524,7 +524,7 @@ src/app/app.component.ts 240 - . + Ознакомьтесь с настройками для веб-приложения. Thank you! 🙏 @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Включить @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + строк(-и) Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Загрузка... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Перейти в конец + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Расширенный поиск @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2148,7 +2156,7 @@ src/app/components/admin/tasks/tasks.component.ts 161 - Error dismissing tasks + Ошибка при отмене задач Error dismissing task @@ -2156,7 +2164,7 @@ src/app/components/admin/tasks/tasks.component.ts 170 - Error dismissing task + Ошибка при отмене задачи queued @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Подтвердите удаление @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Пароль был изменен, повторите вход в учетную запись. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Подтверждение @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Относительные даты - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - сейчас - From @@ -3882,11 +3878,19 @@ Добавлено + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + сейчас + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 В течение 1 недели @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 В течение 1 месяца @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 В течении 3-х месяцев @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 В течение 1 года @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 В этом году @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 В этом месяце @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Вчера + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Предыдущая неделя + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Предыдущий месяц + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Предыдущий квартал + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Предыдущий год + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Путь @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Цвет @@ -4816,7 +4852,7 @@ src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html 15 - Parent + Родитель Inbox tag @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Двухфакторная аутентификация @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Отключить двухфакторную аутентификацию @@ -5194,13 +5230,13 @@ Фильтр пути - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Обрабатывать только документы, которые соответствуют данному пути. Маски, указанные как *, разрешены. Допускается регистр.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5240,7 +5276,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Advanced Filters + Расширенные фильтры Add filter @@ -5248,7 +5284,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Add filter + Добавить фильтр No advanced workflow filters defined. @@ -5256,7 +5292,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 195 - No advanced workflow filters defined. + Расширенные фильтры рабочего процесса не определены. Complete the custom field query configuration. @@ -5264,7 +5300,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 224,226 - Complete the custom field query configuration. + Заполните настройки запросов к настраиваемым полям. Action type @@ -5644,7 +5680,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 203 - Has any of these tags + Имеет любой из этих тегов Has all of these tags @@ -5652,7 +5688,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - Has all of these tags + Есть все эти теги Does not have these tags @@ -5660,7 +5696,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 217 - Does not have these tags + Нет этих тегов Has correspondent @@ -5676,7 +5712,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 232 - Does not have correspondents + Нет корреспондентов Has document type @@ -5692,7 +5728,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 248 - Does not have document types + Нет типов документов Has storage path @@ -5700,7 +5736,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 256 - Has storage path + Имеет путь к хранилищу Does not have storage paths @@ -5708,7 +5744,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 264 - Does not have storage paths + Нет путей хранения Matches custom field query @@ -5792,7 +5828,7 @@ src/app/components/common/email-document-dialog/email-document-dialog.component.html 37 - Some email servers may reject messages with large attachments. + Некоторые почтовые серверы могут отклонить сообщения с большими вложениями. Email sent @@ -5808,7 +5844,7 @@ src/app/components/common/email-document-dialog/email-document-dialog.component.ts 69 - Error emailing documents + Ошибка отправки документов на почту Error emailing document @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не назначено @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Открыть фильтр @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Отсканируйте QR-код вашим приложением-аутентификатором и затем введите код ниже @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Секретный ключ аутентификации @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Вы можете хранить этот секретный ключ и использовать его для переустановки вашего приложения аутентификации позже. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Код @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Коды восстановления не будут показаны снова, не забудьте сохранить их. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Скопировать коды @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Email должен совпадать @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Пароли должны совпадать @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Профиль успешно обновлен @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Ошибка при сохранении профиля @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Ошибка создания токена авторизации @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Ошибка при отключении стороннего сервиса @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Ошибка получения настроек TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP успешно активирован @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Ошибка активации TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP успешно деактивирован @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Ошибка деактивации TOTP @@ -7062,7 +7098,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 261 - OK + ХОРОШО Copy Raw Error @@ -7444,7 +7480,7 @@ src/app/components/document-detail/document-detail.component.html 58 - Print + Распечатать More like this @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8032,7 +8068,7 @@ src/app/components/document-detail/document-detail.component.ts 1460 - Print failed. + Печать не удалась. Error loading document for printing. @@ -8040,7 +8076,7 @@ src/app/components/document-detail/document-detail.component.ts 1472 - Error loading document for printing. + Ошибка загрузки документа для печати. An error occurred loading tiff: @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Пользовательские поля @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Выбрать: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Название и содержимое @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Тип файла @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Больше похожих @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 совпадает с @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 не заполнено @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 не является пустым @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 больше чем @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 меньше чем @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Корреспондент: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Без корреспондента @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Тип документа: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Без типа документа @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Путь хранения: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Без пути хранения @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Тег: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Без тегов @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Запрос пользовательских полей @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Название: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Архивный номер: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Владелец: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Владелец не в: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Без владельца @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Фильтр документов () @@ -9591,7 +9627,7 @@ src/app/components/manage/mail/mail.component.html 143 - View Processed Mail + Просмотреть обработанную почту No mail rules defined. @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Ошибка обновления прав доступа @@ -9803,7 +9839,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 20 - No processed email messages found. + Нет обработанных email сообщений. Received @@ -9811,7 +9847,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 33 - Received + Полученный Processed @@ -9819,7 +9855,7 @@ src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 34 - Processed + Обработано Processed mail(s) deleted @@ -9913,7 +9949,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9925,7 +9961,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Успешно создано . @@ -9933,7 +9969,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Произошла ошибка во время создания . @@ -9941,7 +9977,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Успешно обновлено: "". @@ -9949,7 +9985,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Произошла ошибка при сохранении . @@ -9957,7 +9993,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Связанные документы не будут удалены. @@ -9965,7 +10001,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Ошибка при удалении элемента @@ -9973,7 +10009,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Права доступа успешно обновлены @@ -9981,7 +10017,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Эта операция окончательно удалит все объекты. @@ -9989,7 +10025,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Объекты успешно удалены @@ -9997,7 +10033,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Ошибка при удалении объектов @@ -10085,7 +10121,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 путь к хранилищу @@ -10093,7 +10129,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 пути хранения @@ -10101,7 +10137,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Вы действительно хотите удалить путь до хранилища данных ""? @@ -10109,7 +10145,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 тег @@ -10117,7 +10153,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 теги @@ -10125,7 +10161,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Вы действительно хотите удалить тег ""? @@ -10399,7 +10435,7 @@ src/app/data/custom-field.ts 55 - Long Text + Длинный текст Search score diff --git a/src-ui/src/locale/messages.sk_SK.xlf b/src-ui/src/locale/messages.sk_SK.xlf index ffd1b6eec3..57a7ac9b07 100644 --- a/src-ui/src/locale/messages.sk_SK.xlf +++ b/src-ui/src/locale/messages.sk_SK.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zavrieť @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Predchádzajúci @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Ďalší @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Predchádzajúci mesiac @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Nasledujúci mesiac @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zavrieť @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vyberte mesiac @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Hodín @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Vyberte rok @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minúty @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prvý @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Navýšiť hodiny @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Predchádzajúci @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Znížiť hodiny @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ďalší @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Navýšiť minúty @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Posledný @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Znížiť minúty @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundy @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Navýšiť sekundy @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Znížiť sekundy @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenty @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Načítava sa... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Rozšírené vyhľadávanie @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Potvrdiť vymazanie @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Heslo bolo zmenené, ihneď prebehne odhlásenie. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potvrdenie @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - teraz - From @@ -3882,11 +3878,19 @@ Pridané + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + teraz + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Cesta @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Farba @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nepriradené @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Názov & obsah @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Podobné @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 rovná sa @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 je prázdny @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 nie je prázdny @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 väčšie ako @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 menšie ako @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Nepriradené @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Nepriradené @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Nepriradené @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Nepriradené @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Názov: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Vlastník: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Vlastník nie je: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Bez vlastníka @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Úspešne vytvorený . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Chyba pri vytváraní . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Chyba pri ukladaní . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 cesta k úložisku @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 cesty k úložisku @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Naozaj chcete odstrániť cestu k úložisku ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 štítok @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 štítky @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Naozaj chcete odstrániť štítok ""? diff --git a/src-ui/src/locale/messages.sl_SI.xlf b/src-ui/src/locale/messages.sl_SI.xlf index c1ece21d0f..6443ebde9a 100644 --- a/src-ui/src/locale/messages.sl_SI.xlf +++ b/src-ui/src/locale/messages.sl_SI.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zapri @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Prejšnji @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Naslednji @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Prejšnji mesec @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Naslednji mesec @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zapri @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Izberi mesec @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ura @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Izberi leto @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuta @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prvi @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povečanje ur @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prejšnji @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmanjšanje ur @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Naslednja @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povečanje minut @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zadnji @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmanjšanje minut @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunde @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povečanje sekund @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zmanjšanje sekund @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenti @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Omogoči @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + vrstice Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Nalaganje... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Skoči na konec + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Napredno iskanje @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Potrdi brisanje @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Geslo je bilo spremenjeno, kmalu boste za trenutek odjavljeni. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potrditev @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relativni datumi - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - zdaj - From @@ -3882,11 +3878,19 @@ Dodano + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + zdaj + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 V 1 tednu @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 V 1 mesecu @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 V 3 mesecih @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 V 1 letu @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 To leto @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Ta mesec @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Včeraj + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Prejšnji teden + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Prejšnji mesec + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Prejšnje četrtletje + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Prejšnje leto + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Pot @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Barva @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Dvojno preverjanje pristnosti @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Onemogočite dvojno preverjanje pristnosti @@ -5194,13 +5230,13 @@ Filtriraj pot - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Uporabi za dokumente, ki ustrezajo tej poti. Možna uporaba * nadomestnega znaka. Normalizirano glede na velike in male črke.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Ni dodeljeno @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Odpri filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Skenirajte kodo QR z aplikacijo za preverjanje pristnosti in nato vnesite spodnjo kodo @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Skrivnost overitelja @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 To skrivnost lahko shranite in jo uporabite za poznejšo ponovno namestitev aplikacije za preverjanje pristnosti. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Koda @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Kode za obnovitev se ne bodo več prikazale, zato jih shranite. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopiraj kode @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Elektronska naslova se morata ujemati @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Gesli se morata ujemati @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil uspešno posodobljen @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Napaka pri shranjevanju profila @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Napaka pri generiranju avtorizacijskega žetona @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Napaka pri odstranjevanju računa družabnega omrežja @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Napaka pri pridobivanju nastavitev TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP je bil uspešno aktiviran @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Napaka pri aktiviranju TOTP-ja @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP je bil uspešno deaktiviran @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Napaka pri deaktiviranju TOTP-ja @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Polja po meri @@ -8700,7 +8736,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Izberite: None @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Naslov & vsebina @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Vrsta datoteke @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Bolj podobno @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 je enako @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 je prazno @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 ni prazno @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 večje kot @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 manj kot @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Dopisnik: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Brez dopisnika @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Vrsta dokumenta: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Brez vrste dokumenta @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Pot shranjevanja: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Brez poti shrambe @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Oznaka: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Brez kakršne koli oznake @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Poizvedba po poljih po meri @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Naslov: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Lastnik: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Lastnika ni v: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Brez lastnika @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtriraj dokumente () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Napaka pri posodabljanju dovoljenj @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Uspešno ustvarjeno . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Prišlo je do napake med ustvarjanjem . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Datoteka "" je bila uspešno posodobljena. @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Prišlo je do napake med shranjevanjem . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Povezani dokumenti ne bodo izbrisani. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Napaka med brisanjem elementa @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Dovoljenja so bila uspešno posodobljena @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 To dejanje bo dokončno izbrisalo vse elemente. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Elementi uspešno izbrisani @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Napaka pri brisanju elementov @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 pot do shrambe @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 poti do shrambe @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Ali res želite izbrisati pot shranjevanja ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 oznaka @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 oznake @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Ali res želite izbrisati oznako ""? diff --git a/src-ui/src/locale/messages.sr_CS.xlf b/src-ui/src/locale/messages.sr_CS.xlf index 7b27e72edd..8e1777ae04 100644 --- a/src-ui/src/locale/messages.sr_CS.xlf +++ b/src-ui/src/locale/messages.sr_CS.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Zatvori @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Prethodni @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Sledeći @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Prethodni mesec @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Naredni mesec @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Zatvori @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Odaberi mesec @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Časovi @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Odaberi godinu @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuta @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prvi @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povećaj sate @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Prethodni @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanji sate @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sledeći @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povećaj minute @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Poslednji @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanji minute @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekundi @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Povećaj sekunde @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Smanji sekunde @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokumenti @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Omogući @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + linije Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Učitavanje... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Skoči na dno + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Napredna pretraga @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Potvrdi brisanje @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Lozinka je promenjena, bićete odjavljeni trenutno. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Potvrda @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relativni datumi - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - sada - From @@ -3882,11 +3878,19 @@ Dodato + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + sada + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 U roku od 1 nedelje @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 U roku od mesec dana @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 U roku od tri meseca @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 U roku od godinu dana @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Ove godine @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Ovaj mesec @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Juče + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Prethodna nedelja + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Prethodni mesec + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Prethodni kvartal + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Prethodna godina + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Putanja @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Boja @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Dvofaktorska autentifikacija @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Onemogući dvofaktorsku autentifikaciju @@ -5194,13 +5230,13 @@ Filtriraj putanju - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Primeni na dokumenta koja se poklapaju sa ovom putanjom. Specijalni znakovi * su dozvoljeni. Obrati pažnju na velika i mala slova.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Nije dodeljen @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Otvori filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Skenirajte QR kod pomoću aplikacije za autentifikaciju, a zatim unesite kod ispod @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Tajna autentifikatora @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Možete sačuvati ovu tajnu i koristiti je za ponovnu instalaciju aplikacije za autentifikaciju kasnije. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kod @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Kodovi za oporavak neće ponovo biti prikazani, obavezno ih sačuvajte. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopiraj kodove @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Imejlovi se moraju poklapati @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Lozinke se moraju poklapati @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil je uspešno ažuriran @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Greška prilikom čuvanja profila @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Greška prilikom generisanja auth tokena @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Greška prilikom isključivanja naloga @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Greška pri preuzimanju TOTP podešavanja @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP je uspešno aktiviran @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Greška pri aktiviranju TOTP-a @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP je uspešno deaktiviran @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Greška pri deaktiviranju TOTP-a @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Dodatna polja @@ -8701,7 +8737,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + Odaberi: None @@ -8711,7 +8747,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8819,7 +8855,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9039,7 +9075,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Naslov i sadržaj @@ -9047,7 +9083,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Vrsta fajla @@ -9055,7 +9091,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Slično @@ -9063,7 +9099,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 jednako @@ -9071,7 +9107,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 je prazan @@ -9079,7 +9115,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 nije prazan @@ -9087,7 +9123,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 veće od @@ -9095,7 +9131,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 manje od @@ -9103,7 +9139,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Korespondent: @@ -9111,7 +9147,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Bez korespondenta @@ -9119,7 +9155,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Vrsta dokumenta: @@ -9127,7 +9163,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Bez tipa dokumenta @@ -9135,7 +9171,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Putanja skladišta: @@ -9143,7 +9179,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Bez putanje skladišta @@ -9151,7 +9187,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Oznaka: @@ -9159,7 +9195,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Bez oznake @@ -9167,7 +9203,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Upit za prilagođeno polje @@ -9175,7 +9211,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Naslov: @@ -9183,7 +9219,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9191,7 +9227,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Vlasnik: @@ -9199,7 +9235,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Vlasnik nije: @@ -9207,7 +9243,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Bez vlasnika @@ -9403,19 +9439,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filtriraj dokumenta () @@ -9787,7 +9823,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Greška prilikom izmene dozvola @@ -9915,7 +9951,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9927,7 +9963,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Uspešno kreirano . @@ -9935,7 +9971,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Greška se pojavilia prilikom kreiranja . @@ -9943,7 +9979,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Uspešno ažuriranje za "". @@ -9951,7 +9987,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Greška se pojavilia prilikom čuvanja . @@ -9959,7 +9995,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Povezani dokumenti neće biti obrisani. @@ -9967,7 +10003,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Greška prilikom brisanja elementa @@ -9975,7 +10011,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Dozvole su uspešno ažurirane @@ -9983,7 +10019,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Ova operacija će trajno obrisati sve objekte. @@ -9991,7 +10027,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objekti su uspešno obrisani @@ -9999,7 +10035,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Greška prilikom brisanja objekata @@ -10087,7 +10123,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 putanja skladišta @@ -10095,7 +10131,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 putanja skladišta @@ -10103,7 +10139,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Da li stvarno želite da obrišete putanju skladišta ""? @@ -10111,7 +10147,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 oznaka @@ -10119,7 +10155,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 oznake @@ -10127,7 +10163,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Da li stvarno želite da obrišete oznaku ""? diff --git a/src-ui/src/locale/messages.sv_SE.xlf b/src-ui/src/locale/messages.sv_SE.xlf index d6a80d9480..4c31d4932a 100644 --- a/src-ui/src/locale/messages.sv_SE.xlf +++ b/src-ui/src/locale/messages.sv_SE.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Stäng @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Föregående @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Nästa @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Föregående månad @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Nästa månad @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Stäng @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Välj månad @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Timmar @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Välj år @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minuter @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Första @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Öka timmar @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Föregående @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minska timmar @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Nästa @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Öka minuter @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sista @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minska minuter @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sekunder @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Öka sekunder @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Minska sekunder @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Dokument @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Aktivera @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Laddar... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1208,7 +1216,7 @@ src/app/components/admin/settings/settings.component.html 202 - Only applies to the Paperless-ngx PDF viewer. + Gäller endast för Paperless-ngx PDF-läsaren. Automatically remove inbox tag(s) on save @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Avancerad sökning @@ -1416,7 +1424,7 @@ src/app/components/admin/settings/settings.component.html 273 - Default Owner + Standardägare Objects without an owner can be viewed and edited by all users @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Bekräfta borttagning @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Lösenordet har ändrats, du kommer att tillfälligt loggas ut. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -2924,7 +2932,7 @@ src/app/components/app-frame/app-frame.component.html 20 - by Paperless-ngx + av Paperless-ngx Logged in as @@ -2940,7 +2948,7 @@ src/app/components/app-frame/app-frame.component.html 47 - My Profile + Min profil Logout @@ -3072,7 +3080,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 120 - Document Types + Dokumenttyper Storage Paths @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Bekräftelse @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - nu - From @@ -3882,11 +3878,19 @@ Tillagd + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + nu + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Sökväg @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Färg @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Tvåfaktorsautentisering @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Inaktivera tvåfaktorsautentisering @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Inte tilldelad @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Kod @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Kopiera koder @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Titel & innehåll @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Mer som @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 är lika med @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 är tom @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 är inte tom @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 större än @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 mindre än @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Utan korrespondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Utan dokumenttyp @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Utan lagringsplats @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Utan tagg @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Titel: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Ägare: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Ägare ej i: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Utan ägare @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Skapade . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Kunde inte skapa . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Kunde inte spara . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 lagringsplats @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 lagringsplatser @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Vill du verkligen ta bort lagringsplatsen ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 tagg @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 taggar @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Vill du verkligen ta bort taggen ""? diff --git a/src-ui/src/locale/messages.th_TH.xlf b/src-ui/src/locale/messages.th_TH.xlf index e1d2f53c6e..88d8b1c76b 100644 --- a/src-ui/src/locale/messages.th_TH.xlf +++ b/src-ui/src/locale/messages.th_TH.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 ปิด @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 ก่อนหน้า @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 ถัดไป @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 เดือนก่อนหน้า @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 เดือนถัดไป @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ชช @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ปิด @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 เลือกเดือน @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ชั่วโมง @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 นน @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 เลือกปี @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 นาที @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 แรก @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 เพิ่มชั่วโมง @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ก่อนหน้า @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ลดชั่วโมง @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ต่อไป @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 เพิ่มนาที @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ล่าสุด @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ลดนาที @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 วว @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 วินาที @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 เพิ่มวินาที @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ลดวินาที @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 เอกสาร @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Enable @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ กำลังโหลด... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 ค้นหาขั้นสูง @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 ยืนยันการลบ @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Password has been changed, you will be logged out momentarily. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 การยืนยัน @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Relative dates - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - ตอนนี้ - From @@ -3882,11 +3878,19 @@ นำเข้า + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + ตอนนี้ + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Within 1 week @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Within 1 month @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Within 3 months @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Within 1 year @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 This year @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 This month @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Yesterday + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 พาธ @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 สี @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Filter path - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned ไม่กำหนด @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Open filter @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Code @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Copy codes @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emails must match @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Passwords must match @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profile updated successfully @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Error saving profile @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Error generating auth token @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Error disconnecting social account @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Error fetching TOTP settings @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP activated successfully @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Error activating TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP deactivated successfully @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Error deactivating TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Custom fields @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 ชื่อ & เนื้อหา @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 File type @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 อื่น ๆ ที่คล้ายกัน @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 เท่ากับ @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 ว่างเปล่า @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 ไม่ว่างเปล่า @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 มากกว่า @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 น้อยกว่า @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Without correspondent @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Without document type @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 ไม่มีพาธจัดเก็บ @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 ไม่มีแท็กใด ๆ @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Title: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Owner: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Owner not in: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 ไม่มีเจ้าของ @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Error updating permissions @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Successfully created . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Error occurred while creating . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Error occurred while saving . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Associated documents will not be deleted. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Error while deleting element @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Permissions updated successfully @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 This operation will permanently delete all objects. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Objects deleted successfully @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Error deleting objects @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 พาธจัดเก็บ @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 พาธจัดเก็บ @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Do you really want to delete the storage path ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 แท็ก @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 แท็ก @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Do you really want to delete the tag ""? diff --git a/src-ui/src/locale/messages.tr_TR.xlf b/src-ui/src/locale/messages.tr_TR.xlf index 784b4fc794..6010c26173 100644 --- a/src-ui/src/locale/messages.tr_TR.xlf +++ b/src-ui/src/locale/messages.tr_TR.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Kapat @@ -13,16 +13,16 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader - / Slaytı + / Slaytı Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Önceki @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Sonraki @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Önceki ay @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Sonraki ay @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Kapat @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Ay seçin @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saat @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Yıl seçin @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Dakika @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 İlk @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saati arttır @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Önceki @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saati azalt @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Sonraki @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Dakikayı arttır @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Son @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Dakikayı azalt @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saniye @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saniyeyi arttır @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Saniyeyi azalt @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -308,7 +308,7 @@ src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 58 - Belgeyi aç + Belge aç Could not add : @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Belgeler @@ -444,7 +444,7 @@ src/app/app.component.ts 178 - Kontrol paneli, “Gelen Kutusu” gibi kaydedilmiş görünümleri göstermek için kullanılabilir. > Görünümler, oluşturduktan sonra Yönet > Kaydedilmiş Görünümler altında bulunur. + Gösterge paneli, “Gelen Kutusu” gibi kaydedilmiş görünümleri göstermek için kullanılabilir. > Görünümler, oluşturduktan sonra Yönet > Kaydedilmiş Görünümler altında bulunur. Drag-and-drop documents here to start uploading or place them in the consume folder. You can also drag-and-drop documents anywhere on all other pages of the web app. Once you do, Paperless-ngx will start training its machine learning algorithms. @@ -484,7 +484,7 @@ src/app/app.component.ts 208 - Künyeler, muhataplar, belge türleri ve depolama yollarının tümü bu sayfalar kullanılarak yönetilebilir. Bunlar ayrıca belge düzenleme görünümünden de oluşturulabilirler. + Etiketler, muhataplar, belge türleri ve depolama dizinlerinin tümü bu sayfaları kullanılarak yönetilebilir. Ayrıca belge düzenleme görünümünden de oluşturulabilirler. Manage e-mail accounts and rules for automatically importing documents. @@ -572,7 +572,7 @@ src/app/components/admin/config/config.component.html 25 - Bu ayar hakkındaki belgeyi okuyun + Bu ayar hakkındaki dokümantasyonu okuyun Enable @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Etkinleştir @@ -596,7 +596,7 @@ src/app/components/document-detail/document-detail.component.html 374 - Gözardı et + Vazgeç Save @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -756,7 +756,7 @@ src/app/components/manage/saved-views/saved-views.component.html 52 - Show + Göster lines @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + satır Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Yükleniyor... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + En aşağı git + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -960,7 +968,7 @@ src/app/components/admin/settings/settings.component.html 68 - Tarih Gösterimi + Tarih gösterimi Date format @@ -1048,7 +1056,7 @@ src/app/components/admin/settings/settings.component.html 139 - Karanlık modunda küçük resimleri tersine çevir + Karanlık modda küçük resimlerin renklerini tersine çevir Theme Color @@ -1244,7 +1252,7 @@ src/app/components/admin/settings/settings.component.html 221 - Gelişmiş arama sonuçlarını dahil etmeyin + Gelişmiş arama sonuçlarını dahil etme Full search links to @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Gelişmiş arama @@ -1284,7 +1292,7 @@ src/app/components/admin/settings/settings.component.html 237 - Toplu düzenlemec + Toplu düzenleme Show confirmation dialogs @@ -1292,7 +1300,7 @@ src/app/components/admin/settings/settings.component.html 240 - Onaylama iletişim kutuları göster + Onaylama kutularını göster Apply on close @@ -1300,7 +1308,7 @@ src/app/components/admin/settings/settings.component.html 241 - Kapanışta uygula + Kapatırken uygula Notes @@ -1472,7 +1480,7 @@ src/app/components/common/input/permissions/permissions-form/permissions-form.component.html 57 - Kullanıcı: + Kullanıcılar: Groups: @@ -1588,7 +1596,7 @@ src/app/components/admin/settings/settings.component.html 351 - Kontrol panodaki bildirimleri bastır + Kontrol panelindeki bildirimleri sustur This will suppress all messages about document processing status on the dashboard. @@ -1596,7 +1604,7 @@ src/app/components/admin/settings/settings.component.html 351 - Bu, kontrol panodaki belge işleme durumuyla ilgili tüm iletileri bastırır. + Bu, kontrol panelindeki belge işleme durumuyla ilgili tüm iletileri sustur. Cancel @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -1744,7 +1752,7 @@ src/app/components/app-frame/app-frame.component.ts 180 - Ayarlar kaydedilirken bir hata oluştu. + Ayarlar kaydedilirken bir hata meydana geldi. File Tasks @@ -2060,7 +2068,7 @@ src/app/components/admin/tasks/tasks.component.html 134 - {VAR_PLURAL, plural, =1 {Bir görev} other { toplam görevler}} + {VAR_PLURAL, plural, =1 {Bir görev} other { toplam görev}}  ( selected) @@ -2076,7 +2084,7 @@ src/app/components/admin/tasks/tasks.component.html 148,150 - Failed + Başarısız Complete @@ -2084,7 +2092,7 @@ src/app/components/admin/tasks/tasks.component.html 156,158 - Complete + Tamamlandı Started @@ -2092,7 +2100,7 @@ src/app/components/admin/tasks/tasks.component.html 164,166 - Started + Başladı Queued @@ -2100,7 +2108,7 @@ src/app/components/admin/tasks/tasks.component.html 172,174 - Queued + Sırada Result @@ -2124,7 +2132,7 @@ src/app/components/admin/tasks/tasks.component.ts 111 - Tümünü yoksay + Tümünü yok say Confirm Dismiss All @@ -2132,7 +2140,7 @@ src/app/components/admin/tasks/tasks.component.ts 152 - İptal etmeyi onayla + Tümünü Susturmayı Onayla Dismiss all tasks? @@ -2140,7 +2148,7 @@ src/app/components/admin/tasks/tasks.component.ts 153 - Tüm işlerini iptal et? + Tüm işleri yok say? Error dismissing tasks @@ -2148,7 +2156,7 @@ src/app/components/admin/tasks/tasks.component.ts 161 - Error dismissing tasks + Görevleri yok sayarken bir hata meydana geldi Error dismissing task @@ -2156,7 +2164,7 @@ src/app/components/admin/tasks/tasks.component.ts 170 - Error dismissing task + Görevi yok sayarken bir hata meydana geldi queued @@ -2204,7 +2212,7 @@ src/app/components/app-frame/app-frame.component.html 241 - Çöp kutusu + Çöp Kutusu Manage trashed documents that are pending deletion. @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2432,7 +2440,7 @@ src/app/components/admin/trash/trash.component.html 94 - {VAR_PLURAL, plural, =1 {Çöpte bir belge var} other { çöpteki toplam belge}} + {VAR_PLURAL, plural, =1 {Çöpte bir belge var} other {Çöpte toplam belge var}} Confirm delete @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Silmeyi onayla @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2548,7 +2556,7 @@ src/app/components/admin/trash/trash.component.ts 131 - Belge(ler) silinirken hata oluştu + Belge(ler) silinirken bir hata meydana geldi Document "" restored @@ -2564,7 +2572,7 @@ src/app/components/admin/trash/trash.component.ts 155 - "" belgesi geri yüklenirlen hata oluştu + "" belgesi geri yüklenirken bir hata meydana geldi Document(s) restored @@ -2580,7 +2588,7 @@ src/app/components/admin/trash/trash.component.ts 173 - Belge(leri) geri yüklerken hata oluştu + Belge(leri) geri yüklenirken bir hata meydana geldi Users & Groups @@ -2604,7 +2612,7 @@ src/app/components/admin/users-groups/users-groups.component.html 4 - Grup yada kullanıcı oluştur, düzenle yada sil. + Grup yada kullanıcı; oluştur, düzenle yada sil. Users @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Parola değiştirildi, otomatik olarak çıkış yapılacak. @@ -2784,7 +2792,7 @@ src/app/components/admin/users-groups/users-groups.component.ts 135 - Kullanıcı kaydedilirken hata oluştu. + Kullanıcı kaydedilirken bir hata meydana geldi. Confirm delete user account @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -2884,7 +2892,7 @@ src/app/components/admin/users-groups/users-groups.component.ts 188 - Grup kaydedilirken hata oluştu. + Grup kaydedilirken bir hata meydana geldi. Confirm delete user group @@ -2984,7 +2992,7 @@ src/app/components/app-frame/app-frame.component.html 141 - Belgeleri aç + Açık Belgeler Close all @@ -3004,7 +3012,7 @@ src/app/components/app-frame/app-frame.component.html 172 - Yönet + Yönetim Correspondents @@ -3088,7 +3096,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 133 - Depolama Yolları + Depolama Dizinleri Custom Fields @@ -3108,7 +3116,7 @@ src/app/components/manage/custom-fields/custom-fields.component.html 2 - Özel alanlar + Özel Alanlar Workflows @@ -3420,7 +3428,7 @@ src/app/components/app-frame/global-search/global-search.component.ts 249 - Successfully updated object. + Nesne başarıyla güncellendi. Error occurred saving object. @@ -3432,7 +3440,7 @@ src/app/components/app-frame/global-search/global-search.component.ts 252 - Error occurred saving object. + Nesneyi kaydederken bir hatayla karşılașıldı. Clear All @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Onayla @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3532,7 +3540,7 @@ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html 22 - Use metadata from: + Şu kaynaklardan meta verileri kullan: Regenerate all metadata @@ -3540,7 +3548,7 @@ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html 24 - Regenerate all metadata + Tüm metaverileri yeniden oluştur Try to include archive version in merge for non-PDF files @@ -3548,7 +3556,7 @@ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html 32 - Try to include archive version in merge for non-PDF files + PDF olmayan dosyalar için birleştirme işlemine arşiv sürümünü dahil etmeye çalış Delete original documents after successful merge @@ -3556,7 +3564,7 @@ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html 36 - Delete original documents after successful merge + Birleştirme işlemi başarıyla tamamlandıktan sonra orijinal belgeleri sil Note that only PDFs will be included. @@ -3564,7 +3572,7 @@ src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html 39 - Note that only PDFs will be included. + Yalnızca PDF dosyaları dahil edilecektir. Note that only PDFs will be rotated. @@ -3572,7 +3580,7 @@ src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html 25 - Note that only PDFs will be rotated. + Yalnızca PDF dosyaları döndürülecektir. View @@ -3632,7 +3640,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts 94 - Alan kaydedilirken hata oluştu. + Alan kaydedilirken bir hata meydana geldi. Today @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3716,7 +3724,7 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html 101 - Doğru + Evet False @@ -3732,7 +3740,7 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html 102 - Yanlış + Hayır Search docs... @@ -3822,18 +3830,6 @@ Göreceli tarihler - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - şimdi - From @@ -3882,11 +3878,19 @@ Eklendi + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + şimdi + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 1 hafta içinde @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 1 ay içinde @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 3 ay içinde @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 1 yıl içinde @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Bu yıl @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Bu ay @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Dün + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Geçen Hafta + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Geçtiğimiz ay + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Geçen çeyrek + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Geçen yıl + Matching algorithm @@ -4060,7 +4096,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html 44 - 3-character currency code + 3-harfli para birimi kodu Use locale @@ -4068,7 +4104,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.html 44 - Use locale + Yerel kullan Create new custom field @@ -4076,7 +4112,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts 118 - Create new custom field + Yeni bir özel alan oluştur Edit custom field @@ -4084,7 +4120,7 @@ src/app/components/common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component.ts 122 - Edit custom field + Özel alanı düzenle Create new document type @@ -4124,7 +4160,7 @@ src/app/components/common/edit-dialog/group-edit-dialog/group-edit-dialog.component.ts 36 - Create new user group + Yeni bir kullanıcı grubu oluştur Edit user group @@ -4374,7 +4410,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 42 - Consumption scope + Tüketim kapsamı See docs for .eml processing requirements @@ -4382,7 +4418,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 42 - See docs for .eml processing requirements + .eml işleme gereksinimleri için kullanma kılavuzuna bakınız Attachment type @@ -4406,7 +4442,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 47 - Include only files matching + Yalnızca şu ile eşleşen dosyaları dahil et Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. @@ -4418,7 +4454,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 48 - Optional. Wildcards e.g. *.pdf or *invoice* allowed. Can be comma-separated list. Case insensitive. + İsteğe bağlı. Joker karakterler, örneğin *.pdf veya *fatura* olarak kullanılabilir. Virgülle ayrılmış liste olabilir. Büyük/küçük harf duyarlı değildir. Exclude files matching @@ -4466,7 +4502,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html 59 - Kural ile Sahip ata + Kuraldan sahip ata Assign document type @@ -4570,7 +4606,7 @@ tüm krite src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts 57 - Process message as .eml and attachments separately + Mesajı .eml olarak ve ekleri ayrı ayrı işle System default @@ -4724,9 +4760,9 @@ tüm krite src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 - Yol + Dizin See <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>the documentation</a>. @@ -4734,7 +4770,7 @@ tüm krite src/app/components/common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component.html 13 - İlgili belgeyi "<a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>" incele</a>. + İlgili belgeyi <a target='_blank' href='https://docs.paperless-ngx.com/advanced_usage/#file-name-handling'>incele</a>. Preview @@ -4808,7 +4844,7 @@ tüm krite src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Renk @@ -4818,7 +4854,7 @@ tüm krite src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component.html 15 - Parent + Üst düğüm Inbox tag @@ -4952,7 +4988,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Çift faktörlü Doğrulama @@ -4968,11 +5004,11 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Çift faktörlü Doğrulamayı kapat @@ -5098,7 +5134,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 134 - Positive values will trigger after the date, negative values before. + Pozitif değerler tarihten sonra, negatif değerler tarihten önce tetiklenecektir. Relative to @@ -5106,7 +5142,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 139 - Relative to + Şunun akrabası Custom field @@ -5130,7 +5166,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 149 - Recurring + Tekrarlanan Trigger is recurring. @@ -5138,7 +5174,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 149 - Trigger is recurring. + Tetikleyici tekrar ediyor. Recurring interval days @@ -5146,7 +5182,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 153 - Recurring interval days + Tekrarlayan aralık günleri Repeat the trigger every n days. @@ -5154,7 +5190,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 153 - Repeat the trigger every n days. + Tetiği her "n" günde bir tekrarlayın. Trigger for documents that match all filters specified below. @@ -5162,7 +5198,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 158 - Trigger for documents that match all filters specified below. + Aşağıda belirtilen tüm filtrelerle eşleşen belgeler için tetikleyici. Filter filename @@ -5186,7 +5222,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 163 - Filter sources + Kaynakları filtrele Filter path @@ -5196,13 +5232,13 @@ tüm krite Filtre Yolu - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5218,7 +5254,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 165 - Apply to documents consumed via this mail rule. + Bu posta kuralı aracılığıyla kullanılan belgelere uygulayın. Content matching algorithm @@ -5226,7 +5262,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 168 - Content matching algorithm + İçerik eşleştirme algoritması Content matching pattern @@ -5234,7 +5270,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 170 - Content matching pattern + İçerik eşleştirme modeli Advanced Filters @@ -5242,7 +5278,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 183 - Advanced Filters + Gelişmiş Filtreler Add filter @@ -5250,7 +5286,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 190 - Add filter + Filtre ekle No advanced workflow filters defined. @@ -5258,7 +5294,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 195 - No advanced workflow filters defined. + Gelişmiş bir iş akışı filtresi tanımlanmamıştır. Complete the custom field query configuration. @@ -5266,7 +5302,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 224,226 - Complete the custom field query configuration. + Özel alan sorgu yapılandırmasını tamamlayın. Action type @@ -5274,7 +5310,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 258 - Action type + Eylem türü Assign title @@ -5290,7 +5326,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 263 - Can include some placeholders, see <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>documentation</a>. + Bazı yer tutucular içerebilir, bkz. <a target='_blank' href='https://docs.paperless-ngx.com/usage/#workflows'>dokümantasyon</a>. Assign tags @@ -5306,7 +5342,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 267 - Assign storage path + Depolama dizini atayın Assign custom fields @@ -5314,7 +5350,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 268 - Assign custom fields + Özel alanları atayın Assign owner @@ -5322,7 +5358,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 272 - Sahip Ata + Sahip ata Assign view permissions @@ -5346,7 +5382,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 320 - Remove tags + Etiketleri kaldır Remove all @@ -5378,7 +5414,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 358 - Remove all + Tümünü kaldır Remove correspondents @@ -5394,7 +5430,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 332 - Remove document types + Tüm belge tiplerini kaldır Remove storage paths @@ -5402,7 +5438,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 338 - Remove storage paths + Tüm depolama dizinlerini kaldır Remove custom fields @@ -5410,7 +5446,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 344 - Remove custom fields + Özel alanları kaldır Remove owners @@ -5418,7 +5454,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 351 - Remove owners + Tüm sahipleri kaldır Remove permissions @@ -5426,7 +5462,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 357 - Remove permissions + İzinleri kaldır View permissions @@ -5434,7 +5470,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 360 - View permissions + İzinleri görüntüle Edit permissions @@ -5442,7 +5478,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 379 - Edit permissions + İzinleri düzenle Email subject @@ -5490,7 +5526,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 420 - Use parameters for webhook body + Webhook gövdesi için parametreleri kullanın Send webhook payload as JSON @@ -5498,7 +5534,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 421 - Send webhook payload as JSON + Webhook yükünü JSON olarak gönder Webhook params @@ -5590,7 +5626,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 109 - İşleme başladı + Tüketim işlemi başladı Document Added @@ -5646,7 +5682,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 203 - Has any of these tags + Bu herhangi etiketlere sahip Has all of these tags @@ -5654,7 +5690,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - Has all of these tags + Bu tüm etiketlere sahip Does not have these tags @@ -5662,7 +5698,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 217 - Does not have these tags + Bu etiketlere sahip değil Has correspondent @@ -5678,7 +5714,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 232 - Does not have correspondents + Muhatablara sahip değil Has document type @@ -5686,7 +5722,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 240 - Has document type + Belge türüne sahip Does not have document types @@ -5694,7 +5730,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 248 - Does not have document types + Belge türlerine sahip değil Has storage path @@ -5702,7 +5738,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 256 - Has storage path + Depolama dizinine sahip Does not have storage paths @@ -5710,7 +5746,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 264 - Does not have storage paths + Depolama dizininlerine sahip değil Matches custom field query @@ -5718,7 +5754,7 @@ tüm krite src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 272 - Matches custom field query + Özel alan sorgusuyla eşleşir Create new workflow @@ -5742,7 +5778,7 @@ tüm krite src/app/components/common/email-document-dialog/email-document-dialog.component.html 2,6 - {VAR_PLURAL, plural, =1 {Email Document} other {Email Documents}} + {VAR_PLURAL, plural, =1 {1 Posta Belgesi} other { Posta Belgesi}} Email address(es) @@ -5778,7 +5814,7 @@ tüm krite src/app/components/common/email-document-dialog/email-document-dialog.component.html 27 - Use archive version + Arşiv sürümünü kullan Send email @@ -5794,7 +5830,7 @@ tüm krite src/app/components/common/email-document-dialog/email-document-dialog.component.html 37 - Some email servers may reject messages with large attachments. + Bazı e-posta sunucuları büyük ekleri olan mesajları reddedebilir. Email sent @@ -5810,7 +5846,7 @@ tüm krite src/app/components/common/email-document-dialog/email-document-dialog.component.ts 69 - Error emailing documents + Belgeleri e-posta ile gönderirken bir hatayla karşılașıldı Error emailing document @@ -5818,7 +5854,7 @@ tüm krite src/app/components/common/email-document-dialog/email-document-dialog.component.ts 70 - Belgeyi postalarken hata oluştu + Belgeyi postalarken bir hata meydana geldi Include @@ -5884,7 +5920,7 @@ tüm krite Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Atanmadı @@ -5893,7 +5929,7 @@ tüm krite Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 filtresini aç @@ -6140,7 +6176,7 @@ tüm krite src/app/components/common/input/switch/switch.component.html 39 - Note: value has not yet been set and will not apply until explicitly changed + Not: Değer henüz belirlenmemiştir ve değiştirilene kadar geçerli olmayacaktır Add tag @@ -6252,7 +6288,7 @@ tüm krite src/app/components/common/pdf-editor/pdf-editor.component.html 44 - Add / remove document split here + Burada belge ayrıcı ekle/kaldır Split here @@ -6284,7 +6320,7 @@ tüm krite src/app/components/common/pdf-editor/pdf-editor.component.html 94 - Copy metadata + Meta veriyi kopyala Delete original @@ -6456,7 +6492,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 33 - API Auth Token + API Yetkilendirme Tokeni Copy @@ -6470,7 +6506,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6504,7 +6540,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 47 - Regenerate auth token + Kimlik doğrulama tokenini yeniden oluştur Copied! @@ -6514,7 +6550,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6528,7 +6564,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 56 - Warning: changing the token cannot be undone + Uyarı: Token değiştirilmesi geri alınamaz Connected social accounts @@ -6536,7 +6572,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 62 - Connected social accounts + Bağlı sosyal hesaplar Set a password before disconnecting social account. @@ -6544,7 +6580,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 66 - Set a password before disconnecting social account. + Sosyal medya hesabını kaldırmadan önce bir şifre belirleyin. Disconnect @@ -6560,7 +6596,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 74 - Disconnect social account + sosyal hesabı kaldır Warning: disconnecting social accounts cannot be undone @@ -6568,7 +6604,7 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 84 - Warning: disconnecting social accounts cannot be undone + Uyarı: sosyal hesapların sistemden kaldırılması geri alınamaz Connect new social account @@ -6576,61 +6612,61 @@ tüm krite src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 89 - Connect new social account + Yeni sosyal hesap bağla Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 - Scan the QR code with your authenticator app and then enter the code below + Doğrulama uygulamanızla QR kodunu tarayın ve ardından aşağıya kodu girin Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 - Authenticator secret + Kimlik doğrulama sırrı You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 - You can store this secret and use it to reinstall your authenticator app at a later time. + Bu gizli bilgiyi saklayabilir ve daha sonra kimlik doğrulama uygulamanızı yeniden yüklemek için kullanabilirsiniz. Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 - Code + Kod Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 - Recovery codes will not be shown again, make sure to save them. + Kurtarma kodları bir daha gösterilmeyecektir, mutlaka kaydediniz. Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 - Copy codes + Kodları kopyala Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Emailler eşleşmeli @@ -6638,7 +6674,7 @@ tüm krite Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Şifreler eşleşmeli @@ -6646,7 +6682,7 @@ tüm krite Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Profil başarıyla güncellendi @@ -6654,73 +6690,73 @@ tüm krite Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 - Error saving profile + Profil kaydedilirken bir hata ile karşılaşıldı Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 - Error generating auth token + Yetkilendirme tokeni oluştururken bir hatayla karşılaşıldı Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 - Error disconnecting social account + Sosyal hesapları kaldırırken bir hata ile karşılaşıldı Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 - Error fetching TOTP settings + TOTP ayarları alınırken bir hata ile karşılaşıldı TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 - TOTP activated successfully + TOTP başarıyla etkinleştirildi Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 - Error activating TOTP + TOTP etkinleştirilirken bir hata ile karşılaşıldı TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 - TOTP deactivated successfully + TOTP başarıyla devre dışı bırakıldı Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 - Error deactivating TOTP + TOTP devre dışı bırakılırken bir hata ile karşılaşıldı No existing links @@ -6728,7 +6764,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.html 8,10 - No existing links + Herhangi bir mevcut link bulunmuyor Share @@ -6736,7 +6772,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.html 32 - Share + Paylaş Share archive version @@ -6744,7 +6780,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.html 48 - Share archive version + Arşiv sürümünü paylaş Expires @@ -6752,7 +6788,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.html 52 - Expires + Son Kullanım Tarihi 1 day @@ -6764,7 +6800,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.ts 102 - 1 day + 1 gün 7 days @@ -6772,7 +6808,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.ts 26 - 7 days + 7 gün 30 days @@ -6808,7 +6844,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.ts 83 - Linkleri getirirken hata oluştu + Linkler alınırken bir hata meydana geldi days @@ -6824,7 +6860,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.ts 131 - Linki silerken hata oluştu + Linki silerken bir hata meydana geldi Error creating link @@ -6832,7 +6868,7 @@ tüm krite src/app/components/common/share-links-dialog/share-links-dialog.component.ts 159 - Linki oluşturma hatası + Link oluşturulurken bir hata meydana geldi Environment @@ -6928,7 +6964,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 76 - Göç Durumu + Veritabanı İşlemleri Durumu Up to date @@ -6936,7 +6972,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 80 - Up to date + Güncel Latest Migration @@ -6944,7 +6980,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 85 - Latest Migration + En Son Uygulanan Veritabanı İşlemleri Pending Migrations @@ -6952,7 +6988,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 87 - Pending Migrations + Bekleyen Veritabanı İşlemleri Tasks Queue @@ -6960,7 +6996,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 105 - Tasks Queue + Görev Sırası Redis Status @@ -6976,7 +7012,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 127 - Celery Status + Celery'nin Durumu Health @@ -6984,7 +7020,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 153 - Health + Sağlık Search Index @@ -6992,7 +7028,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 157 - Search Index + Arama İndeksi Run Task @@ -7008,7 +7044,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 245 - Run Task + Görevi Çalıştır Last Updated @@ -7016,7 +7052,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 184 - Last Updated + Son Güncellenme Tarihi Classifier @@ -7024,7 +7060,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 189 - Classifier + Sınıflandırıcı Last Trained @@ -7032,7 +7068,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 218 - Last Trained + Son Eğitim Tarihi Sanity Checker @@ -7040,7 +7076,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 223 - Sanity Checker + Son Geçerlilik Kontrol Edilme Tarihi Last Run @@ -7048,7 +7084,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 252 - Last Run + Son Çalıştırma WebSocket Connection @@ -7056,7 +7092,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 257 - WebSocket Connection + Websocket Bağlantısı OK @@ -7064,7 +7100,7 @@ tüm krite src/app/components/common/system-status-dialog/system-status-dialog.component.html 261 - OK + Tamam Copy Raw Error @@ -7072,7 +7108,7 @@ tüm krite src/app/components/common/toast/toast.component.html 43 - Copy Raw Error + Hatayı Olduğu Gibi Kopyala Hint: saved views can be created from the documents list @@ -7080,7 +7116,7 @@ tüm krite src/app/components/dashboard/dashboard.component.html 42 - Hint: saved views can be created from the documents list + İpucu: kaydedilmiş görünümler documents list 'den oluşturulabilir Hello , welcome to @@ -7088,7 +7124,7 @@ tüm krite src/app/components/dashboard/dashboard.component.ts 61 - Hello , welcome to + Merhaba , hoşgeldiniz Welcome to @@ -7096,7 +7132,7 @@ tüm krite src/app/components/dashboard/dashboard.component.ts 63 - Welcome to + Hoş Geldiniz Dashboard updated @@ -7104,7 +7140,7 @@ tüm krite src/app/components/dashboard/dashboard.component.ts 94 - Dashboard updated + Kontrol Paneli yenilendi Error updating dashboard @@ -7112,7 +7148,7 @@ tüm krite src/app/components/dashboard/dashboard.component.ts 97 - Error updating dashboard + Kontrol panelini yenilerken bir hatayla karşılașıldı Show all @@ -7136,7 +7172,7 @@ tüm krite src/app/components/document-list/document-list.component.html 323 - Muhataba göre süz + Muhataba göre filtrele Filter by document type @@ -7152,7 +7188,7 @@ tüm krite src/app/components/document-list/document-list.component.html 363 - Filter by document type + Belge türüne göre filtrele Filter by storage path @@ -7168,7 +7204,7 @@ tüm krite src/app/components/document-list/document-list.component.html 370 - Filter by storage path + Depolama dizinine göre filtrele Filter by owner @@ -7176,7 +7212,7 @@ tüm krite src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html 74 - Filter by owner + Sahibine göre filtrele Yes @@ -7208,7 +7244,7 @@ tüm krite src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html 149 - No documents + Belge yok Statistics @@ -7224,7 +7260,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 28 - Go to inbox + Gelen kutusuna git Documents in inbox @@ -7232,7 +7268,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 29 - Documents in inbox + Gelen kutusundaki belgeler Go to documents @@ -7240,7 +7276,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 33 - Go to documents + Belgelere git Total documents @@ -7248,7 +7284,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 34 - Total documents + Toplam Belge Total characters @@ -7256,7 +7292,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 38 - Total characters + Toplam Karakter Current ASN @@ -7264,7 +7300,7 @@ tüm krite src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html 43 - Current ASN + Mevcut ASN Other @@ -7280,7 +7316,7 @@ tüm krite src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 6 - Upload documents + Belge veya belgeler yükle or drop files anywhere @@ -7288,7 +7324,7 @@ tüm krite src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 7 - or drop files anywhere + veya dosyaları herhangi bir yere bırakın Dismiss completed @@ -7342,7 +7378,7 @@ tüm krite src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html 2 - Paperless-ngx is running! + Paperless-ngx çalışıyor! You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. @@ -7350,7 +7386,7 @@ tüm krite src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html 3 - You're ready to start uploading documents! Explore the various features of this web app on your own, or start a quick tour using the button below. + Belge yüklemeye hazırsınız! Bu web uygulamasının çeşitli özelliklerini kendiniz keşfedin veya aşağıdaki düğmeyi kullanarak hızlı bir tura başlayın. More detail on how to use and configure Paperless-ngx is always available in the documentation. @@ -7358,7 +7394,7 @@ tüm krite src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html 4 - More detail on how to use and configure Paperless-ngx is always available in the documentation. + Paperless-ngx'in kullanımı ve yapılandırılması hakkında daha fazla bilgiye her zaman dokümantasyon adresinden ulaşabilirsiniz. Thanks for being a part of the Paperless-ngx community! @@ -7366,7 +7402,7 @@ tüm krite src/app/components/dashboard/widgets/welcome-widget/welcome-widget.component.html 7 - Thanks for being a part of the Paperless-ngx community! + Paperless-ngx topluluğunun bir parçası olduğunuz için teşekkür ederiz! Start the tour @@ -7402,7 +7438,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 7,8 - of + 'dan/den - @@ -7410,7 +7446,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 11 - - + - + @@ -7418,7 +7454,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 19 - + + + Download original @@ -7438,7 +7474,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 91 - Reprocess + Yeniden İşle Print @@ -7446,7 +7482,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 58 - Print + Yazdır More like this @@ -7470,7 +7506,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1392 - PDF Editor + PDF Düzenleyici Send @@ -7478,7 +7514,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 84 - Send + Gönder Previous @@ -7508,7 +7544,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -7742,7 +7778,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 321,324 - Notes + Notlar History @@ -7750,7 +7786,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 332 - History + Geçmiş Save & next @@ -7758,7 +7794,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 369 - Kaydet & sonraki + Kaydet ve sonrakine geç Save & close @@ -7766,7 +7802,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 372 - Save & close + Kaydet ve kapat Document loading... @@ -7774,7 +7810,7 @@ tüm krite src/app/components/document-detail/document-detail.component.html 382 - Document loading... + Belge Yükleniyor... Enter Password @@ -7790,7 +7826,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 416,418 - An error occurred loading content: + İçerik yüklenirken bir hata ile karşılaşıldı: Document changes detected @@ -7798,7 +7834,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 450 - Document changes detected + Belge değişiklikler algılandı The version of this document in your browser session appears older than the existing version. @@ -7806,7 +7842,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 451 - The version of this document in your browser session appears older than the existing version. + Tarayıcı oturumunuzdaki bu belgenin sürümü, mevcut sürümden daha eski görünüyor. Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. @@ -7814,7 +7850,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 452 - Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. + Belgeyi buraya kaydetmek, yapılan diğer değişikliklerin üzerine yazabilir. Mevcut sürümü geri yüklemek için değişikliklerinizi geri alın veya belgeyi kapatın. Ok @@ -7822,7 +7858,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 454 - Ok + Tamam Next document @@ -7830,7 +7866,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 580 - Next document + Sonraki belge Previous document @@ -7838,7 +7874,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 590 - Previous document + Önceki belge Close document @@ -7858,7 +7894,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 605 - Save document + Belgeyi kaydet Save and close / next @@ -7866,7 +7902,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 614 - Save and close / next + Kaydet, kapat ve bir sonrakine geç Error retrieving metadata @@ -7874,7 +7910,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 669 - Metaveri alınırken hata oluştu + Metaveri alınırken bir hata meydana geldi Error retrieving suggestions. @@ -7882,7 +7918,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 698 - Önerileri getirirken hata oluştu. + Öneriler getirilirken bir hata meydana geldi. Document "" saved successfully. @@ -7894,7 +7930,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 894 - Document "" saved successfully. + "" belgesi başarıyla kaydedildi. Error saving document "" @@ -7902,7 +7938,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 900 - Error saving document "" + Belgeyi kaydederken bir hata ile karşılaşıldı "" Error saving document @@ -7910,7 +7946,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 950 - Error saving document + Belge kaydedilirken bir hata ile karşılaşıldı Do you really want to move the document "" to the trash? @@ -7918,7 +7954,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 982 - Do you really want to move the document "" to the trash? + belgesini gerçekten çöp kutusuna taşımak istiyor musunuz? Documents can be restored prior to permanent deletion. @@ -7930,7 +7966,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 754 - Documents can be restored prior to permanent deletion. + Belgeler kalıcı olarak silinmeden önce geri yüklenebilir. Move to trash @@ -7942,7 +7978,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 756 - Move to trash + Çöp kutusuna taşı Error deleting document @@ -7950,7 +7986,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1004 - Error deleting document + Belge silinirken bir hata meydana geldi Reprocess confirm @@ -7962,7 +7998,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 794 - Reprocess confirm + Yeniden işlemeyi onayla This operation will permanently recreate the archive file for this document. @@ -7970,7 +8006,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1025 - This operation will permanently recreate the archive file for this document. + Bu işlem, bu belge için arşiv dosyasını kalıcı olarak yeniden oluşturacaktır. The archive file will be re-generated with the current settings. @@ -7978,7 +8014,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1026 - The archive file will be re-generated with the current settings. + Arşiv dosyası mevcut ayarlarla yeniden oluşturulacaktır. Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. @@ -7986,7 +8022,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1036 - Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. + "" için yeniden işleme işlemi arka planda başlayacaktır. İşlem tamamlandıktan sonra bu belgeyi kapatıp yeniden açtıktan veya yeniden yükledikten sonra yeni içeriği görebilirsiniz. Error executing operation @@ -7994,7 +8030,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1047 - Error executing operation + İşlemi gerçekleştirirken bir hata ile karşılaşıldı Error downloading document @@ -8002,7 +8038,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1096 - Error downloading document + Belge indirilirken bir hata meydana geldi Page Fit @@ -8010,7 +8046,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1173 - Page Fit + Sayfa Sığdır PDF edit operation for "" will begin in the background. @@ -8018,7 +8054,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1411 - PDF edit operation for "" will begin in the background. + "" için PDF düzenleme işlemleri arka planda başlayacak. Error executing PDF edit operation @@ -8026,7 +8062,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1423 - Error executing PDF edit operation + PDF düzenleme işlemleri uygulanırken bir hata ile karşılaşıldı Print failed. @@ -8034,7 +8070,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1460 - Print failed. + Yazdırma başarısız oldu. Error loading document for printing. @@ -8042,7 +8078,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1472 - Error loading document for printing. + Belgeyi yazdırmaya hazırlarken bir hata ile karşılaşıldı. An error occurred loading tiff: @@ -8054,7 +8090,7 @@ tüm krite src/app/components/document-detail/document-detail.component.ts 1541 - An error occurred loading tiff: + tiff'i yüklenirken bir hata meydana geldi No entries found. @@ -8062,7 +8098,7 @@ tüm krite src/app/components/document-history/document-history.component.html 10 - No entries found. + Hiçbir kayıt bulunamadı. Edit: @@ -8094,7 +8130,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.html 51 - Muhataba göre süz + Muhatabları filtrele Filter document types @@ -8106,7 +8142,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.html 62 - Belge türlerini göre filtrele + Belge türlerine göre filtrele Filter storage paths @@ -8118,7 +8154,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.html 73 - Filter storage paths + Depolama dizinlerine göre filtrele Custom fields @@ -8132,9 +8168,9 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 - Custom fields + Özel alanlar Filter custom fields @@ -8142,7 +8178,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 62 - Filter custom fields + Özel alanları filtrele Set values @@ -8150,7 +8186,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 70 - Set values + Değerleri ayarla Rotate @@ -8158,7 +8194,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 94 - Rotate + Döndür Merge @@ -8166,7 +8202,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 97 - Merge + Birleştir Include: @@ -8174,7 +8210,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 123 - Include: + Dahil et: Archived files @@ -8182,7 +8218,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 127 - Archived files + Arşivlenen dosyalar Original files @@ -8190,7 +8226,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 131 - Original files + Orijinal dosyalar Use formatted filename @@ -8198,7 +8234,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.html 136 - Use formatted filename + Formatlanmış dosya adını kullan Error executing bulk operation @@ -8206,7 +8242,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 290 - Error executing bulk operation + Toplu işlemler çalıştırılırken bir hata ile karşılaşıldı "" @@ -8244,7 +8280,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 405 - Etiket atanmayi doğrulayın + Etiket atanmasını onaylayın This operation will add the tag "" to selected document(s). @@ -8260,7 +8296,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 416,418 - This operation will add the tags to selected document(s). + Bu işlem etiketlerini seçili belge veya belgelere ekleyecektir. This operation will remove the tag "" from selected document(s). @@ -8276,7 +8312,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 429,431 - This operation will remove the tags from selected document(s). + Bu işlem etiketlerini seçili belge veya belgelerden kaldıracaktır. This operation will add the tags and remove the tags on selected document(s). @@ -8340,7 +8376,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 550 - Confirm storage path assignment + Depolama dizinlerini atamayı onaylayın This operation will assign the storage path "" to selected document(s). @@ -8348,7 +8384,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 552 - This operation will assign the storage path "" to selected document(s). + Bu işlem, depolama dizinini, seçilmiş belgeye atayacaktır. This operation will remove the storage path from selected document(s). @@ -8356,7 +8392,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 554 - This operation will remove the storage path from selected document(s). + Bu işlem belgeden depolama dizinini kaldıracaktır. Confirm custom field assignment @@ -8364,7 +8400,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 583 - Confirm custom field assignment + Özel alan atamasını onaylayın This operation will assign the custom field "" to selected document(s). @@ -8372,7 +8408,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 589 - This operation will assign the custom field "" to selected document(s). + Bu işlem, özel alanını, seçilmiş belgeye atayacaktır. This operation will assign the custom fields to selected document(s). @@ -8380,7 +8416,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 594,596 - This operation will assign the custom fields to selected document(s). + Bu işlem, özel alanlarını, seçilmiş belgeye atayacaktır. This operation will remove the custom field "" from selected document(s). @@ -8388,7 +8424,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 602 - This operation will remove the custom field "" from selected document(s). + Bu işlem alanını belgeden kaldıracaktır. This operation will remove the custom fields from selected document(s). @@ -8396,7 +8432,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 607,609 - This operation will remove the custom fields from selected document(s). + Bu işlem alanlarını belgeden kaldıracaktır. This operation will assign the custom fields and remove the custom fields on selected document(s). @@ -8404,7 +8440,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 611,615 - This operation will assign the custom fields and remove the custom fields on selected document(s). + Bu işlem, alanlarını atayacak ve alanlarını seçili belgeden kaldıracaktır. Move selected document(s) to the trash? @@ -8412,7 +8448,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 753 - Move selected document(s) to the trash? + Seçilmiş belgeyi çöp kutusuna taşımak istiyor musunuz? This operation will permanently recreate the archive files for selected document(s). @@ -8420,7 +8456,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 795 - This operation will permanently recreate the archive files for selected document(s). + Bu işlem, seçilmiş belge için arşiv dosyasını kalıcı olarak yeniden oluşturacaktır. The archive files will be re-generated with the current settings. @@ -8428,7 +8464,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 796 - The archive files will be re-generated with the current settings. + Arşiv dosyaları mevcut ayarlarla yeniden oluşturulacaktır. Rotate confirm @@ -8436,7 +8472,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 828 - Rotate confirm + Döndürmeyi onaylayın This operation will permanently rotate the original version of document(s). @@ -8444,7 +8480,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 829 - This operation will permanently rotate the original version of document(s). + Bu işlem belgede, orijinal sürümündeki sayfaları kalıcı olarak döndürecektir. Merge confirm @@ -8452,7 +8488,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 848 - Merge confirm + Birleştirmeyi onaylayın This operation will merge selected documents into a new document. @@ -8460,7 +8496,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 849 - This operation will merge selected documents into a new document. + Bu işlem belgeyi yeni bir belgede birleştirecektir. Merged document will be queued for consumption. @@ -8468,7 +8504,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 868 - Merged document will be queued for consumption. + Birleştirilen belge tüketim için sıraya alınacaktır. Custom fields updated. @@ -8476,7 +8512,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 892 - Custom fields updated. + Özel alanlar güncelleştirildi. Error updating custom fields. @@ -8484,7 +8520,7 @@ tüm krite src/app/components/document-list/bulk-editor/bulk-editor.component.ts 901 - Error updating custom fields. + Özel alanları güncellerken bir hatayla karşılaşıldı. {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} @@ -8492,7 +8528,7 @@ tüm krite src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html 3,7 - {VAR_PLURAL, plural, =1 {Set custom fields for 1 document} other {Set custom fields for documents}} + {VAR_PLURAL, plural, =1 {1 belge için özel alanlar ayarla} other { belge için özel alanlar ayarla}} Select custom fields @@ -8500,7 +8536,7 @@ tüm krite src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html 13 - Select custom fields + Özel alanları seçin {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also @@ -8509,8 +8545,7 @@ tüm krite src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html 73,78 - {VAR_PLURAL, plural, =1 {This operation will also remove 1 custom field from the selected documents.} other {This operation will also - remove custom fields from the selected documents.}} + {VAR_PLURAL, plural, =1 {Bu işlem, seçilen belgelerden 1 özel alanı da kaldıracaktır.} other {Bu işlem, seçilen belgelerden özel alanı da kaldıracaktır.}} Filter by tag @@ -8530,7 +8565,7 @@ tüm krite src/app/components/document-list/document-card-large/document-card-large.component.html 91 - View notes + Notları görüntüle Created: @@ -8546,7 +8581,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 91,92 - Created: + Oluşturulmuş: Added: @@ -8590,7 +8625,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 106 - {VAR_PLURAL, plural, =1 {1 page} other { pages}} + {VAR_PLURAL, plural, =1 {1 sayfa} other { sayfa}} Shared @@ -8610,7 +8645,7 @@ tüm krite src/app/pipes/username.pipe.ts 35 - Shared + Paylaşıldı Score: @@ -8626,7 +8661,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 20 - Toggle tag filter + Etiket filtresini aç/kapat Toggle correspondent filter @@ -8634,7 +8669,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 43 - Muhatap süzgecini aç/kapat + Muhatap filtresini aç/kapat Toggle document type filter @@ -8642,7 +8677,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 59 - Toggle document type filter + Belge türü filtresini aç/kapat Toggle storage path filter @@ -8650,7 +8685,7 @@ tüm krite src/app/components/document-list/document-card-small/document-card-small.component.html 66 - Toggle storage path filter + Depolama dizini filtresini aç/kapat Select @@ -8702,7 +8737,7 @@ tüm krite src/app/components/document-list/document-list.component.html 18 - Select: + Seç: None @@ -8712,7 +8747,7 @@ tüm krite src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8758,7 +8793,7 @@ tüm krite src/app/components/document-list/document-list.component.html 117 - All saved views + Tüm kaydedilen görünümler {VAR_PLURAL, plural, =1 {Selected of one document} other {Selected of documents}} @@ -8766,7 +8801,7 @@ tüm krite src/app/components/document-list/document-list.component.html 137 - {VAR_PLURAL, plural, =1 {Seçili 1 belgeden} other {Seçili , belgeden}} + {VAR_PLURAL, plural, =1 {Bir belgeden seçilen } other { belgeden Seçilen }} {VAR_PLURAL, plural, =1 {One document} other { documents}} @@ -8782,7 +8817,7 @@ tüm krite src/app/components/document-list/document-list.component.html 143 - (süzüldü) + (filtrelendi) Reset filters @@ -8794,7 +8829,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.html 107 - Süzgeçleri sıfırla + Filtreleri sıfırla Error while loading documents @@ -8802,7 +8837,7 @@ tüm krite src/app/components/document-list/document-list.component.html 169 - Error while loading documents + Belgeleri yüklerken bir hata ile karşılaşıldı Sort by ASN @@ -8810,7 +8845,7 @@ tüm krite src/app/components/document-list/document-list.component.html 198 - Sort by ASN + ASN'ye göre sıralama ASN @@ -8820,7 +8855,7 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -8846,7 +8881,7 @@ tüm krite src/app/components/document-list/document-list.component.html 216 - Sort by title + Başlığa göre sırala Sort by owner @@ -8854,7 +8889,7 @@ tüm krite src/app/components/document-list/document-list.component.html 229 - Sort by owner + Sahibine göre sırala Owner @@ -8870,7 +8905,7 @@ tüm krite src/app/data/document.ts 96 - Sahibi + Sahip Sort by notes @@ -8878,7 +8913,7 @@ tüm krite src/app/components/document-list/document-list.component.html 238 - Sort by notes + Notlara göre sırala Sort by document type @@ -8886,7 +8921,7 @@ tüm krite src/app/components/document-list/document-list.component.html 247 - Sort by document type + Belge türüne göre sırala Sort by storage path @@ -8894,7 +8929,7 @@ tüm krite src/app/components/document-list/document-list.component.html 256 - Sort by storage path + Kayıt dizinine göre sırala Sort by created date @@ -8902,7 +8937,7 @@ tüm krite src/app/components/document-list/document-list.component.html 265 - Sort by created date + Oluşturma tarihine göre sırala Sort by added date @@ -8910,7 +8945,7 @@ tüm krite src/app/components/document-list/document-list.component.html 274 - Sort by added date + Sisteme eklendiği tarihe göre sırala Sort by number of pages @@ -8918,7 +8953,7 @@ tüm krite src/app/components/document-list/document-list.component.html 283 - Sort by number of pages + Sayfa sayısına göre sırala Pages @@ -8938,7 +8973,7 @@ tüm krite src/app/data/paperless-config.ts 91 - Pages + Sayfalar Shared @@ -8946,7 +8981,7 @@ tüm krite src/app/components/document-list/document-list.component.html 290,292 - Shared + Paylaşılmış Sort by @@ -8954,7 +8989,7 @@ tüm krite src/app/components/document-list/document-list.component.html 297,298 - Sort by + göre sırala Edit document @@ -8970,7 +9005,7 @@ tüm krite src/app/components/document-list/document-list.component.html 332 - Preview document + Belgeyi ön izle Reset filters / selection @@ -8978,7 +9013,7 @@ tüm krite src/app/components/document-list/document-list.component.ts 296 - Reset filters / selection + Filtreleri / seçimi sıfırla Open first [selected] document @@ -8986,7 +9021,7 @@ tüm krite src/app/components/document-list/document-list.component.ts 324 - Open first [selected] document + İlk [selected] belgeyi aç Previous page @@ -8994,7 +9029,7 @@ tüm krite src/app/components/document-list/document-list.component.ts 340 - Previous page + Önceki sayfa Next page @@ -9002,7 +9037,7 @@ tüm krite src/app/components/document-list/document-list.component.ts 352 - Next page + Sonraki sayfa View "" saved successfully. @@ -9018,7 +9053,7 @@ tüm krite src/app/components/document-list/document-list.component.ts 391 - Failed to save view "". + "" görünümünü kaydederken bir hata ile karşılaşıldı. View "" created successfully. @@ -9034,13 +9069,13 @@ tüm krite src/app/components/document-list/filter-editor/filter-editor.component.html 90 - Dates + Tarihler Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Başlık ve içerik @@ -9048,15 +9083,15 @@ tüm krite File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 - File type + Dosya tipi More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Benzeri gibi @@ -9064,7 +9099,7 @@ tüm krite equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 eşittir @@ -9072,7 +9107,7 @@ tüm krite is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 boş @@ -9080,7 +9115,7 @@ tüm krite is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 boş değil @@ -9088,23 +9123,23 @@ tüm krite greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 - greater than + den büyük less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 - less than + den küçük Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Muhatap: @@ -9112,7 +9147,7 @@ tüm krite Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Muhatapsız @@ -9120,15 +9155,15 @@ tüm krite Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 - Document type: + Belge türü: Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Belge türü olmayan @@ -9136,47 +9171,47 @@ tüm krite Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 - Storage path: + Depolama dizini: Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 - Without storage path + Depolama dizini olmadan Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 - Tag: + Etiket: Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 - Herhangi bir künye olmayan + Etiketsiz Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 - Custom fields query + Özel alan sorgusu Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Başlık: @@ -9184,7 +9219,7 @@ tüm krite ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9192,25 +9227,25 @@ tüm krite Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 - Owner: + Sahibi: Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 - Owner not in: + Sahibi içinde değil: Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 - Without an owner + Sahipsiz Save current view @@ -9242,7 +9277,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 20 - Gösterge tablosunda göster + Kontrol panelinde göster Filter rules error occurred while saving this view @@ -9250,7 +9285,7 @@ tüm krite src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html 13 - Filter rules error occurred while saving this view + Bu görünümü kaydederken filtre kuralları ile ilgili bir hata meydana geldi The error returned was @@ -9258,7 +9293,7 @@ tüm krite src/app/components/document-list/save-view-config-dialog/save-view-config-dialog.component.html 14 - The error returned was + Hatanın gönderdiği Enter note @@ -9266,7 +9301,7 @@ tüm krite src/app/components/document-notes/document-notes.component.html 5 - Enter note + Not ekle Please enter a note. @@ -9274,7 +9309,7 @@ tüm krite src/app/components/document-notes/document-notes.component.html 6,8 - Please enter a note. + Lütfen bir not girin Add note @@ -9282,7 +9317,7 @@ tüm krite src/app/components/document-notes/document-notes.component.html 14 - Add note + Not ekle Delete note @@ -9294,7 +9329,7 @@ tüm krite src/app/components/document-notes/document-notes.component.html 27 - Delete note + Notu sil Error saving note @@ -9302,7 +9337,7 @@ tüm krite src/app/components/document-notes/document-notes.component.ts 81 - Error saving note + Not kaydedilirken bir hata oluştu Error deleting note @@ -9310,7 +9345,7 @@ tüm krite src/app/components/document-notes/document-notes.component.ts 95 - Error deleting note + Not silerken bir hata oluştu Drop files to begin upload @@ -9330,7 +9365,7 @@ tüm krite src/app/components/file-drop/file-drop.component.ts 146 - Initiating upload... + Yükleme başlatılıyor... Failed to read dropped items: @@ -9338,7 +9373,7 @@ tüm krite src/app/components/file-drop/file-drop.component.ts 142 - Failed to read dropped items: + Bırakılan öğeleri okurken bir hata meydana geldi: correspondent @@ -9378,7 +9413,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.html 4 - Customize the data fields that can be attached to documents. + Belgelere eklenebilecek veri alanlarını özelleştirin. Add Field @@ -9386,7 +9421,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.html 9 - Add Field + Alan Ekle Data Type @@ -9394,7 +9429,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.html 18 - Data Type + Veri Tipi Filter Documents () @@ -9404,21 +9439,21 @@ tüm krite src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 - Filter Documents () + Belgeleri Filtrele () No fields defined. @@ -9426,7 +9461,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.html 70 - No fields defined. + Herhangi bir alan tanımlanmadı. Confirm delete field @@ -9434,7 +9469,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.ts 102 - Confirm delete field + Alanı silmeyi onayla This operation will permanently delete this field. @@ -9442,7 +9477,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.ts 103 - This operation will permanently delete this field. + Bu işlem alanı kalıcı olarak silecektir. Deleted field "" @@ -9450,7 +9485,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.ts 112 - Deleted field "" + "" alanı silindi Error deleting field "". @@ -9458,7 +9493,7 @@ tüm krite src/app/components/manage/custom-fields/custom-fields.component.ts 121 - Error deleting field "". + "" alanını silerken bir hata ile karşılaşıldı. document type @@ -9490,7 +9525,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 2 - Mail Settings + Posta Ayarları Mail accounts @@ -9498,7 +9533,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 12 - Mail accounts + Posta Hesapları Add Account @@ -9506,7 +9541,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 14 - Add Account + Hesap Ekle Connect Gmail Account @@ -9514,7 +9549,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 18 - Connect Gmail Account + Gmail Hesabını Bağla Connect Outlook Account @@ -9522,7 +9557,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 23 - Connect Outlook Account + Outlook Hesabını Bağla Server @@ -9530,7 +9565,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 31 - Server + Sunucu Process Mail @@ -9542,7 +9577,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 86 - Process Mail + Posta İşlemi No mail accounts defined. @@ -9550,7 +9585,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 95 - No mail accounts defined. + Tanımlanmış bir posta hesabı yok. Mail rules @@ -9558,7 +9593,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 103 - Mail rules + E-posta kuralları Add Rule @@ -9566,7 +9601,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 105 - Add Rule + Kural Ekle Sort Order @@ -9574,7 +9609,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 112 - Sort Order + Sıralama Disabled @@ -9586,7 +9621,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.html 41 - Disabled + Devre dışı View Processed Mail @@ -9594,7 +9629,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 143 - View Processed Mail + İşlenmiş Postaları Görüntüle No mail rules defined. @@ -9602,7 +9637,7 @@ tüm krite src/app/components/manage/mail/mail.component.html 183 - No mail rules defined. + Tanımlanmış bir posta kuralı mevcut değil. Error retrieving mail accounts @@ -9610,7 +9645,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 105 - Error retrieving mail accounts + Posta hesaplarından bilgi alırken bir hata meydana geldi Error retrieving mail rules @@ -9618,7 +9653,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 127 - Error retrieving mail rules + Posta kurallarını yüklerken bir hata meydana geldi OAuth2 authentication success @@ -9626,7 +9661,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 135 - OAuth2 authentication success + OAuth2 yetkilendirmesi başarılı OAuth2 authentication failed, see logs for details @@ -9634,7 +9669,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 146 - OAuth2 authentication failed, see logs for details + OAuth2 yetkilendirmesi ile ilgili bir hata meydana geldi, detaylar için günlüklere göz atın Saved account "". @@ -9642,7 +9677,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 170 - Saved account "". + "" hesabı kaydedildi. Error saving account. @@ -9650,7 +9685,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 182 - Error saving account. + Hesabı kaydederken bir hata ile karşılaşıldı. Confirm delete mail account @@ -9658,7 +9693,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 190 - Confirm delete mail account + Posta hesabının silinmesini onaylayın This operation will permanently delete this mail account. @@ -9666,7 +9701,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 191 - This operation will permanently delete this mail account. + Bu işlem, bu posta hesabını kalıcı olarak silecektir. Deleted mail account "" @@ -9674,7 +9709,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 201 - Deleted mail account "" + "" posta hesabı silindi Error deleting mail account "". @@ -9682,7 +9717,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 212 - Error deleting mail account "". + "" posta hesabı silinirken bir hata meydana geldi. Processing mail account "" @@ -9690,7 +9725,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 224 - Processing mail account "" + "" posta hesabı işleniyor Error processing mail account "" @@ -9698,7 +9733,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 229 - Error processing mail account "" + "" posta hesabı işlenirken bir hata meydana geldi Saved rule "". @@ -9706,7 +9741,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 247 - Saved rule "". + "" kuralı kaydedildi. Error saving rule. @@ -9714,7 +9749,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 258 - Error saving rule. + Kuralı kaydedilirken bir hata meydana geldi. Rule "" enabled. @@ -9722,7 +9757,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 274 - Rule "" enabled. + "" kuralı aktifleştirildi. Rule "" disabled. @@ -9730,7 +9765,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 275 - Rule "" disabled. + "" kuralı devre dışı bırakıldı. Error toggling rule "". @@ -9738,7 +9773,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 280 - Error toggling rule "". + Kuralı açarken veya kapatırken bir hata meydana geldi "". Confirm delete mail rule @@ -9746,7 +9781,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 291 - Confirm delete mail rule + Posta hesabı kuralının silinmesini onaylayın This operation will permanently delete this mail rule. @@ -9754,7 +9789,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 292 - This operation will permanently delete this mail rule. + Bu işlem, bu posta kuralını kalıcı olarak silecektir. Deleted mail rule "" @@ -9762,7 +9797,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 302 - Deleted mail rule "" + "" posta kuralı silindi Error deleting mail rule "". @@ -9770,7 +9805,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 313 - Error deleting mail rule "". + "" posta kuralı silinirken bir hata meydana geldi. Permissions updated @@ -9778,7 +9813,7 @@ tüm krite src/app/components/manage/mail/mail.component.ts 337 - Permissions updated + İzinler güncellendi Error updating permissions @@ -9788,9 +9823,9 @@ tüm krite src/app/components/manage/management-list/management-list.component.ts - 349 + 353 - Error updating permissions + İzinler güncellenirken bir hata meydana geldi Processed Mail for @@ -9798,7 +9833,7 @@ tüm krite src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 2 - Processed Mail for + için postalar işlendi No processed email messages found. @@ -9806,7 +9841,7 @@ tüm krite src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 20 - No processed email messages found. + İşlenmiş posta mesajı bulunamadı. Received @@ -9814,7 +9849,7 @@ tüm krite src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 33 - Received + Teslim Alındı Processed @@ -9822,7 +9857,7 @@ tüm krite src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html 34 - Processed + İşlendi Processed mail(s) deleted @@ -9830,7 +9865,7 @@ tüm krite src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.ts 72 - Processed mail(s) deleted + İşlenmiş posta veya postalar silindi Filter by: @@ -9850,7 +9885,7 @@ tüm krite src/app/components/manage/management-list/management-list.component.html 20 - Şuna göre süz: + Şuna göre filtrele: Matching @@ -9910,13 +9945,13 @@ tüm krite src/app/components/manage/management-list/management-list.component.html 67 - {VAR_PLURAL, plural, =1 {One } other { total }} + {VAR_PLURAL, plural, =1 {Bir } other {Toplam }} Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9928,81 +9963,81 @@ tüm krite Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 - Successfully created . + başarıyla oluşturuldu. Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 - Error occurred while creating . + oluşturulurken bir hata meydana geldi. Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 - Successfully updated "". + "" başarıyla güncellendi. Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 - Error occurred while saving . + kaydederken bir hata meydana geldi. Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 - Associated documents will not be deleted. + İliştirilmiş belgeler silinmeyecektir. Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 - Error while deleting element + Öğeyi silerken bir hata meydana geldi Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 - Permissions updated successfully + İzinler başarıyla güncellendi This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 - This operation will permanently delete all objects. + Bu işlem tüm nesneleri kalıcı olarak silecektir. Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 - Objects deleted successfully + Nesneler başarıyla silindi Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 - Error deleting objects + Nesneleri silerken bir hata ile karşılaşıldı Customize the views of your documents. @@ -10010,7 +10045,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 4 - Customize the views of your documents. + Belgelerinizin görünümünü özelleştirin. Documents page size @@ -10018,7 +10053,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 41 - Documents page size + Belgelerin sayfa sayısı Display as @@ -10026,7 +10061,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 44 - Display as + Olarak göster Table @@ -10034,7 +10069,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 46 - Table + Tablo Small Cards @@ -10042,7 +10077,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 47 - Small Cards + Küçük Kartlar Large Cards @@ -10050,7 +10085,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.html 48 - Large Cards + Büyük Kartlar No saved views defined. @@ -10074,7 +10109,7 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.ts 158 - Views saved successfully. + Görünümler başarıyla kaydedildi. Error while saving views. @@ -10082,13 +10117,13 @@ tüm krite src/app/components/manage/saved-views/saved-views.component.ts 163 - Error while saving views. + Görünümleri kaydederken bir hata ile karşılaşıldı. storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 depolama dizini @@ -10096,7 +10131,7 @@ tüm krite storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 depolama dizinleri @@ -10104,33 +10139,33 @@ tüm krite Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 - Do you really want to delete the storage path ""? + "" kayıt dizinini gerçekten silmek istiyor musunuz? tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 - künye + etiket tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 - künyeler + etiketler Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 - "" künyesini silmeyi gerçekten istiyor musunuz? + "" etiketini silmeyi gerçekten istiyor musunuz? Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. @@ -10138,7 +10173,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.html 4 - Use workflows to customize the behavior of Paperless-ngx when events 'trigger' a workflow. + İş akışlarını kullanarak, olaylar bir iş akışını tetiklediğinde Paperless-ngx'in davranışını özelleştirin. Add Workflow @@ -10146,7 +10181,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.html 9 - Add Workflow + İş Akışı Ekleyin No workflows defined. @@ -10154,7 +10189,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.html 80 - No workflows defined. + Herhangi bir iş akışı tanımlanmamış. Saved workflow "". @@ -10162,7 +10197,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 90 - Saved workflow "". + "" iş akışı kaydedildi. Error saving workflow. @@ -10170,7 +10205,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 98 - Error saving workflow. + İş akışını kaydederken bir hata ile karşılaşıldı. Confirm delete workflow @@ -10178,7 +10213,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 131 - Confirm delete workflow + İş akışını silmeyi onayla This operation will permanently delete this workflow. @@ -10186,7 +10221,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 132 - This operation will permanently delete this workflow. + Bu işlem iş akışını kalıcı olarak silecektir. Deleted workflow "". @@ -10194,7 +10229,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 142 - Deleted workflow "". + "" iş akışı silindi. Error deleting workflow "". @@ -10202,7 +10237,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 149 - Error deleting workflow "". + iş akışını silerken bir hata ile karşılaşıldı. Enabled workflow "" @@ -10210,7 +10245,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 162 - Enabled workflow "" + "" iş akışı aktifleştirildi Disabled workflow "" @@ -10218,7 +10253,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 163 - Disabled workflow "" + "" iş akışı devre dışı bırakıldı Error toggling workflow "". @@ -10226,7 +10261,7 @@ tüm krite src/app/components/manage/workflows/workflows.component.ts 170 - Error toggling workflow "". + "" açılıp yada kapanırken bir hata ile karşılaşıldı. Not Found @@ -10234,7 +10269,7 @@ tüm krite src/app/components/not-found/not-found.component.html 6 - Not Found + Bulunamadı Go to Dashboard @@ -10242,7 +10277,7 @@ tüm krite src/app/components/not-found/not-found.component.html 9 - Go to Dashboard + Kontrol Paneline git Equal to @@ -10250,7 +10285,7 @@ tüm krite src/app/data/custom-field-query.ts 24 - Equal to + Eşittir In @@ -10258,7 +10293,7 @@ tüm krite src/app/data/custom-field-query.ts 25 - In + İçinde Is null @@ -10266,7 +10301,7 @@ tüm krite src/app/data/custom-field-query.ts 26 - Is null + Null'dur Exists @@ -10274,7 +10309,7 @@ tüm krite src/app/data/custom-field-query.ts 27 - Exists + Mevcut Contains @@ -10282,7 +10317,7 @@ tüm krite src/app/data/custom-field-query.ts 28 - Contains + İçeren Contains (case-insensitive) @@ -10290,7 +10325,7 @@ tüm krite src/app/data/custom-field-query.ts 29 - Contains (case-insensitive) + İçeren (Büyük-küçük harf duyarsız) Greater than @@ -10298,7 +10333,7 @@ tüm krite src/app/data/custom-field-query.ts 30 - Greater than + Den büyük Greater than or equal to @@ -10306,7 +10341,7 @@ tüm krite src/app/data/custom-field-query.ts 31 - Greater than or equal to + Büyüktür ya da eşittir Less than @@ -10314,7 +10349,7 @@ tüm krite src/app/data/custom-field-query.ts 32 - Less than + Den küçük Less than or equal to @@ -10322,7 +10357,7 @@ tüm krite src/app/data/custom-field-query.ts 33 - Less than or equal to + Küçüktür veya eşittir Range @@ -10330,7 +10365,7 @@ tüm krite src/app/data/custom-field-query.ts 34 - Range + Aralık Boolean @@ -10338,7 +10373,7 @@ tüm krite src/app/data/custom-field.ts 19 - Boolean + Evet/Hayır Date @@ -10346,7 +10381,7 @@ tüm krite src/app/data/custom-field.ts 23 - Date + Tarih Integer @@ -10354,7 +10389,7 @@ tüm krite src/app/data/custom-field.ts 27 - Integer + Tam sayı Number @@ -10362,7 +10397,7 @@ tüm krite src/app/data/custom-field.ts 31 - Number + Sayı Monetary @@ -10370,7 +10405,7 @@ tüm krite src/app/data/custom-field.ts 35 - Monetary + Parasal Text @@ -10378,7 +10413,7 @@ tüm krite src/app/data/custom-field.ts 39 - Text + Metin Url @@ -10386,7 +10421,7 @@ tüm krite src/app/data/custom-field.ts 43 - Url + Bağlantı Document Link @@ -10394,7 +10429,7 @@ tüm krite src/app/data/custom-field.ts 47 - Document Link + Belge Bağlantısı Long Text @@ -10402,7 +10437,7 @@ tüm krite src/app/data/custom-field.ts 55 - Long Text + Uzun Metin Search score @@ -10507,7 +10542,7 @@ tüm krite src/app/data/matching-model.ts 46 - None: Disable matching + Yok: Eşleştirmeyi devre dışı bırak General Settings @@ -10515,7 +10550,7 @@ tüm krite src/app/data/paperless-config.ts 50 - General Settings + Genel Ayarlar OCR Settings @@ -10523,7 +10558,7 @@ tüm krite src/app/data/paperless-config.ts 51 - OCR Settings + OCR Ayarları Barcode Settings @@ -10531,7 +10566,7 @@ tüm krite src/app/data/paperless-config.ts 52 - Barcode Settings + Barkod Ayarları Output Type @@ -10539,7 +10574,7 @@ tüm krite src/app/data/paperless-config.ts 76 - Output Type + Çıktı Türü Language @@ -10547,7 +10582,7 @@ tüm krite src/app/data/paperless-config.ts 84 - Language + Dil Mode @@ -10555,7 +10590,7 @@ tüm krite src/app/data/paperless-config.ts 98 - Mode + Mod Skip Archive File @@ -10563,7 +10598,7 @@ tüm krite src/app/data/paperless-config.ts 106 - Skip Archive File + Arşiv Dosyasını Atla Image DPI @@ -10571,7 +10606,7 @@ tüm krite src/app/data/paperless-config.ts 114 - Image DPI + Görüntü DPI Clean @@ -10579,7 +10614,7 @@ tüm krite src/app/data/paperless-config.ts 121 - Clean + Sıfırdan İşle Deskew @@ -10587,7 +10622,7 @@ tüm krite src/app/data/paperless-config.ts 129 - Deskew + Deskew Rotate Pages @@ -10595,7 +10630,7 @@ tüm krite src/app/data/paperless-config.ts 136 - Rotate Pages + Sayfaları Döndür Rotate Pages Threshold @@ -10603,7 +10638,7 @@ tüm krite src/app/data/paperless-config.ts 143 - Rotate Pages Threshold + Sayfalar Döndürmek İçin Gerekli Eşik Değeri Max Image Pixels @@ -10611,7 +10646,7 @@ tüm krite src/app/data/paperless-config.ts 150 - Max Image Pixels + Maksimum Görüntü Pikseli Color Conversion Strategy @@ -10619,7 +10654,7 @@ tüm krite src/app/data/paperless-config.ts 157 - Color Conversion Strategy + Renk Dönüştürme Stratejisi OCR Arguments @@ -10627,7 +10662,7 @@ tüm krite src/app/data/paperless-config.ts 165 - OCR Arguments + OCR Argümanları Application Logo @@ -10635,7 +10670,7 @@ tüm krite src/app/data/paperless-config.ts 172 - Application Logo + Sistemin Logosu Application Title @@ -10643,7 +10678,7 @@ tüm krite src/app/data/paperless-config.ts 179 - Application Title + Sistemin Başlığı Enable Barcodes @@ -10651,7 +10686,7 @@ tüm krite src/app/data/paperless-config.ts 186 - Enable Barcodes + Barkodları Etkinleştir Enable TIFF Support @@ -10659,7 +10694,7 @@ tüm krite src/app/data/paperless-config.ts 193 - Enable TIFF Support + TIFF Desteğini Etkinleştir Barcode String @@ -10667,7 +10702,7 @@ tüm krite src/app/data/paperless-config.ts 200 - Barcode String + Barkod Dizesi Retain Split Pages @@ -10675,7 +10710,7 @@ tüm krite src/app/data/paperless-config.ts 207 - Retain Split Pages + Bölünmüş Sayfaları Koru Enable ASN @@ -10683,7 +10718,7 @@ tüm krite src/app/data/paperless-config.ts 214 - Enable ASN + ASN'yi etkinleştir ASN Prefix @@ -10691,7 +10726,7 @@ tüm krite src/app/data/paperless-config.ts 221 - ASN Prefix + ASN Ön Eki Upscale @@ -10699,7 +10734,7 @@ tüm krite src/app/data/paperless-config.ts 228 - Upscale + Çözünürlüğü yükseltme DPI @@ -10707,7 +10742,7 @@ tüm krite src/app/data/paperless-config.ts 235 - DPI + DPI Max Pages @@ -10715,7 +10750,7 @@ tüm krite src/app/data/paperless-config.ts 242 - Max Pages + Maksimum Sayfa Sayısı Enable Tag Detection @@ -10723,7 +10758,7 @@ tüm krite src/app/data/paperless-config.ts 249 - Enable Tag Detection + Etiket Algılamayı Etkinleştir Tag Mapping @@ -10731,7 +10766,7 @@ tüm krite src/app/data/paperless-config.ts 256 - Tag Mapping + Etiket Eşlemesi Warning: You have unsaved changes to your document(s). @@ -10739,7 +10774,7 @@ tüm krite src/app/guards/dirty-doc.guard.ts 16 - Warning: You have unsaved changes to your document(s). + Uyarı: Belge(ler)inizde kaydedilmemiş değişiklikler var. Unsaved Changes @@ -10795,7 +10830,7 @@ tüm krite src/app/guards/dirty-saved-view.guard.ts 29 - You have unsaved changes to the saved view + Kaydedilmiş görünümde kaydedilmemiş değişiklikleriniz var Are you sure you want to close this saved view? @@ -10803,7 +10838,7 @@ tüm krite src/app/guards/dirty-saved-view.guard.ts 33 - Are you sure you want to close this saved view? + Bu kaydedilmiş görünümü kapatmak istediğinizden emin misiniz? Save and close @@ -10811,7 +10846,7 @@ tüm krite src/app/guards/dirty-saved-view.guard.ts 37 - Save and close + Kaydet ve kapat You don't have permissions to do that @@ -10819,7 +10854,7 @@ tüm krite src/app/guards/permissions.guard.ts 34 - You don't have permissions to do that + Bunu yapmak için gerekli izinlere sahip değilsiniz Last year @@ -10835,7 +10870,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 15 - %s years ago + %s yıl önce Last month @@ -10851,7 +10886,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 20 - %s months ago + %s ay önce Last week @@ -10859,7 +10894,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 24 - Last week + Geçen hafta %s weeks ago @@ -10867,7 +10902,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 25 - %s weeks ago + %s hafta önce %s days ago @@ -10875,7 +10910,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 30 - %s days ago + %s gün önce %s hour ago @@ -10883,7 +10918,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 34 - %s hour ago + %s saat önce %s hours ago @@ -10891,7 +10926,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 35 - %s hours ago + %s saat önce %s minute ago @@ -10899,7 +10934,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 39 - %s minute ago + %s dakika önce %s minutes ago @@ -10907,7 +10942,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 40 - %s minutes ago + %s dakika önce Just now @@ -10915,7 +10950,7 @@ tüm krite src/app/pipes/custom-date.pipe.ts 73 - Just now + Az önce (no title) @@ -10931,7 +10966,7 @@ tüm krite src/app/services/open-documents.service.ts 124 - You have unsaved changes to the document + Belgede kaydetmemiş değişiklikleriniz var Are you sure you want to close this document? @@ -10995,7 +11030,7 @@ tüm krite src/app/services/settings.service.ts 75 - Bulgarian + Bulgarca Catalan @@ -11075,7 +11110,7 @@ tüm krite src/app/services/settings.service.ts 135 - Hungarian + Macarca Italian @@ -11091,7 +11126,7 @@ tüm krite src/app/services/settings.service.ts 147 - Japanese + Japonca Korean @@ -11099,7 +11134,7 @@ tüm krite src/app/services/settings.service.ts 153 - Korean + Korece Luxembourgish @@ -11131,7 +11166,7 @@ tüm krite src/app/services/settings.service.ts 177 - Persian + Farsça Polish @@ -11227,7 +11262,7 @@ tüm krite src/app/services/settings.service.ts 249 - Vietnamese + Vietnamca Chinese Simplified @@ -11243,7 +11278,7 @@ tüm krite src/app/services/settings.service.ts 261 - Chinese Traditional + Geleneksel Çince ISO 8601 @@ -11259,7 +11294,7 @@ tüm krite src/app/services/settings.service.ts 603 - Successfully completed one-time migratration of settings to the database! + Ayarların veritabanına tek seferlik taşıma işlemi başarıyla tamamlandı! Unable to migrate settings to the database, please try saving manually. @@ -11267,7 +11302,7 @@ tüm krite src/app/services/settings.service.ts 604 - Unable to migrate settings to the database, please try saving manually. + Ayarları veritabanına taşıyamıyoruz, lütfen manuel olarak kaydetmeyi deneyin. You can restart the tour from the settings page. @@ -11275,7 +11310,7 @@ tüm krite src/app/services/settings.service.ts 677 - You can restart the tour from the settings page. + Ayarlar sayfasından turu yeniden başlatabilirsiniz. Connecting... @@ -11323,7 +11358,7 @@ tüm krite src/app/services/websocket-status.service.ts 25 - Document already exists. Note: existing document is in the trash. + Belge zaten mevcut. Not: Mevcut belge çöp kutusunda. Document with ASN already exists. @@ -11331,7 +11366,7 @@ tüm krite src/app/services/websocket-status.service.ts 26 - Document with ASN already exists. + ASN içeren belge zaten mevcut. Document with ASN already exists. Note: existing document is in the trash. @@ -11339,7 +11374,7 @@ tüm krite src/app/services/websocket-status.service.ts 27 - Document with ASN already exists. Note: existing document is in the trash. + ASN içeren belge zaten mevcut. Not: mevcut belge çöp kutusunda. File not found. @@ -11356,7 +11391,7 @@ tüm krite 29 Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation - Tüketim öncesi komut dosyası yok. + Tüketim öncesi komut dosyası mevcut değil. Error while executing pre-consume script. @@ -11365,7 +11400,7 @@ tüm krite 30 Pre-Consume is a term that appears like that in the documentation as well and does not need a specific translation - Tüketim öncesi komut dosyasını işlerken hata oluştu. + Tüketim öncesi komut dosyasını işlerken bir hata meydana geldi. Post-consume script does not exist. @@ -11374,7 +11409,7 @@ tüm krite 31 Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation - Tüketim sonrası komut dosyası yok. + Tüketim sonrası komut dosyası mevcut değil. Error while executing post-consume script. @@ -11383,7 +11418,7 @@ tüm krite 32 Post-Consume is a term that appears like that in the documentation as well and does not need a specific translation - Tüketim sonrası komut dosyasını işlerken hata oluştu. + Tüketim sonrası komut dosyasını işlerken bir hata meydana geldi. Received new file. diff --git a/src-ui/src/locale/messages.uk_UA.xlf b/src-ui/src/locale/messages.uk_UA.xlf index e6d8452d4e..b18b17aef3 100644 --- a/src-ui/src/locale/messages.uk_UA.xlf +++ b/src-ui/src/locale/messages.uk_UA.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Закрити @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 Попередній @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 Наступний @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Попередній місяць @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 Наступний місяць @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ГГ @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Закрити @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Оберіть місяць @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Години @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 ММ @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Оберіть рік @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Хвилини @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Перший @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Збільшити години @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Попередній @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Зменшити години @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Наступний @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Збільшити хвилини @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Останній @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Зменшити хвилини @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 СС @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Секунди @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Збільшити секунди @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 Зменшити секунди @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Документи @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Увімкнути @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ Завантаження... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Розширений пошук @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Підтвердьте видалення @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Пароль змінено, ви миттєво вийдете з системи. @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Підтвердження @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ Відносні дати - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - зараз - From @@ -3882,11 +3878,19 @@ Додано + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + зараз + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Протягом одного тижня @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Протягом одного місяця @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Протягом трьох місяців @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Протягом одного року @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Цього року @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Цього місяця @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ Вчора + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Шлях @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Колір @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Two-factor Authentication @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Disable Two-factor Authentication @@ -5194,13 +5230,13 @@ Шлях фільтра - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - Застосовувати до документів, які відповідають цьому шляху. Допускаються символи підставляння, позначені як *. Нормалізовано за регістром.</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned Не призначено @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 Відкрити фільтр @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Scan the QR code with your authenticator app and then enter the code below @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Authenticator secret @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 You can store this secret and use it to reinstall your authenticator app at a later time. @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Код @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Recovery codes will not be shown again, make sure to save them. @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Скопіювати коди @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Адреси електронної пошти повинні збігатися @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Паролі повинні збігатися @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Обліковий запис успішно оновлено @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Помилка збереження профілю @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Помилка генерації токена авторизації @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Помилка від'єднання акаунта соціальної мережі @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Помилка отримання налаштувань TOTP @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP успішно активовано @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Помилка активації TOTP @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP успішно деактивовано @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Помилка деактивації TOTP @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Власні поля @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Назва та вміст @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Тип файлу @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Більше схожих @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 дорівнює @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 не заповнено @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 заповнено @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 більше ніж @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 менше ніж @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Correspondent: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Без кореспондента @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Document type: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Без типу документа @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Storage path: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Без шляху зберігання @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Tag: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Без жодного тегу @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Custom fields query @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Назва: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 АСН: @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Власник: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Власник не в: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Без власника @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Filter Documents () @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Помилка оновлення прав доступу @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Успішно створено . @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Виникла помилка протягом створення . @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Successfully updated "". @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Виникла помилка під час збереження . @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Пов'язані документи не будуть видалені. @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Помилка видалення елемента @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Права доступу успішно оновлено @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Ця операція остаточно видалить всі об'єкти. @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Об'єкти успішно видалені @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Помилка видалення об'єктів @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 шлях зберігання @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 шляхи зберігання @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Ви дійсно хочете видалити шлях зберігання ""? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 тег @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 теги @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Ви дійсно хочете видалити тег ""? diff --git a/src-ui/src/locale/messages.vi_VN.xlf b/src-ui/src/locale/messages.vi_VN.xlf index 3dd3d0a024..ddf852ae3a 100644 --- a/src-ui/src/locale/messages.vi_VN.xlf +++ b/src-ui/src/locale/messages.vi_VN.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 Đóng @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -27,7 +27,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 @@ -37,7 +37,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 @@ -47,11 +47,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 @@ -61,11 +61,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 @@ -75,7 +75,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -85,7 +85,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -95,11 +95,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -109,7 +109,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -119,7 +119,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -129,7 +129,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -139,7 +139,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -149,7 +149,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -159,11 +159,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -173,7 +173,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -183,7 +183,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -193,7 +193,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -203,7 +203,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -213,7 +213,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -223,7 +223,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -233,7 +233,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -243,7 +243,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -253,7 +253,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -263,7 +263,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -273,7 +273,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -283,7 +283,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -293,7 +293,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -303,7 +303,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -315,7 +315,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -324,7 +324,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -448,19 +448,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 Tài liệu @@ -700,7 +700,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 Bật @@ -772,7 +772,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -930,7 +930,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -966,7 +966,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -1032,6 +1032,14 @@ Đang tải... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1505,7 +1513,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 Tìm kiếm nâng cao @@ -1881,7 +1889,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1929,7 +1937,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2770,39 +2778,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2844,11 +2852,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 Xác nhận xoá @@ -2896,7 +2904,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -3138,35 +3146,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -3208,7 +3216,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 Mật khẩu đã đổi, bạn sẽ được logout sau đây @@ -3300,7 +3308,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -4049,7 +4057,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 Xác nhận @@ -4059,7 +4067,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -4261,7 +4269,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -4445,20 +4453,6 @@ Ngày tương đối - - - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - - hiện tại @@ -4513,13 +4507,23 @@ Đã thêm + + + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + + hiện tại Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 Trong vòng 1 tuần @@ -4529,7 +4533,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 Trong vòng 1 tháng @@ -4539,7 +4543,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 Trong vòng 3 tháng @@ -4549,7 +4553,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 Trong vòng 1 năm @@ -4559,7 +4563,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 Năm nay @@ -4569,7 +4573,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 Tháng này @@ -4579,7 +4583,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -4589,6 +4593,38 @@ Hôm qua + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + Previous week + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + Previous month + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + Previous quarter + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + Previous year + Matching algorithm @@ -5535,7 +5571,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 Đường dẫn @@ -5637,7 +5673,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 Màu sắc @@ -5807,7 +5843,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 Xác thực hai yếu tố @@ -5825,11 +5861,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 Vô hiệu hóa xác thực hai yếu tố @@ -6105,15 +6141,13 @@ Lọc đường dẫn - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - - Áp dụng cho các tài liệu phù hợp với đường dẫn này. Các ký tự đại diện được chỉ định là * được cho phép. Trường hợp chuẩn hóa. </a> - + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -6915,7 +6949,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned @@ -6926,7 +6960,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 OpenFilter @@ -7593,7 +7627,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -7641,7 +7675,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -7725,7 +7759,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 Quét mã QR bằng ứng dụng Authenticator của bạn và sau đó nhập mã bên dưới @@ -7735,7 +7769,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 Bí mật xác thực @@ -7745,7 +7779,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 Bạn có thể lưu trữ bí mật này và sử dụng nó để cài đặt lại ứng dụng Authenticator của bạn sau đó. @@ -7755,7 +7789,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 Mã số @@ -7765,7 +7799,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 Mã phục hồi sẽ không được hiển thị lại, đảm bảo lưu chúng. @@ -7775,7 +7809,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 Sao chép mã @@ -7785,7 +7819,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 Email phải phù hợp @@ -7795,7 +7829,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 Mật khẩu phải khớp @@ -7805,7 +7839,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 Hồ sơ cập nhật thành công @@ -7815,7 +7849,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 Hồ sơ lưu lỗi @@ -7825,7 +7859,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 Lỗi tạo mã thông báo auth @@ -7835,7 +7869,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 Lỗi ngắt kết nối tài khoản xã hội @@ -7845,7 +7879,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 Lỗi tìm nạp cài đặt TOTP @@ -7855,7 +7889,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP kích hoạt thành công @@ -7865,11 +7899,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 Lỗi kích hoạt TOTP @@ -7879,7 +7913,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP đã vô hiệu hóa thành công @@ -7889,11 +7923,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 Lỗi hủy kích hoạt TOTP @@ -8848,7 +8882,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -9590,7 +9624,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 Trường tùy chỉnh @@ -10288,7 +10322,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -10416,7 +10450,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -10684,7 +10718,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 Tiêu đề & Nội dung @@ -10694,7 +10728,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 Loại tệp @@ -10704,7 +10738,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 Giống như @@ -10714,7 +10748,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 bằng nhau @@ -10724,7 +10758,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 trống rỗng @@ -10734,7 +10768,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 không trống @@ -10744,7 +10778,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 lớn hơn @@ -10754,7 +10788,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 ít hơn @@ -10764,7 +10798,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 Phóng viên: @@ -10774,7 +10808,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 Không có phóng viên @@ -10784,7 +10818,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 Loại tài liệu: @@ -10794,7 +10828,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 Không có loại tài liệu @@ -10804,7 +10838,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 Đường dẫn lưu trữ: @@ -10814,7 +10848,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 Không có đường dẫn lưu trữ @@ -10824,7 +10858,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 Nhãn: @@ -10834,7 +10868,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 Mà không có bất kỳ thẻ @@ -10844,7 +10878,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 Truy vấn trường tùy chỉnh @@ -10854,7 +10888,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 Tiêu đề: @@ -10864,7 +10898,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 Asn: @@ -10874,7 +10908,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 Người sở hữu: @@ -10884,7 +10918,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 Chủ sở hữu không ở: @@ -10894,7 +10928,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 Mà không có chủ sở hữu @@ -11134,19 +11168,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 Tài liệu lọc () @@ -11606,7 +11640,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 Lỗi khi cập nhật quyền @@ -11742,7 +11776,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -11756,7 +11790,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 Được tạo thành công. @@ -11766,7 +11800,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 Lỗi xảy ra trong khi tạo. @@ -11776,7 +11810,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 Cập nhật thành công "". @@ -11786,7 +11820,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 Lỗi xảy ra trong khi lưu. @@ -11796,7 +11830,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 Các tài liệu liên quan sẽ không bị xóa. @@ -11806,7 +11840,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 Lỗi trong khi xóa phần tử @@ -11816,7 +11850,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 Quyền được cập nhật thành công @@ -11826,7 +11860,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 Hoạt động này sẽ xóa vĩnh viễn tất cả các đối tượng. @@ -11836,7 +11870,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 Đối tượng đã xóa thành công @@ -11846,7 +11880,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 Lỗi xóa các đối tượng @@ -11958,7 +11992,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 Đường dẫn lưu trữ @@ -11968,7 +12002,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 Đường dẫn lưu trữ @@ -11978,7 +12012,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 Bạn có thực sự muốn xóa đường dẫn lưu trữ ""? @@ -11988,7 +12022,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 nhãn @@ -11998,7 +12032,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 Tags @@ -12008,7 +12042,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 Bạn có thực sự muốn xóa thẻ ""? diff --git a/src-ui/src/locale/messages.zh_CN.xlf b/src-ui/src/locale/messages.zh_CN.xlf index 5bf7bef8e6..7e2fc436ca 100644 --- a/src-ui/src/locale/messages.zh_CN.xlf +++ b/src-ui/src/locale/messages.zh_CN.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 关闭 @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 上一个 @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 下一个 @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 上个月 @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 下个月 @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 关闭 @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 选择月份 @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 小时 @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 选择年份 @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 分钟 @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 第一页 @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加小时 @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 上一页 @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 减少小时 @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 下一页 @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加分钟 @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 最后一页 @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 减少分钟 @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加秒 @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 减少秒 @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 文档 @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 启用 @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ 加载中... + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + 跳转到底部 + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 高级搜索 @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 确认删除 @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 密码已更改,您将会被立即注销。 @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 确认 @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ 相对日期 - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - 现在 - From @@ -3882,11 +3878,19 @@ 已添加 + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + 现在 + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 1 周内 @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 1个月内 @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 3 个月内 @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 1 年内 @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 今年 @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 本月 @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ 昨天 + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + 上周 + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + 上个月 + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + 上个季度 + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + 上年 + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 路径 @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 颜色 @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 多因素认证 (MFA) @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 禁用多因素认证 (MFA) @@ -5194,13 +5230,13 @@ 筛选路径 - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - 应用于匹配此路径的文档。允许指定为*的通配符。不区分大小写。</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned 未分配 @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 开启过滤 @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 用您的身份验证程序扫描二维码,然后在下方输入验证码 @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 身份验证器密钥 @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 您可以存储此密钥并用它来重新安装您的身份验证器应用程序。 @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 验证码 @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 恢复码将不会再次显示。请妥善保存。 @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 复制代码 @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 邮箱必须一致 @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 密码必须一致 @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 帐户信息更新成功 @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 保存帐户信息时发生错误 @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 生成验证令牌时发生错误 @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 断开社交账户时发生错误 @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 獲取TOTP 設定時出錯 @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP 啟動成功 @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 啟動TOTP時錯誤 @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP 停用成功 @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 停用TOTP時錯誤 @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 自定义字段 @@ -8699,7 +8735,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + 选择: None @@ -8709,7 +8745,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8817,7 +8853,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9037,7 +9073,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 标题 & 内容 @@ -9045,7 +9081,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 文件类型 @@ -9053,7 +9089,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 更多 @@ -9061,7 +9097,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 等于 @@ -9069,7 +9105,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 为空 @@ -9077,7 +9113,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 不为空 @@ -9085,7 +9121,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 高于 @@ -9093,7 +9129,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 低于 @@ -9101,7 +9137,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 联系人: @@ -9109,7 +9145,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 没有联系人 @@ -9117,7 +9153,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 文档类型: @@ -9125,7 +9161,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 没有文档类型 @@ -9133,7 +9169,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 存储路径: @@ -9141,7 +9177,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 没有存储路径 @@ -9149,7 +9185,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 标签: @@ -9157,7 +9193,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 没有任何标签 @@ -9165,7 +9201,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 自定义字段查询 @@ -9173,7 +9209,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 标题: @@ -9181,7 +9217,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 ASN: @@ -9189,7 +9225,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 所有者: @@ -9197,7 +9233,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 所有者不在: @@ -9205,7 +9241,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 没有所有者 @@ -9401,19 +9437,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 筛选文档 () @@ -9785,7 +9821,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 更新权限时发生错误 @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 成功创建 @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 创建 时发生错误。 @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 成功更新 @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 保存 时发生错误。 @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 已关联的文档将不会被删除。 @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 删除元素时发生错误 @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 权限更新成功 @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 此操作将永久删除所有对象。 @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 对象删除成功 @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 删除对象时发生错误 @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 保存路径 @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 保存路径 @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 您真的想要删除存储路径“ ”吗? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 标签 @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 标签 @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 您真的想要删除标签“ ”吗? diff --git a/src-ui/src/locale/messages.zh_TW.xlf b/src-ui/src/locale/messages.zh_TW.xlf index 2e1c2fecae..55e107d44d 100644 --- a/src-ui/src/locale/messages.zh_TW.xlf +++ b/src-ui/src/locale/messages.zh_TW.xlf @@ -5,7 +5,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/alert/alert.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/alert/alert.ts 50 關閉 @@ -13,7 +13,7 @@ Slide of - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 131,135 Currently selected slide number read by screen reader @@ -22,7 +22,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 157,159 上一個 @@ -30,7 +30,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/carousel/carousel.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/carousel/carousel.ts 198 下一個 @@ -38,11 +38,11 @@ Previous month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 83,85 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 上個月 @@ -50,11 +50,11 @@ Next month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/datepicker/datepicker-navigation.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/datepicker/datepicker-navigation.ts 112 下個月 @@ -62,7 +62,7 @@ HH - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 HH @@ -70,7 +70,7 @@ Close - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 關閉 @@ -78,11 +78,11 @@ Select month - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 選取月份 @@ -90,7 +90,7 @@ «« - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 «« @@ -98,7 +98,7 @@ Hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 小時 @@ -106,7 +106,7 @@ « - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 « @@ -114,7 +114,7 @@ MM - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 MM @@ -122,7 +122,7 @@ » - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 » @@ -130,11 +130,11 @@ Select year - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 選擇年份 @@ -142,7 +142,7 @@ Minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 分鐘 @@ -150,7 +150,7 @@ »» - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 »» @@ -158,7 +158,7 @@ First - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 第一頁 @@ -166,7 +166,7 @@ Increment hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加小時 @@ -174,7 +174,7 @@ Previous - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 上一頁 @@ -182,7 +182,7 @@ Decrement hours - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 減少小時 @@ -190,7 +190,7 @@ Next - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 下一頁 @@ -198,7 +198,7 @@ Increment minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加分鐘 @@ -206,7 +206,7 @@ Last - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 最後一頁 @@ -214,7 +214,7 @@ Decrement minutes - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 減少分鐘 @@ -222,7 +222,7 @@ SS - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 SS @@ -230,7 +230,7 @@ Seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -238,7 +238,7 @@ Increment seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 增加秒數 @@ -246,7 +246,7 @@ Decrement seconds - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 減少秒數 @@ -256,7 +256,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/ngb-config.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/ngb-config.ts 13 @@ -265,7 +265,7 @@ - node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.2_@angular+core@20.3.2_@angular+_4a8591e6ee586bf00b666f6438778cc7/node_modules/src/progressbar/progressbar.ts + node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@19.0.1_@angular+common@20.3.15_@angular+core@20.3.15_@angula_40533c760dbaadbd90323f0d78d15fb8/node_modules/src/progressbar/progressbar.ts 41,42 @@ -370,19 +370,19 @@ src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 src/app/components/manage/management-list/management-list.component.html - 133 + 139 文件 @@ -582,7 +582,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 123 + 125 啟用 @@ -650,7 +650,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 183 + 185 src/app/components/document-detail/document-detail.component.html @@ -764,7 +764,7 @@ src/app/components/admin/logs/logs.component.html 17 - lines + Auto refresh @@ -786,7 +786,7 @@ src/app/components/admin/logs/logs.component.html - 53 + 48 src/app/components/admin/tasks/tasks.component.html @@ -822,7 +822,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 126 + 128 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -886,6 +886,14 @@ 讀取中⋯ + + Jump to bottom + + src/app/components/admin/logs/logs.component.html + 62 + + Jump to bottom + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1274,7 +1282,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 192 + 208 進階搜尋 @@ -1606,7 +1614,7 @@ src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 48 + 47 src/app/components/common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component.html @@ -1654,7 +1662,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 182 + 184 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -1668,7 +1676,7 @@ src/app/components/manage/saved-views/saved-views.component.html 73 - 取消選取 + 取消 Use system language @@ -2378,39 +2386,39 @@ src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 115 + 121 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.html - 127 + 133 src/app/components/manage/management-list/management-list.component.ts - 243 + 247 src/app/components/manage/saved-views/saved-views.component.html @@ -2446,11 +2454,11 @@ src/app/components/manage/management-list/management-list.component.ts - 239 + 243 src/app/components/manage/management-list/management-list.component.ts - 362 + 366 確認刪除 @@ -2494,7 +2502,7 @@ src/app/components/manage/management-list/management-list.component.ts - 364 + 368 src/app/components/manage/workflows/workflows.component.ts @@ -2702,35 +2710,35 @@ src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 114 + 120 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/management-list/management-list.component.html - 124 + 130 src/app/components/manage/workflows/workflows.component.html @@ -2766,7 +2774,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 195 + 201 密碼已變更,將於稍後登出。 @@ -2846,7 +2854,7 @@ src/app/components/manage/management-list/management-list.component.ts - 366 + 370 src/app/components/manage/workflows/workflows.component.ts @@ -3474,7 +3482,7 @@ Confirmation src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 24 + 23 確認 @@ -3482,7 +3490,7 @@ Confirm src/app/components/common/confirm-dialog/confirm-dialog.component.ts - 36 + 35 src/app/components/common/permissions-dialog/permissions-dialog.component.html @@ -3658,7 +3666,7 @@ src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 106 + 111 src/app/components/common/input/date/date.component.html @@ -3822,18 +3830,6 @@ 相對日期 - - now - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 29 - - - src/app/components/common/dates-dropdown/dates-dropdown.component.html - 105 - - 現在 - From @@ -3882,11 +3878,19 @@ 新增日期 + + now + + src/app/components/common/dates-dropdown/dates-dropdown.component.html + 169 + + 現在 + Within 1 week src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 76 + 81 1 週內 @@ -3894,7 +3898,7 @@ Within 1 month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 81 + 86 1 個月內 @@ -3902,7 +3906,7 @@ Within 3 months src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 86 + 91 3 個月內 @@ -3910,7 +3914,7 @@ Within 1 year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 91 + 96 1 年內 @@ -3918,7 +3922,7 @@ This year src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 96 + 101 今年 @@ -3926,7 +3930,7 @@ This month src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 101 + 106 本月 @@ -3934,7 +3938,7 @@ Yesterday src/app/components/common/dates-dropdown/dates-dropdown.component.ts - 111 + 116 src/app/pipes/custom-date.pipe.ts @@ -3942,6 +3946,38 @@ 昨天 + + Previous week + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 121 + + 上週 + + + Previous month + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 135 + + 上個月 + + + Previous quarter + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 141 + + 上一季 + + + Previous year + + src/app/components/common/dates-dropdown/dates-dropdown.component.ts + 155 + + 去年 + Matching algorithm @@ -4722,7 +4758,7 @@ src/app/components/manage/storage-path-list/storage-path-list.component.ts - 51 + 49 路徑 @@ -4806,7 +4842,7 @@ src/app/components/manage/tag-list/tag-list.component.ts - 51 + 49 顏色 @@ -4950,7 +4986,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 137 + 139 雙重驗證 @@ -4966,11 +5002,11 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 168 + 170 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 170 + 172 停用雙重驗證 @@ -5194,13 +5230,13 @@ 篩選路徑 - - Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized.</a> + + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html 164 - 套用於符合此路徑的文件。可使用萬用字元,如 *。大小寫已正規化。</a> + Apply to documents that match this path. Wildcards specified as * are allowed. Case-normalized. Filter mail rule @@ -5652,7 +5688,7 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 210 - 標籤包含 + 標籤符合 Does not have these tags @@ -5882,7 +5918,7 @@ Not assigned src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 90 + 95 Filter drop down element to filter for documents with no correspondent/type/tag assigned 未被指派的 @@ -5891,7 +5927,7 @@ Open filter src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts - 748 + 767 開啟 篩選器 @@ -6468,7 +6504,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 155 + 157 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6512,7 +6548,7 @@ src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 162 + 164 src/app/components/common/share-links-dialog/share-links-dialog.component.html @@ -6580,7 +6616,7 @@ Scan the QR code with your authenticator app and then enter the code below src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 114 + 116 使用驗證器應用程式掃描 QR 碼,然後輸入下方的驗證碼 @@ -6588,7 +6624,7 @@ Authenticator secret src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 117 + 119 驗證器金鑰 @@ -6596,7 +6632,7 @@ You can store this secret and use it to reinstall your authenticator app at a later time. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 118 + 120 可保存此金鑰,以在日後重新安裝驗證器應用程式時使用。 @@ -6604,7 +6640,7 @@ Code src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 121 + 123 驗證碼 @@ -6612,7 +6648,7 @@ Recovery codes will not be shown again, make sure to save them. src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 140 + 142 復原碼將不會再次顯示。請妥善保存。 @@ -6620,7 +6656,7 @@ Copy codes src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html - 158 + 160 拷貝復原碼 @@ -6628,7 +6664,7 @@ Emails must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 143 + 148 輸入的信箱必須完全相同 @@ -6636,7 +6672,7 @@ Passwords must match src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 171 + 176 輸入的密碼必須完全相同 @@ -6644,7 +6680,7 @@ Profile updated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 192 + 198 設定檔更新成功 @@ -6652,7 +6688,7 @@ Error saving profile src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 206 + 212 儲存設定檔時發生錯誤 @@ -6660,7 +6696,7 @@ Error generating auth token src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 223 + 230 產生驗證 Token 時發生錯誤 @@ -6668,7 +6704,7 @@ Error disconnecting social account src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 248 + 255 連接社群帳號時發生錯誤 @@ -6676,7 +6712,7 @@ Error fetching TOTP settings src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 267 + 274 擷取 TOTP 時發生錯誤 @@ -6684,7 +6720,7 @@ TOTP activated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 288 + 295 TOTP 啟用成功 @@ -6692,11 +6728,11 @@ Error activating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 290 + 297 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 296 + 303 啟用 TOTP 時發生錯誤 @@ -6704,7 +6740,7 @@ TOTP deactivated successfully src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 312 + 319 TOTP 停用成功 @@ -6712,11 +6748,11 @@ Error deactivating TOTP src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 314 + 321 src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.ts - 319 + 326 停用 TOTP 時發生錯誤 @@ -7392,7 +7428,7 @@ src/app/components/document-list/document-list.component.html 27 - 頁面 + 目前頁面 of @@ -7506,7 +7542,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 179 + 195 src/app/data/document.ts @@ -8130,7 +8166,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 187 + 203 自訂欄位 @@ -8680,7 +8716,7 @@ src/app/components/document-list/document-list.component.ts 315 - 選取頁面 + 選取目前頁面 Select all @@ -8700,7 +8736,7 @@ src/app/components/document-list/document-list.component.html 18 - Select: + 選取: None @@ -8710,7 +8746,7 @@ src/app/components/manage/management-list/management-list.component.ts - 120 + 124 src/app/data/matching-model.ts @@ -8818,7 +8854,7 @@ src/app/components/document-list/filter-editor/filter-editor.component.ts - 184 + 200 src/app/data/document.ts @@ -9038,7 +9074,7 @@ Title & content src/app/components/document-list/filter-editor/filter-editor.component.ts - 182 + 198 標題與內容 @@ -9046,7 +9082,7 @@ File type src/app/components/document-list/filter-editor/filter-editor.component.ts - 189 + 205 檔案類型 @@ -9054,7 +9090,7 @@ More like src/app/components/document-list/filter-editor/filter-editor.component.ts - 198 + 214 相似於 @@ -9062,7 +9098,7 @@ equals src/app/components/document-list/filter-editor/filter-editor.component.ts - 204 + 220 等於 @@ -9070,7 +9106,7 @@ is empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 208 + 224 為空白 @@ -9078,7 +9114,7 @@ is not empty src/app/components/document-list/filter-editor/filter-editor.component.ts - 212 + 228 不為空白 @@ -9086,7 +9122,7 @@ greater than src/app/components/document-list/filter-editor/filter-editor.component.ts - 216 + 232 大於 @@ -9094,7 +9130,7 @@ less than src/app/components/document-list/filter-editor/filter-editor.component.ts - 220 + 236 小於 @@ -9102,7 +9138,7 @@ Correspondent: src/app/components/document-list/filter-editor/filter-editor.component.ts - 261,265 + 277,281 關聯方: @@ -9110,7 +9146,7 @@ Without correspondent src/app/components/document-list/filter-editor/filter-editor.component.ts - 267 + 283 沒有關聯方 @@ -9118,7 +9154,7 @@ Document type: src/app/components/document-list/filter-editor/filter-editor.component.ts - 273,277 + 289,293 文件類型: @@ -9126,7 +9162,7 @@ Without document type src/app/components/document-list/filter-editor/filter-editor.component.ts - 279 + 295 沒有文件類型 @@ -9134,7 +9170,7 @@ Storage path: src/app/components/document-list/filter-editor/filter-editor.component.ts - 285,289 + 301,305 儲存路徑: @@ -9142,7 +9178,7 @@ Without storage path src/app/components/document-list/filter-editor/filter-editor.component.ts - 291 + 307 沒有儲存路徑 @@ -9150,7 +9186,7 @@ Tag: src/app/components/document-list/filter-editor/filter-editor.component.ts - 295,297 + 311,313 標籤: @@ -9158,7 +9194,7 @@ Without any tag src/app/components/document-list/filter-editor/filter-editor.component.ts - 301 + 317 沒有任何標籤 @@ -9166,7 +9202,7 @@ Custom fields query src/app/components/document-list/filter-editor/filter-editor.component.ts - 305 + 321 自訂欄位查詢 @@ -9174,7 +9210,7 @@ Title: src/app/components/document-list/filter-editor/filter-editor.component.ts - 308 + 324 標題: @@ -9182,7 +9218,7 @@ ASN: src/app/components/document-list/filter-editor/filter-editor.component.ts - 311 + 327 封存序號 (ANS): @@ -9190,7 +9226,7 @@ Owner: src/app/components/document-list/filter-editor/filter-editor.component.ts - 314 + 330 擁有者: @@ -9198,7 +9234,7 @@ Owner not in: src/app/components/document-list/filter-editor/filter-editor.component.ts - 317 + 333 擁有者不包含: @@ -9206,7 +9242,7 @@ Without an owner src/app/components/document-list/filter-editor/filter-editor.component.ts - 320 + 336 沒有擁有者 @@ -9402,19 +9438,19 @@ src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 src/app/components/manage/management-list/management-list.component.html - 117 + 123 篩選文件( @@ -9786,7 +9822,7 @@ src/app/components/manage/management-list/management-list.component.ts - 349 + 353 更新權限時發生錯誤 @@ -9914,7 +9950,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 118 + 122 src/app/data/matching-model.ts @@ -9926,7 +9962,7 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 196 + 200 成功建立 @@ -9934,7 +9970,7 @@ Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 201 + 205 建立時發生錯誤。 @@ -9942,7 +9978,7 @@ Successfully updated "". src/app/components/manage/management-list/management-list.component.ts - 216 + 220 成功更新」。 @@ -9950,7 +9986,7 @@ Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 221 + 225 儲存時發生錯誤。 @@ -9958,7 +9994,7 @@ Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 241 + 245 相關聯的檔案將不會被刪除。 @@ -9966,7 +10002,7 @@ Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 257 + 261 刪除元素時發生錯誤 @@ -9974,7 +10010,7 @@ Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 342 + 346 權限更新成功 @@ -9982,7 +10018,7 @@ This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 363 + 367 將永久刪除全部的項目。 @@ -9990,7 +10026,7 @@ Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 377 + 381 項目刪除成功 @@ -9998,7 +10034,7 @@ Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 383 + 387 刪除項目時發生錯誤 @@ -10086,7 +10122,7 @@ storage path src/app/components/manage/storage-path-list/storage-path-list.component.ts - 45 + 43 儲存路徑 @@ -10094,7 +10130,7 @@ storage paths src/app/components/manage/storage-path-list/storage-path-list.component.ts - 46 + 44 儲存路徑 @@ -10102,7 +10138,7 @@ Do you really want to delete the storage path ""? src/app/components/manage/storage-path-list/storage-path-list.component.ts - 62 + 60 確定要刪除儲存路徑「」? @@ -10110,7 +10146,7 @@ tag src/app/components/manage/tag-list/tag-list.component.ts - 45 + 43 標籤 @@ -10118,7 +10154,7 @@ tags src/app/components/manage/tag-list/tag-list.component.ts - 46 + 44 標籤 @@ -10126,7 +10162,7 @@ Do you really want to delete the tag ""? src/app/components/manage/tag-list/tag-list.component.ts - 61 + 60 確定要刪除標籤「」? diff --git a/src-ui/src/main.ts b/src-ui/src/main.ts index 7e57edcea1..bd1e6ebbbd 100644 --- a/src-ui/src/main.ts +++ b/src-ui/src/main.ts @@ -1,14 +1,16 @@ import { - APP_INITIALIZER, - enableProdMode, importProvidersFrom, + inject, + provideAppInitializer, + provideZoneChangeDetection, } from '@angular/core' import { DragDropModule } from '@angular/cdk/drag-drop' import { DatePipe, registerLocaleData } from '@angular/common' import { - HTTP_INTERCEPTORS, provideHttpClient, + withFetch, + withInterceptors, withInterceptorsFromDi, } from '@angular/common/http' import { FormsModule, ReactiveFormsModule } from '@angular/forms' @@ -19,7 +21,6 @@ import { NgbModule, } from '@ng-bootstrap/ng-bootstrap' import { NgSelectModule } from '@ng-select/ng-select' -import { PdfViewerModule } from 'ng2-pdf-viewer' import { NgxBootstrapIconsModule, airplane, @@ -48,6 +49,7 @@ import { caretDown, caretUp, chatLeftText, + chatSquareDots, check, check2All, checkAll, @@ -57,6 +59,7 @@ import { chevronDoubleLeft, chevronDoubleRight, chevronRight, + circle, clipboard, clipboardCheck, clipboardCheckFill, @@ -77,9 +80,11 @@ import { eye, fileEarmark, fileEarmarkCheck, + fileEarmarkDiff, fileEarmarkFill, fileEarmarkLock, fileEarmarkMinus, + fileEarmarkPlus, fileEarmarkRichtext, fileText, files, @@ -123,6 +128,8 @@ import { sliders2Vertical, sortAlphaDown, sortAlphaUpAlt, + stack, + stars, tag, tagFill, tags, @@ -132,6 +139,7 @@ import { threeDotsVertical, trash, uiRadios, + unlock, upcScan, windowStack, x, @@ -140,21 +148,19 @@ import { } from 'ngx-bootstrap-icons' import { ColorSliderModule } from 'ngx-color/slider' import { CookieService } from 'ngx-cookie-service' -import { TourNgBootstrapModule } from 'ngx-ui-tour-ng-bootstrap' import { AppRoutingModule } from './app/app-routing.module' import { AppComponent } from './app/app.component' import { DirtyDocGuard } from './app/guards/dirty-doc.guard' import { DirtySavedViewGuard } from './app/guards/dirty-saved-view.guard' import { PermissionsGuard } from './app/guards/permissions.guard' -import { ApiVersionInterceptor } from './app/interceptors/api-version.interceptor' -import { CsrfInterceptor } from './app/interceptors/csrf.interceptor' +import { withApiVersionInterceptor } from './app/interceptors/api-version.interceptor' +import { withCsrfInterceptor } from './app/interceptors/csrf.interceptor' import { DocumentTitlePipe } from './app/pipes/document-title.pipe' import { FilterPipe } from './app/pipes/filter.pipe' import { UsernamePipe } from './app/pipes/username.pipe' import { SettingsService } from './app/services/settings.service' import { LocalizedDateParserFormatter } from './app/utils/ngb-date-parser-formatter' import { ISODateAdapter } from './app/utils/ngb-iso-date-adapter' -import { environment } from './environments/environment' import localeAf from '@angular/common/locales/af' import localeAr from '@angular/common/locales/ar' @@ -171,6 +177,7 @@ import localeFa from '@angular/common/locales/fa' import localeFi from '@angular/common/locales/fi' import localeFr from '@angular/common/locales/fr' import localeHu from '@angular/common/locales/hu' +import localeId from '@angular/common/locales/id' import localeIt from '@angular/common/locales/it' import localeJa from '@angular/common/locales/ja' import localeKo from '@angular/common/locales/ko' @@ -190,6 +197,7 @@ import localeUk from '@angular/common/locales/uk' import localeVi from '@angular/common/locales/vi' import localeZh from '@angular/common/locales/zh' import localeZhHant from '@angular/common/locales/zh-Hant' +import { provideUiTour } from 'ngx-ui-tour-ng-bootstrap' import { CorrespondentNamePipe } from './app/pipes/correspondent-name.pipe' import { DocumentTypeNamePipe } from './app/pipes/document-type-name.pipe' import { StoragePathNamePipe } from './app/pipes/storage-path-name.pipe' @@ -209,6 +217,7 @@ registerLocaleData(localeFa) registerLocaleData(localeFi) registerLocaleData(localeFr) registerLocaleData(localeHu) +registerLocaleData(localeId) registerLocaleData(localeIt) registerLocaleData(localeJa) registerLocaleData(localeKo) @@ -230,11 +239,11 @@ registerLocaleData(localeUk) registerLocaleData(localeZh) registerLocaleData(localeZhHant) -function initializeApp(settings: SettingsService) { - return () => { - return settings.initializeSettings() - } +function initializeApp() { + const settings = inject(SettingsService) + return settings.initializeSettings() } + const icons = { airplane, archive, @@ -262,6 +271,7 @@ const icons = { caretDown, caretUp, chatLeftText, + chatSquareDots, check, check2All, checkAll, @@ -271,6 +281,7 @@ const icons = { chevronDoubleLeft, chevronDoubleRight, chevronRight, + circle, clipboard, clipboardCheck, clipboardCheckFill, @@ -291,9 +302,11 @@ const icons = { eye, fileEarmark, fileEarmarkCheck, + fileEarmarkDiff, fileEarmarkFill, fileEarmarkLock, fileEarmarkMinus, + fileEarmarkPlus, fileEarmarkRichtext, files, fileText, @@ -337,6 +350,8 @@ const icons = { sliders2Vertical, sortAlphaDown, sortAlphaUpAlt, + stack, + stars, tagFill, tag, tags, @@ -346,6 +361,7 @@ const icons = { threeDotsVertical, trash, uiRadios, + unlock, upcScan, windowStack, x, @@ -353,43 +369,23 @@ const icons = { xLg, } -if (environment.production) { - enableProdMode() -} - bootstrapApplication(AppComponent, { providers: [ + provideZoneChangeDetection(), importProvidersFrom( BrowserModule, AppRoutingModule, NgbModule, FormsModule, ReactiveFormsModule, - PdfViewerModule, NgSelectModule, ColorSliderModule, - TourNgBootstrapModule, DragDropModule, NgxBootstrapIconsModule.pick(icons) ), - { - provide: APP_INITIALIZER, - useFactory: initializeApp, - deps: [SettingsService], - multi: true, - }, + provideAppInitializer(initializeApp), DatePipe, CookieService, - { - provide: HTTP_INTERCEPTORS, - useClass: CsrfInterceptor, - multi: true, - }, - { - provide: HTTP_INTERCEPTORS, - useClass: ApiVersionInterceptor, - multi: true, - }, FilterPipe, DocumentTitlePipe, { provide: NgbDateAdapter, useClass: ISODateAdapter }, @@ -401,6 +397,21 @@ bootstrapApplication(AppComponent, { CorrespondentNamePipe, DocumentTypeNamePipe, StoragePathNamePipe, - provideHttpClient(withInterceptorsFromDi()), + provideHttpClient( + withInterceptorsFromDi(), + withInterceptors([withCsrfInterceptor, withApiVersionInterceptor]), + withFetch() + ), + provideUiTour({ + enableBackdrop: true, + backdropConfig: { + offset: 10, + }, + prevBtnTitle: $localize`Prev`, + nextBtnTitle: $localize`Next`, + endBtnTitle: $localize`End`, + isOptional: true, + useLegacyTitle: true, + }), ], }).catch((err) => console.error(err)) diff --git a/src-ui/src/test/mocks/pdfjs-legacy-build-pdf.ts b/src-ui/src/test/mocks/pdfjs-legacy-build-pdf.ts new file mode 100644 index 0000000000..30e3ac410f --- /dev/null +++ b/src-ui/src/test/mocks/pdfjs-legacy-build-pdf.ts @@ -0,0 +1,24 @@ +export class PDFDocumentProxy { + numPages = 1 +} + +export class PDFDocumentLoadingTask { + promise: Promise + destroyed = false + + constructor(promise: Promise) { + this.promise = promise + } + + destroy(): void { + this.destroyed = true + } +} + +export const GlobalWorkerOptions = { + workerSrc: '', +} + +export const getDocument = (_src: unknown): PDFDocumentLoadingTask => { + return new PDFDocumentLoadingTask(Promise.resolve(new PDFDocumentProxy())) +} diff --git a/src-ui/src/test/mocks/pdfjs-web-pdf_viewer.ts b/src-ui/src/test/mocks/pdfjs-web-pdf_viewer.ts new file mode 100644 index 0000000000..601b05caf1 --- /dev/null +++ b/src-ui/src/test/mocks/pdfjs-web-pdf_viewer.ts @@ -0,0 +1,79 @@ +type EventHandler = (event?: unknown) => void + +export class EventBus { + private readonly listeners = new Map>() + + on(eventName: string, listener: EventHandler): void { + let listeners = this.listeners.get(eventName) + if (!listeners) { + listeners = new Set() + this.listeners.set(eventName, listeners) + } + listeners.add(listener) + } + + off(eventName: string, listener: EventHandler): void { + this.listeners.get(eventName)?.delete(listener) + } + + dispatch(eventName: string, event?: unknown): void { + this.listeners.get(eventName)?.forEach((listener) => listener(event)) + } +} + +export class PDFFindController { + onIsPageVisible?: () => boolean +} + +export class PDFLinkService { + private document?: unknown + private viewer?: unknown + + setDocument(document: unknown): void { + this.document = document + } + + setViewer(viewer: unknown): void { + this.viewer = viewer + } +} + +class BaseViewer { + pagesCount = 0 + currentScale = 1 + currentScaleValue: string | number = 1 + pagesRotation = 0 + readonly options: Record + + private readonly eventBus?: EventBus + private _currentPageNumber = 1 + + constructor(options: { eventBus?: EventBus }) { + this.options = options + this.eventBus = options.eventBus + } + + setDocument(document: { numPages?: number } | null | undefined): void { + this.pagesCount = document?.numPages ?? 1 + this.eventBus?.dispatch('pagesinit', {}) + this.eventBus?.dispatch('pagerendered', { + pageNumber: this._currentPageNumber, + }) + } + + cleanup(): void { + this.pagesCount = 0 + } + + get currentPageNumber(): number { + return this._currentPageNumber + } + + set currentPageNumber(value: number) { + this._currentPageNumber = value + this.eventBus?.dispatch('pagechanging', { pageNumber: value }) + } +} + +export class PDFViewer extends BaseViewer {} +export class PDFSinglePageViewer extends BaseViewer {} diff --git a/src-ui/src/theme.scss b/src-ui/src/theme.scss index eacc3b4e7a..c60284c8a9 100644 --- a/src-ui/src/theme.scss +++ b/src-ui/src/theme.scss @@ -73,6 +73,7 @@ $form-check-radio-checked-bg-image-dark: url("data:image/svg+xml, None: from documents.signals import document_consumption_finished from documents.signals import document_updated from documents.signals.handlers import add_inbox_tags + from documents.signals.handlers import add_or_update_document_in_llm_index from documents.signals.handlers import add_to_index from documents.signals.handlers import run_workflows_added from documents.signals.handlers import run_workflows_updated + from documents.signals.handlers import send_websocket_document_updated from documents.signals.handlers import set_correspondent from documents.signals.handlers import set_document_type from documents.signals.handlers import set_storage_path @@ -26,7 +28,9 @@ def ready(self): document_consumption_finished.connect(set_storage_path) document_consumption_finished.connect(add_to_index) document_consumption_finished.connect(run_workflows_added) + document_consumption_finished.connect(add_or_update_document_in_llm_index) document_updated.connect(run_workflows_updated) + document_updated.connect(send_websocket_document_updated) import documents.schema # noqa: F401 diff --git a/src/documents/barcodes.py b/src/documents/barcodes.py index 9054475f44..31ef052c47 100644 --- a/src/documents/barcodes.py +++ b/src/documents/barcodes.py @@ -16,6 +16,7 @@ from documents.converters import convert_from_tiff_to_pdf from documents.data_models import ConsumableDocument from documents.data_models import DocumentMetadataOverrides +from documents.models import Document from documents.models import Tag from documents.plugins.base import ConsumeTaskPlugin from documents.plugins.base import StopConsumeTaskError @@ -27,8 +28,6 @@ from paperless.config import BarcodeConfig if TYPE_CHECKING: - from collections.abc import Callable - from PIL import Image logger = logging.getLogger("paperless.barcodes") @@ -60,6 +59,20 @@ def is_asn(self) -> bool: """ return self.value.startswith(self.settings.barcode_asn_prefix) + @property + def is_tag(self) -> bool: + """ + Returns True if the barcode value matches any configured tag mapping pattern, + False otherwise. + + Note: This does NOT exclude ASN or separator barcodes - they can also be used + as tags if they match a tag mapping pattern (e.g., {"ASN12.*": "JOHN"}). + """ + for regex in self.settings.barcode_tag_mapping: + if re.match(regex, self.value, flags=re.IGNORECASE): + return True + return False + class BarcodePlugin(ConsumeTaskPlugin): NAME: str = "BarcodePlugin" @@ -115,6 +128,24 @@ def setup(self) -> None: self._tiff_conversion_done = False self.barcodes: list[Barcode] = [] + def _apply_detected_asn(self, detected_asn: int) -> None: + """ + Apply a detected ASN to metadata if allowed. + """ + if ( + self.metadata.skip_asn_if_exists + and Document.global_objects.filter( + archive_serial_number=detected_asn, + ).exists() + ): + logger.info( + f"Found ASN in barcode {detected_asn} but skipping because it already exists.", + ) + return + + logger.info(f"Found ASN in barcode: {detected_asn}") + self.metadata.asn = detected_asn + def run(self) -> None: # Some operations may use PIL, override pixel setting if needed maybe_override_pixel_limit() @@ -126,8 +157,14 @@ def run(self) -> None: self.detect() # try reading tags from barcodes + # If tag splitting is enabled, skip this on the original document - let each split document extract its own tags + # However, if we're processing a split document (original_path is set), extract tags if ( self.settings.barcode_enable_tag + and ( + not self.settings.barcode_tag_split + or self.input_doc.original_path is not None + ) and (tags := self.tags) is not None and len(tags) > 0 ): @@ -187,8 +224,7 @@ def run(self) -> None: # Update/overwrite an ASN if possible # After splitting, as otherwise each split document gets the same ASN if self.settings.barcode_enable_asn and (located_asn := self.asn) is not None: - logger.info(f"Found ASN in barcode: {located_asn}") - self.metadata.asn = located_asn + self._apply_detected_asn(located_asn) def cleanup(self) -> None: self.temp_dir.cleanup() @@ -224,26 +260,6 @@ def read_barcodes_zxing(image: Image.Image) -> list[str]: return barcodes - @staticmethod - def read_barcodes_pyzbar(image: Image.Image) -> list[str]: - barcodes = [] - - from pyzbar import pyzbar - - # Decode the barcode image - detected_barcodes = pyzbar.decode(image) - - # Traverse through all the detected barcodes in image - for barcode in detected_barcodes: - if barcode.data: - decoded_barcode = barcode.data.decode("utf-8") - barcodes.append(decoded_barcode) - logger.debug( - f"Barcode of type {barcode.type} found: {decoded_barcode}", - ) - - return barcodes - def detect(self) -> None: """ Scan all pages of the PDF as images, updating barcodes and the pages @@ -256,14 +272,6 @@ def detect(self) -> None: # No op if not a TIFF self.convert_from_tiff_to_pdf() - # Choose the library for reading - if settings.CONSUMER_BARCODE_SCANNER == "PYZBAR": - reader: Callable[[Image.Image], list[str]] = self.read_barcodes_pyzbar - logger.debug("Scanning for barcodes using PYZBAR") - else: - reader = self.read_barcodes_zxing - logger.debug("Scanning for barcodes using ZXING") - try: # Read number of pages from pdf with Pdf.open(self.pdf_file) as pdf: @@ -311,7 +319,7 @@ def detect(self) -> None: ) # Detect barcodes - for barcode_value in reader(page): + for barcode_value in self.read_barcodes_zxing(page): self.barcodes.append( Barcode(current_page_number, barcode_value, self.settings), ) @@ -428,15 +436,24 @@ def get_separation_pages(self) -> dict[int, bool]: for bc in self.barcodes if bc.is_separator and (not retain or (retain and bc.page > 0)) } # as below, dont include the first page if retain is enabled - if not self.settings.barcode_enable_asn: - return separator_pages # add the page numbers of the ASN barcodes # (except for first page, that might lead to infinite loops). - return { - **separator_pages, - **{bc.page: True for bc in self.barcodes if bc.is_asn and bc.page != 0}, - } + if self.settings.barcode_enable_asn: + separator_pages = { + **separator_pages, + **{bc.page: True for bc in self.barcodes if bc.is_asn and bc.page != 0}, + } + + # add the page numbers of the TAG barcodes if splitting is enabled + # (except for first page, that might lead to infinite loops). + if self.settings.barcode_tag_split and self.settings.barcode_enable_tag: + separator_pages = { + **separator_pages, + **{bc.page: True for bc in self.barcodes if bc.is_tag and bc.page != 0}, + } + + return separator_pages def separate_pages(self, pages_to_split_on: dict[int, bool]) -> list[Path]: """ diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 73cc479907..8dbcdb8a4d 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -1,13 +1,11 @@ from __future__ import annotations -import hashlib import logging import tempfile from pathlib import Path from typing import TYPE_CHECKING from typing import Literal -from celery import chain from celery import chord from celery import group from celery import shared_task @@ -31,12 +29,74 @@ from documents.tasks import bulk_update_documents from documents.tasks import consume_file from documents.tasks import update_document_content_maybe_archive_file +from documents.versioning import get_latest_version_for_root +from documents.versioning import get_root_document if TYPE_CHECKING: from django.contrib.auth.models import User logger: logging.Logger = logging.getLogger("paperless.bulk_edit") +SourceMode = Literal["latest_version", "explicit_selection"] + + +class SourceModeChoices: + LATEST_VERSION: SourceMode = "latest_version" + EXPLICIT_SELECTION: SourceMode = "explicit_selection" + + +@shared_task(bind=True) +def restore_archive_serial_numbers_task( + self, + backup: dict[int, int | None], + *args, + **kwargs, +) -> None: + restore_archive_serial_numbers(backup) + + +def release_archive_serial_numbers(doc_ids: list[int]) -> dict[int, int | None]: + """ + Clears ASNs on documents that are about to be replaced so new documents + can be assigned ASNs without uniqueness collisions. Returns a backup map + of doc_id -> previous ASN for potential restoration. + """ + qs = Document.objects.filter( + id__in=doc_ids, + archive_serial_number__isnull=False, + ).only("pk", "archive_serial_number") + backup = dict(qs.values_list("pk", "archive_serial_number")) + qs.update(archive_serial_number=None) + logger.info(f"Released archive serial numbers for documents {list(backup.keys())}") + return backup + + +def restore_archive_serial_numbers(backup: dict[int, int | None]) -> None: + """ + Restores ASNs using the provided backup map, intended for + rollback when replacement consumption fails. + """ + for doc_id, asn in backup.items(): + Document.objects.filter(pk=doc_id).update(archive_serial_number=asn) + logger.info(f"Restored archive serial numbers for documents {list(backup.keys())}") + + +def _resolve_root_and_source_doc( + doc: Document, + *, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, +) -> tuple[Document, Document]: + root_doc = get_root_document(doc) + + if source_mode == SourceModeChoices.EXPLICIT_SELECTION: + return root_doc, doc + + # Version IDs are explicit by default, only a selected root resolves to latest + if doc.root_document_id is not None: + return root_doc, doc + + return root_doc, get_latest_version_for_root(root_doc) + def set_correspondent( doc_ids: list[int], @@ -274,16 +334,29 @@ def modify_custom_fields( @shared_task def delete(doc_ids: list[int]) -> Literal["OK"]: try: - Document.objects.filter(id__in=doc_ids).delete() + root_ids = ( + Document.objects.filter(id__in=doc_ids, root_document__isnull=True) + .values_list("id", flat=True) + .distinct() + ) + version_ids = ( + Document.objects.filter(root_document_id__in=root_ids) + .exclude(id__in=doc_ids) + .values_list("id", flat=True) + .distinct() + ) + delete_ids = list({*doc_ids, *version_ids}) + + Document.objects.filter(id__in=delete_ids).delete() from documents import index with index.open_index_writer() as writer: - for id in doc_ids: + for id in delete_ids: index.remove_document_by_id(writer, id) status_mgr = DocumentsStatusManager() - status_mgr.send_documents_deleted(doc_ids) + status_mgr.send_documents_deleted(delete_ids) except Exception as e: if "Data too long for column" in str(e): logger.warning( @@ -305,10 +378,10 @@ def reprocess(doc_ids: list[int]) -> Literal["OK"]: def set_permissions( doc_ids: list[int], - set_permissions, + set_permissions: dict, *, - owner=None, - merge=False, + owner: User | None = None, + merge: bool = False, ) -> Literal["OK"]: qs = Document.objects.filter(id__in=doc_ids).select_related("owner") @@ -328,43 +401,71 @@ def set_permissions( return "OK" -def rotate(doc_ids: list[int], degrees: int) -> Literal["OK"]: +def rotate( + doc_ids: list[int], + degrees: int, + *, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, + user: User | None = None, +) -> Literal["OK"]: logger.info( f"Attempting to rotate {len(doc_ids)} documents by {degrees} degrees.", ) - qs = Document.objects.filter(id__in=doc_ids) - affected_docs: list[int] = [] + docs_by_id = { + doc.id: doc + for doc in Document.objects.select_related("root_document").filter( + id__in=doc_ids, + ) + } + docs_by_root_id: dict[int, tuple[Document, Document]] = {} + for doc_id in doc_ids: + doc = docs_by_id.get(doc_id) + if doc is None: + continue + root_doc, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) + docs_by_root_id.setdefault(root_doc.id, (root_doc, source_doc)) + import pikepdf - rotate_tasks = [] - for doc in qs: - if doc.mime_type != "application/pdf": + for root_doc, source_doc in docs_by_root_id.values(): + if source_doc.mime_type != "application/pdf": logger.warning( - f"Document {doc.id} is not a PDF, skipping rotation.", + f"Document {root_doc.id} is not a PDF, skipping rotation.", ) continue try: - with pikepdf.open(doc.source_path, allow_overwriting_input=True) as pdf: + # Write rotated output to a temp file and create a new version via consume pipeline + filepath: Path = ( + Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) + / f"{root_doc.id}_rotated.pdf" + ) + with pikepdf.open(source_doc.source_path) as pdf: for page in pdf.pages: page.rotate(degrees, relative=True) - pdf.save() - doc.checksum = hashlib.md5(doc.source_path.read_bytes()).hexdigest() - doc.save() - rotate_tasks.append( - update_document_content_maybe_archive_file.s( - document_id=doc.id, - ), - ) - logger.info( - f"Rotated document {doc.id} by {degrees} degrees", - ) - affected_docs.append(doc.id) - except Exception as e: - logger.exception(f"Error rotating document {doc.id}: {e}") + pdf.remove_unreferenced_resources() + pdf.save(filepath) - if len(affected_docs) > 0: - bulk_update_task = bulk_update_documents.si(document_ids=affected_docs) - chord(header=rotate_tasks, body=bulk_update_task).delay() + # Preserve metadata/permissions via overrides; mark as new version + overrides = DocumentMetadataOverrides().from_document(root_doc) + if user is not None: + overrides.actor_id = user.id + + consume_file.delay( + ConsumableDocument( + source=DocumentSource.ConsumeFolder, + original_file=filepath, + root_document_id=root_doc.id, + ), + overrides, + ) + logger.info( + f"Queued new rotated version for document {root_doc.id} by {degrees} degrees", + ) + except Exception as e: + logger.exception(f"Error rotating document {root_doc.id}: {e}") return "OK" @@ -375,32 +476,43 @@ def merge( metadata_document_id: int | None = None, delete_originals: bool = False, archive_fallback: bool = False, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, user: User | None = None, ) -> Literal["OK"]: logger.info( f"Attempting to merge {len(doc_ids)} documents into a single document.", ) - qs = Document.objects.filter(id__in=doc_ids) + qs = Document.objects.select_related("root_document").filter(id__in=doc_ids) + docs_by_id = {doc.id: doc for doc in qs} affected_docs: list[int] = [] import pikepdf merged_pdf = pikepdf.new() version: str = merged_pdf.pdf_version + handoff_asn: int | None = None # use doc_ids to preserve order for doc_id in doc_ids: - doc = qs.get(id=doc_id) + doc = docs_by_id.get(doc_id) + if doc is None: + continue + _, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) try: doc_path = ( - doc.archive_path + source_doc.archive_path if archive_fallback - and doc.mime_type != "application/pdf" - and doc.has_archive_version - else doc.source_path + and source_doc.mime_type != "application/pdf" + and source_doc.has_archive_version + else source_doc.source_path ) with pikepdf.open(str(doc_path)) as pdf: version = max(version, pdf.pdf_version) merged_pdf.pages.extend(pdf.pages) affected_docs.append(doc.id) + if handoff_asn is None and doc.archive_serial_number is not None: + handoff_asn = doc.archive_serial_number except Exception as e: logger.exception( f"Error merging document {doc.id}, it will not be included in the merge: {e}", @@ -426,6 +538,8 @@ def merge( DocumentMetadataOverrides.from_document(metadata_document) ) overrides.title = metadata_document.title + " (merged)" + if metadata_document.archive_serial_number is not None: + handoff_asn = metadata_document.archive_serial_number else: overrides = DocumentMetadataOverrides() else: @@ -433,6 +547,11 @@ def merge( if user is not None: overrides.owner_id = user.id + if not delete_originals: + overrides.skip_asn_if_exists = True + + if delete_originals and handoff_asn is not None: + overrides.asn = handoff_asn logger.info("Adding merged document to the task queue.") @@ -445,10 +564,18 @@ def merge( ) if delete_originals: + backup = release_archive_serial_numbers(affected_docs) logger.info( "Queueing removal of original documents after consumption of merged document", ) - chain(consume_task, delete.si(affected_docs)).delay() + try: + consume_task.apply_async( + link=[delete.si(affected_docs)], + link_error=[restore_archive_serial_numbers_task.s(backup)], + ) + except Exception: + restore_archive_serial_numbers(backup) + raise else: consume_task.delay() @@ -460,18 +587,23 @@ def split( pages: list[list[int]], *, delete_originals: bool = False, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, user: User | None = None, ) -> Literal["OK"]: logger.info( f"Attempting to split document {doc_ids[0]} into {len(pages)} documents", ) - doc = Document.objects.get(id=doc_ids[0]) + doc = Document.objects.select_related("root_document").get(id=doc_ids[0]) + _, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) import pikepdf consume_tasks = [] try: - with pikepdf.open(doc.source_path) as pdf: + with pikepdf.open(source_doc.source_path) as pdf: for idx, split_doc in enumerate(pages): dst: pikepdf.Pdf = pikepdf.new() for page in split_doc: @@ -492,6 +624,8 @@ def split( overrides.title = f"{doc.title} (split {idx + 1})" if user is not None: overrides.owner_id = user.id + if not delete_originals: + overrides.skip_asn_if_exists = True logger.info( f"Adding split document with pages {split_doc} to the task queue.", ) @@ -506,10 +640,20 @@ def split( ) if delete_originals: + backup = release_archive_serial_numbers([doc.id]) logger.info( "Queueing removal of original document after consumption of the split documents", ) - chord(header=consume_tasks, body=delete.si([doc.id])).delay() + try: + chord( + header=consume_tasks, + body=delete.si([doc.id]), + ).apply_async( + link_error=[restore_archive_serial_numbers_task.s(backup)], + ) + except Exception: + restore_archive_serial_numbers(backup) + raise else: group(consume_tasks).delay() @@ -519,41 +663,66 @@ def split( return "OK" -def delete_pages(doc_ids: list[int], pages: list[int]) -> Literal["OK"]: +def delete_pages( + doc_ids: list[int], + pages: list[int], + *, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, + user: User | None = None, +) -> Literal["OK"]: logger.info( f"Attempting to delete pages {pages} from {len(doc_ids)} documents", ) - doc = Document.objects.get(id=doc_ids[0]) + doc = Document.objects.select_related("root_document").get(id=doc_ids[0]) + root_doc, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) pages = sorted(pages) # sort pages to avoid index issues import pikepdf try: - with pikepdf.open(doc.source_path, allow_overwriting_input=True) as pdf: + # Produce edited PDF to a temp file and create a new version + filepath: Path = ( + Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) + / f"{root_doc.id}_pages_deleted.pdf" + ) + with pikepdf.open(source_doc.source_path) as pdf: offset = 1 # pages are 1-indexed for page_num in pages: pdf.pages.remove(pdf.pages[page_num - offset]) offset += 1 # remove() changes the index of the pages pdf.remove_unreferenced_resources() - pdf.save() - doc.checksum = hashlib.md5(doc.source_path.read_bytes()).hexdigest() - if doc.page_count is not None: - doc.page_count = doc.page_count - len(pages) - doc.save() - update_document_content_maybe_archive_file.delay(document_id=doc.id) - logger.info(f"Deleted pages {pages} from document {doc.id}") + pdf.save(filepath) + + overrides = DocumentMetadataOverrides().from_document(root_doc) + if user is not None: + overrides.actor_id = user.id + consume_file.delay( + ConsumableDocument( + source=DocumentSource.ConsumeFolder, + original_file=filepath, + root_document_id=root_doc.id, + ), + overrides, + ) + logger.info( + f"Queued new version for document {root_doc.id} after deleting pages {pages}", + ) except Exception as e: - logger.exception(f"Error deleting pages from document {doc.id}: {e}") + logger.exception(f"Error deleting pages from document {root_doc.id}: {e}") return "OK" def edit_pdf( doc_ids: list[int], - operations: list[dict], + operations: list[dict[str, int]], *, delete_original: bool = False, update_document: bool = False, include_metadata: bool = True, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, user: User | None = None, ) -> Literal["OK"]: """ @@ -567,13 +736,17 @@ def edit_pdf( logger.info( f"Editing PDF of document {doc_ids[0]} with {len(operations)} operations", ) - doc = Document.objects.get(id=doc_ids[0]) + doc = Document.objects.select_related("root_document").get(id=doc_ids[0]) + root_doc, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) import pikepdf pdf_docs: list[pikepdf.Pdf] = [] try: - with pikepdf.open(doc.source_path) as src: + with pikepdf.open(source_doc.source_path) as src: # prepare output documents max_idx = max(op.get("doc", 0) for op in operations) pdf_docs = [pikepdf.new() for _ in range(max_idx + 1)] @@ -592,51 +765,78 @@ def edit_pdf( dst.pages[-1].rotate(op["rotate"], relative=True) if update_document: - temp_path = doc.source_path.with_suffix(".tmp.pdf") + # Create a new version from the edited PDF rather than replacing in-place pdf = pdf_docs[0] pdf.remove_unreferenced_resources() - # save the edited PDF to a temporary file in case of errors - pdf.save(temp_path) - # replace the original document with the edited one - temp_path.replace(doc.source_path) - doc.checksum = hashlib.md5(doc.source_path.read_bytes()).hexdigest() - doc.page_count = len(pdf.pages) - doc.save() - update_document_content_maybe_archive_file.delay(document_id=doc.id) + filepath: Path = ( + Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) + / f"{root_doc.id}_edited.pdf" + ) + pdf.save(filepath) + overrides = ( + DocumentMetadataOverrides().from_document(root_doc) + if include_metadata + else DocumentMetadataOverrides() + ) + if user is not None: + overrides.owner_id = user.id + overrides.actor_id = user.id + consume_file.delay( + ConsumableDocument( + source=DocumentSource.ConsumeFolder, + original_file=filepath, + root_document_id=root_doc.id, + ), + overrides, + ) else: consume_tasks = [] overrides = ( - DocumentMetadataOverrides().from_document(doc) + DocumentMetadataOverrides().from_document(root_doc) if include_metadata else DocumentMetadataOverrides() ) if user is not None: overrides.owner_id = user.id - + overrides.actor_id = user.id + if not delete_original: + overrides.skip_asn_if_exists = True + if delete_original and len(pdf_docs) == 1: + overrides.asn = root_doc.archive_serial_number for idx, pdf in enumerate(pdf_docs, start=1): - filepath: Path = ( + version_filepath: Path = ( Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) - / f"{doc.id}_edit_{idx}.pdf" + / f"{root_doc.id}_edit_{idx}.pdf" ) pdf.remove_unreferenced_resources() - pdf.save(filepath) + pdf.save(version_filepath) consume_tasks.append( consume_file.s( ConsumableDocument( source=DocumentSource.ConsumeFolder, - original_file=filepath, + original_file=version_filepath, ), overrides, ), ) if delete_original: - chord(header=consume_tasks, body=delete.si([doc.id])).delay() + backup = release_archive_serial_numbers([doc.id]) + try: + chord( + header=consume_tasks, + body=delete.si([doc.id]), + ).apply_async( + link_error=[restore_archive_serial_numbers_task.s(backup)], + ) + except Exception: + restore_archive_serial_numbers(backup) + raise else: group(consume_tasks).delay() except Exception as e: - logger.exception(f"Error editing document {doc.id}: {e}") + logger.exception(f"Error editing document {root_doc.id}: {e}") raise ValueError( f"An error occurred while editing the document: {e}", ) from e @@ -644,11 +844,102 @@ def edit_pdf( return "OK" +def remove_password( + doc_ids: list[int], + password: str, + *, + update_document: bool = False, + delete_original: bool = False, + include_metadata: bool = True, + source_mode: SourceMode = SourceModeChoices.LATEST_VERSION, + user: User | None = None, +) -> Literal["OK"]: + """ + Remove password protection from PDF documents. + """ + import pikepdf + + for doc_id in doc_ids: + doc = Document.objects.select_related("root_document").get(id=doc_id) + root_doc, source_doc = _resolve_root_and_source_doc( + doc, + source_mode=source_mode, + ) + try: + logger.info( + f"Attempting password removal from document {doc_ids[0]}", + ) + with pikepdf.open(source_doc.source_path, password=password) as pdf: + filepath: Path = ( + Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) + / f"{root_doc.id}_unprotected.pdf" + ) + pdf.remove_unreferenced_resources() + pdf.save(filepath) + + if update_document: + # Create a new version rather than modifying the root/original in place. + overrides = ( + DocumentMetadataOverrides().from_document(root_doc) + if include_metadata + else DocumentMetadataOverrides() + ) + if user is not None: + overrides.owner_id = user.id + overrides.actor_id = user.id + consume_file.delay( + ConsumableDocument( + source=DocumentSource.ConsumeFolder, + original_file=filepath, + root_document_id=root_doc.id, + ), + overrides, + ) + else: + consume_tasks = [] + overrides = ( + DocumentMetadataOverrides().from_document(root_doc) + if include_metadata + else DocumentMetadataOverrides() + ) + if user is not None: + overrides.owner_id = user.id + overrides.actor_id = user.id + + consume_tasks.append( + consume_file.s( + ConsumableDocument( + source=DocumentSource.ConsumeFolder, + original_file=filepath, + ), + overrides, + ), + ) + + if delete_original: + chord( + header=consume_tasks, + body=delete.si([doc.id]), + ).delay() + else: + group(consume_tasks).delay() + + except Exception as e: + logger.exception( + f"Error removing password from document {root_doc.id}: {e}", + ) + raise ValueError( + f"An error occurred while removing the password: {e}", + ) from e + + return "OK" + + def reflect_doclinks( document: Document, field: CustomField, target_doc_ids: list[int], -): +) -> None: """ Add or remove 'symmetrical' links to `document` on all `target_doc_ids` """ @@ -711,7 +1002,7 @@ def remove_doclink( document: Document, field: CustomField, target_doc_id: int, -): +) -> None: """ Removes a 'symmetrical' link to `document` from the target document's existing custom field instance """ diff --git a/src/documents/caching.py b/src/documents/caching.py index ed7f6dbc17..f2911e51e4 100644 --- a/src/documents/caching.py +++ b/src/documents/caching.py @@ -41,6 +41,7 @@ class SuggestionCacheData: CLASSIFIER_VERSION_KEY: Final[str] = "classifier_version" CLASSIFIER_HASH_KEY: Final[str] = "classifier_hash" CLASSIFIER_MODIFIED_KEY: Final[str] = "classifier_modified" +LLM_CACHE_CLASSIFIER_VERSION: Final[int] = 1000 # Marker distinguishing LLM suggestions CACHE_1_MINUTE: Final[int] = 60 CACHE_5_MINUTES: Final[int] = 5 * CACHE_1_MINUTE @@ -196,6 +197,54 @@ def refresh_suggestions_cache( cache.touch(doc_key, timeout) +def get_llm_suggestion_cache( + document_id: int, + backend: str, +) -> SuggestionCacheData | None: + doc_key = get_suggestion_cache_key(document_id) + data: SuggestionCacheData = cache.get(doc_key) + + if data and data.classifier_hash == backend: + return data + + return None + + +def set_llm_suggestions_cache( + document_id: int, + suggestions: dict, + *, + backend: str, + timeout: int = CACHE_50_MINUTES, +) -> None: + """ + Cache LLM-generated suggestions using a backend-specific identifier (e.g. 'openai:gpt-4'). + """ + doc_key = get_suggestion_cache_key(document_id) + cache.set( + doc_key, + SuggestionCacheData( + classifier_version=LLM_CACHE_CLASSIFIER_VERSION, + classifier_hash=backend, + suggestions=suggestions, + ), + timeout, + ) + + +def invalidate_llm_suggestions_cache( + document_id: int, +) -> None: + """ + Invalidate the LLM suggestions cache for a specific document and backend. + """ + doc_key = get_suggestion_cache_key(document_id) + data: SuggestionCacheData = cache.get(doc_key) + + if data: + cache.delete(doc_key) + + def get_metadata_cache_key(document_id: int) -> str: """ Returns the basic key for a document's metadata diff --git a/src/documents/checks.py b/src/documents/checks.py index 8f8fbf4f9f..b6e9e90fcb 100644 --- a/src/documents/checks.py +++ b/src/documents/checks.py @@ -1,60 +1,12 @@ -import textwrap - from django.conf import settings from django.core.checks import Error from django.core.checks import Warning from django.core.checks import register -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 documents.templating.utils import convert_format_str_to_template_format -@register() -def changed_password_check(app_configs, **kwargs): - from documents.models import Document - from paperless.db import GnuPG - - try: - encrypted_doc = ( - Document.objects.filter( - storage_type=Document.STORAGE_TYPE_GPG, - ) - .only("pk", "storage_type") - .first() - ) - except (OperationalError, ProgrammingError, FieldError): - return [] # No documents table yet - - if encrypted_doc: - if not settings.PASSPHRASE: - return [ - Error( - "The database contains encrypted documents but no password is set.", - ), - ] - - if not GnuPG.decrypted(encrypted_doc.source_file): - return [ - Error( - textwrap.dedent( - """ - The current password doesn't match the password of the - existing documents. - - If you intend to change your password, you must first export - all of the old documents, start fresh with the new password - and then re-import them." - """, - ), - ), - ] - - return [] - - @register() def parser_check(app_configs, **kwargs): parsers = [] diff --git a/src/documents/classifier.py b/src/documents/classifier.py index 613c1d5adc..87934ab527 100644 --- a/src/documents/classifier.py +++ b/src/documents/classifier.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: + from collections.abc import Callable from collections.abc import Iterator from datetime import datetime @@ -122,7 +123,7 @@ def __init__(self) -> None: ) self._stop_words = None - def _update_data_vectorizer_hash(self): + def _update_data_vectorizer_hash(self) -> None: self.data_vectorizer_hash = sha256( pickle.dumps(self.data_vectorizer), ).hexdigest() @@ -191,7 +192,12 @@ def save(self) -> None: target_file_temp.rename(target_file) - def train(self) -> bool: + def train( + self, + status_callback: Callable[[str], None] | None = None, + ) -> bool: + notify = status_callback if status_callback is not None else lambda _: None + # Get non-inbox documents docs_queryset = ( Document.objects.exclude( @@ -213,6 +219,7 @@ def train(self) -> bool: # Step 1: Extract and preprocess training data from the database. logger.debug("Gathering data from database...") + notify(f"Gathering data from {docs_queryset.count()} document(s)...") hasher = sha256() for doc in docs_queryset: y = -1 @@ -290,6 +297,7 @@ def train(self) -> bool: # Step 2: vectorize data logger.debug("Vectorizing data...") + notify("Vectorizing document content...") def content_generator() -> Iterator[str]: """ @@ -316,6 +324,7 @@ def content_generator() -> Iterator[str]: # Step 3: train the classifiers if num_tags > 0: logger.debug("Training tags classifier...") + notify(f"Training tags classifier ({num_tags} tag(s))...") if num_tags == 1: # Special case where only one tag has auto: @@ -339,6 +348,9 @@ def content_generator() -> Iterator[str]: if num_correspondents > 0: logger.debug("Training correspondent classifier...") + notify( + f"Training correspondent classifier ({num_correspondents} correspondent(s))...", + ) self.correspondent_classifier = MLPClassifier(tol=0.01) self.correspondent_classifier.fit(data_vectorized, labels_correspondent) else: @@ -349,6 +361,9 @@ def content_generator() -> Iterator[str]: if num_document_types > 0: logger.debug("Training document type classifier...") + notify( + f"Training document type classifier ({num_document_types} type(s))...", + ) self.document_type_classifier = MLPClassifier(tol=0.01) self.document_type_classifier.fit(data_vectorized, labels_document_type) else: @@ -361,6 +376,7 @@ def content_generator() -> Iterator[str]: logger.debug( "Training storage paths classifier...", ) + notify(f"Training storage path classifier ({num_storage_paths} path(s))...") self.storage_path_classifier = MLPClassifier(tol=0.01) self.storage_path_classifier.fit( data_vectorized, diff --git a/src/documents/conditionals.py b/src/documents/conditionals.py index 47d9bfe4b1..fa10ff58ab 100644 --- a/src/documents/conditionals.py +++ b/src/documents/conditionals.py @@ -1,5 +1,6 @@ +from datetime import UTC from datetime import datetime -from datetime import timezone +from typing import Any from django.conf import settings from django.core.cache import cache @@ -12,6 +13,7 @@ from documents.caching import get_thumbnail_modified_key from documents.classifier import DocumentClassifier from documents.models import Document +from documents.versioning import resolve_effective_document_by_pk def suggestions_etag(request, pk: int) -> str | None: @@ -71,12 +73,10 @@ def metadata_etag(request, pk: int) -> str | None: Metadata is extracted from the original file, so use its checksum as the ETag """ - try: - doc = Document.objects.only("checksum").get(pk=pk) - return doc.checksum - except Document.DoesNotExist: # pragma: no cover + doc = resolve_effective_document_by_pk(pk, request).document + if doc is None: return None - return None + return doc.checksum def metadata_last_modified(request, pk: int) -> datetime | None: @@ -85,28 +85,25 @@ def metadata_last_modified(request, pk: int) -> datetime | None: not the modification of the original file, but of the database object, but might as well error on the side of more cautious """ - try: - doc = Document.objects.only("modified").get(pk=pk) - return doc.modified - except Document.DoesNotExist: # pragma: no cover + doc = resolve_effective_document_by_pk(pk, request).document + if doc is None: return None - return None + return doc.modified def preview_etag(request, pk: int) -> str | None: """ ETag for the document preview, using the original or archive checksum, depending on the request """ - try: - doc = Document.objects.only("checksum", "archive_checksum").get(pk=pk) - use_original = ( - "original" in request.query_params - and request.query_params["original"] == "true" - ) - return doc.checksum if use_original else doc.archive_checksum - except Document.DoesNotExist: # pragma: no cover + doc = resolve_effective_document_by_pk(pk, request).document + if doc is None: return None - return None + use_original = ( + hasattr(request, "query_params") + and "original" in request.query_params + and request.query_params["original"] == "true" + ) + return doc.checksum if use_original else doc.archive_checksum def preview_last_modified(request, pk: int) -> datetime | None: @@ -114,24 +111,25 @@ def preview_last_modified(request, pk: int) -> datetime | None: Uses the documents modified time to set the Last-Modified header. Not strictly speaking correct, but close enough and quick """ - try: - doc = Document.objects.only("modified").get(pk=pk) - return doc.modified - except Document.DoesNotExist: # pragma: no cover + doc = resolve_effective_document_by_pk(pk, request).document + if doc is None: return None - return None + return doc.modified -def thumbnail_last_modified(request, pk: int) -> datetime | None: +def thumbnail_last_modified(request: Any, pk: int) -> datetime | None: """ Returns the filesystem last modified either from cache or from filesystem. Cache should be (slightly?) faster than filesystem """ try: - doc = Document.objects.only("storage_type").get(pk=pk) + doc = resolve_effective_document_by_pk(pk, request).document + if doc is None: + return None if not doc.thumbnail_path.exists(): return None - doc_key = get_thumbnail_modified_key(pk) + # Use the effective document id for cache key + doc_key = get_thumbnail_modified_key(doc.id) cache_hit = cache.get(doc_key) if cache_hit is not None: @@ -141,9 +139,9 @@ def thumbnail_last_modified(request, pk: int) -> datetime | None: # No cache, get the timestamp and cache the datetime last_modified = datetime.fromtimestamp( doc.thumbnail_path.stat().st_mtime, - tz=timezone.utc, + tz=UTC, ) cache.set(doc_key, last_modified, CACHE_50_MINUTES) return last_modified - except Document.DoesNotExist: # pragma: no cover + except (Document.DoesNotExist, OSError): # pragma: no cover return None diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 86641a2433..11abf46d44 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -2,14 +2,16 @@ import hashlib import os import tempfile -from enum import Enum +from enum import StrEnum from pathlib import Path from typing import TYPE_CHECKING +from typing import Final import magic from django.conf import settings from django.contrib.auth.models import User from django.db import transaction +from django.db.models import Max from django.db.models import Q from django.utils import timezone from filelock import FileLock @@ -19,6 +21,7 @@ from documents.data_models import ConsumableDocument from documents.data_models import DocumentMetadataOverrides from documents.file_handling import create_source_path_directory +from documents.file_handling import generate_filename from documents.file_handling import generate_unique_filename from documents.loggers import LoggingMixin from documents.models import Correspondent @@ -32,23 +35,48 @@ from documents.parsers import DocumentParser from documents.parsers import ParseError from documents.parsers import get_parser_class_for_mime_type -from documents.parsers import parse_date from documents.permissions import set_permissions_for_object from documents.plugins.base import AlwaysRunPluginMixin from documents.plugins.base import ConsumeTaskPlugin from documents.plugins.base import NoCleanupPluginMixin from documents.plugins.base import NoSetupPluginMixin +from documents.plugins.date_parsing import get_date_parser from documents.plugins.helpers import ProgressManager from documents.plugins.helpers import ProgressStatusOptions from documents.signals import document_consumption_finished from documents.signals import document_consumption_started +from documents.signals import document_updated from documents.signals.handlers import run_workflows from documents.templating.workflows import parse_w_workflow_placeholders from documents.utils import copy_basic_file_stats from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess +from paperless.parsers.remote import RemoteDocumentParser +from paperless.parsers.text import TextDocumentParser +from paperless.parsers.tika import TikaDocumentParser from paperless_mail.parsers import MailDocumentParser +LOGGING_NAME: Final[str] = "paperless.consumer" + + +def _parser_cleanup(parser: DocumentParser) -> None: + """ + Call cleanup on a parser, handling the new-style context-manager parsers. + + New-style parsers (e.g. TextDocumentParser) use __exit__ for teardown + instead of a cleanup() method. This shim will be removed once all existing parsers + have switched to the new style and this consumer is updated to use it + + TODO(stumpylog): Remove me in the future + """ + if isinstance( + parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): + parser.__exit__(None, None, None) + else: + parser.cleanup() + class WorkflowTriggerPlugin( NoCleanupPluginMixin, @@ -77,7 +105,7 @@ class ConsumerError(Exception): pass -class ConsumerStatusShortMessage(str, Enum): +class ConsumerStatusShortMessage(StrEnum): DOCUMENT_ALREADY_EXISTS = "document_already_exists" DOCUMENT_ALREADY_EXISTS_IN_TRASH = "document_already_exists_in_trash" ASN_ALREADY_EXISTS = "asn_already_exists" @@ -99,6 +127,12 @@ class ConsumerStatusShortMessage(str, Enum): class ConsumerPluginMixin: + if TYPE_CHECKING: + from logging import Logger + from logging import LoggerAdapter + + log: "LoggerAdapter" # type: ignore[type-arg] + def __init__( self, input_doc: ConsumableDocument, @@ -120,7 +154,7 @@ def _send_progress( status: ProgressStatusOptions, message: ConsumerStatusShortMessage | str | None = None, document_id=None, - ): # pragma: no cover + ) -> None: # pragma: no cover self.status_mgr.send_progress( status, message, @@ -156,9 +190,52 @@ class ConsumerPlugin( ConsumerPluginMixin, ConsumeTaskPlugin, ): - logging_name = "paperless.consumer" + logging_name = LOGGING_NAME + + def _create_version_from_root( + self, + root_doc: Document, + *, + text: str | None, + page_count: int | None, + mime_type: str, + ) -> Document: + self.log.debug("Saving record for updated version to database") + root_doc_frozen = Document.objects.select_for_update().get(pk=root_doc.pk) + next_version_index = ( + Document.global_objects.filter( + root_document_id=root_doc_frozen.pk, + ).aggregate( + max_index=Max("version_index"), + )["max_index"] + or 0 + ) + file_for_checksum = ( + self.unmodified_original + if self.unmodified_original is not None + else self.working_copy + ) + version_doc = Document( + root_document=root_doc_frozen, + version_index=next_version_index + 1, + checksum=hashlib.md5( + file_for_checksum.read_bytes(), + ).hexdigest(), + content=text or "", + page_count=page_count, + mime_type=mime_type, + original_filename=self.filename, + owner_id=root_doc_frozen.owner_id, + created=root_doc_frozen.created, + title=root_doc_frozen.title, + added=timezone.now(), + modified=timezone.now(), + ) + if self.metadata.version_label is not None: + version_doc.version_label = self.metadata.version_label + return version_doc - def run_pre_consume_script(self): + def run_pre_consume_script(self) -> None: """ If one is configured and exists, run the pre-consume script and handle its output and/or errors @@ -201,7 +278,7 @@ def run_pre_consume_script(self): exception=e, ) - def run_post_consume_script(self, document: Document): + def run_post_consume_script(self, document: Document) -> None: """ If one is configured and exists, run the pre-consume script and handle its output and/or errors @@ -361,7 +438,10 @@ def run(self) -> str: tempdir.cleanup() raise - def progress_callback(current_progress, max_progress): # pragma: no cover + def progress_callback( + current_progress, + max_progress, + ) -> None: # pragma: no cover # recalculate progress to be within 20 and 80 p = int((current_progress / max_progress) * 50 + 20) self._send_progress(p, 100, ProgressStatusOptions.WORKING) @@ -373,6 +453,15 @@ def progress_callback(current_progress, max_progress): # pragma: no cover progress_callback=progress_callback, ) + # New-style parsers use __enter__/__exit__ for resource management. + # _parser_cleanup (below) handles __exit__; call __enter__ here. + # TODO(stumpylog): Remove me in the future + if isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): + document_parser.__enter__() + self.log.debug(f"Parser: {type(document_parser).__name__}") # Parse the document. This may take some time. @@ -401,6 +490,12 @@ def progress_callback(current_progress, max_progress): # pragma: no cover self.filename, self.input_doc.mailrule_id, ) + elif isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): + # TODO(stumpylog): Remove me in the future + document_parser.parse(self.working_copy, mime_type) else: document_parser.parse(self.working_copy, mime_type, self.filename) @@ -411,11 +506,18 @@ def progress_callback(current_progress, max_progress): # pragma: no cover ProgressStatusOptions.WORKING, ConsumerStatusShortMessage.GENERATING_THUMBNAIL, ) - thumbnail = document_parser.get_thumbnail( - self.working_copy, - mime_type, - self.filename, - ) + if isinstance( + document_parser, + (TextDocumentParser, RemoteDocumentParser, TikaDocumentParser), + ): + # TODO(stumpylog): Remove me in the future + thumbnail = document_parser.get_thumbnail(self.working_copy, mime_type) + else: + thumbnail = document_parser.get_thumbnail( + self.working_copy, + mime_type, + self.filename, + ) text = document_parser.get_text() date = document_parser.get_date() @@ -426,12 +528,13 @@ def progress_callback(current_progress, max_progress): # pragma: no cover ProgressStatusOptions.WORKING, ConsumerStatusShortMessage.PARSE_DATE, ) - date = parse_date(self.filename, text) + with get_date_parser() as date_parser: + date = next(date_parser.parse(self.filename, text), None) archive_path = document_parser.get_archive_path() page_count = document_parser.get_page_count(self.working_copy, mime_type) except ParseError as e: - document_parser.cleanup() + _parser_cleanup(document_parser) if tempdir: tempdir.cleanup() self._fail( @@ -441,7 +544,7 @@ def progress_callback(current_progress, max_progress): # pragma: no cover exception=e, ) except Exception as e: - document_parser.cleanup() + _parser_cleanup(document_parser) if tempdir: tempdir.cleanup() self._fail( @@ -470,12 +573,65 @@ def progress_callback(current_progress, max_progress): # pragma: no cover try: with transaction.atomic(): # store the document. - document = self._store( - text=text, - date=date, - page_count=page_count, - mime_type=mime_type, - ) + if self.input_doc.root_document_id: + # If this is a new version of an existing document, we need + # to make sure we're not creating a new document, but updating + # the existing one. + root_doc = Document.objects.get( + pk=self.input_doc.root_document_id, + ) + original_document = self._create_version_from_root( + root_doc, + text=text, + page_count=page_count, + mime_type=mime_type, + ) + actor = None + + # Save the new version, potentially creating an audit log entry for the version addition if enabled. + if ( + settings.AUDIT_LOG_ENABLED + and self.metadata.actor_id is not None + ): + actor = User.objects.filter(pk=self.metadata.actor_id).first() + if actor is not None: + from auditlog.context import ( # type: ignore[import-untyped] + set_actor, + ) + + with set_actor(actor): + original_document.save() + else: + original_document.save() + else: + original_document.save() + + # Create a log entry for the version addition, if enabled + if settings.AUDIT_LOG_ENABLED: + from auditlog.models import ( # type: ignore[import-untyped] + LogEntry, + ) + + LogEntry.objects.log_create( + instance=root_doc, + changes={ + "Version Added": ["None", original_document.id], + }, + action=LogEntry.Action.UPDATE, + actor=actor, + additional_data={ + "reason": "Version added", + "version_id": original_document.id, + }, + ) + document = original_document + else: + document = self._store( + text=text, + date=date, + page_count=page_count, + mime_type=mime_type, + ) # If we get here, it was successful. Proceed with post-consume # hooks. If they fail, nothing will get changed. @@ -493,11 +649,22 @@ def progress_callback(current_progress, max_progress): # pragma: no cover # After everything is in the database, copy the files into # place. If this fails, we'll also rollback the transaction. with FileLock(settings.MEDIA_LOCK): - document.filename = generate_unique_filename(document) + generated_filename = generate_unique_filename(document) + if ( + len(str(generated_filename)) + > Document.MAX_STORED_FILENAME_LENGTH + ): + self.log.warning( + "Generated source filename exceeds db path limit, falling back to default naming", + ) + generated_filename = generate_filename( + document, + use_format=False, + ) + document.filename = generated_filename create_source_path_directory(document.source_path) self._write( - document.storage_type, self.unmodified_original if self.unmodified_original is not None else self.working_copy, @@ -505,19 +672,30 @@ def progress_callback(current_progress, max_progress): # pragma: no cover ) self._write( - document.storage_type, thumbnail, document.thumbnail_path, ) if archive_path and Path(archive_path).is_file(): - document.archive_filename = generate_unique_filename( + generated_archive_filename = generate_unique_filename( document, archive_filename=True, ) + if ( + len(str(generated_archive_filename)) + > Document.MAX_STORED_FILENAME_LENGTH + ): + self.log.warning( + "Generated archive filename exceeds db path limit, falling back to default naming", + ) + generated_archive_filename = generate_filename( + document, + archive_filename=True, + use_format=False, + ) + document.archive_filename = generated_archive_filename create_source_path_directory(document.archive_path) self._write( - document.storage_type, archive_path, document.archive_path, ) @@ -532,6 +710,12 @@ def progress_callback(current_progress, max_progress): # pragma: no cover # This triggers things like file renaming document.save() + if document.root_document_id: + document_updated.send( + sender=self.__class__, + document=document.root_document, + ) + # Delete the file only if it was successfully consumed self.log.debug(f"Deleting original file {self.input_doc.original_file}") self.input_doc.original_file.unlink() @@ -562,7 +746,7 @@ def progress_callback(current_progress, max_progress): # pragma: no cover exception=e, ) finally: - document_parser.cleanup() + _parser_cleanup(document_parser) tempdir.cleanup() self.run_post_consume_script(document) @@ -637,8 +821,6 @@ def _store( ) self.log.debug(f"Creation date from st_mtime: {create_date}") - storage_type = Document.STORAGE_TYPE_UNENCRYPTED - if self.metadata.filename: title = Path(self.metadata.filename).stem else: @@ -665,7 +847,6 @@ def _store( checksum=hashlib.md5(file_for_checksum.read_bytes()).hexdigest(), created=create_date, modified=create_date, - storage_type=storage_type, page_count=page_count, original_filename=self.filename, ) @@ -676,7 +857,7 @@ def _store( return document - def apply_overrides(self, document): + def apply_overrides(self, document) -> None: if self.metadata.correspondent_id: document.correspondent = Correspondent.objects.get( pk=self.metadata.correspondent_id, @@ -699,6 +880,9 @@ def apply_overrides(self, document): if self.metadata.asn is not None: document.archive_serial_number = self.metadata.asn + if self.metadata.version_label is not None: + document.version_label = self.metadata.version_label + if self.metadata.owner_id: document.owner = User.objects.get( pk=self.metadata.owner_id, @@ -736,7 +920,7 @@ def apply_overrides(self, document): } CustomFieldInstance.objects.create(**args) # adds to document - def _write(self, storage_type, source, target): + def _write(self, source, target) -> None: with ( Path(source).open("rb") as read_file, Path(target).open("wb") as write_file, @@ -759,9 +943,9 @@ class ConsumerPreflightPlugin( ConsumeTaskPlugin, ): NAME: str = "ConsumerPreflightPlugin" - logging_name = "paperless.consumer" + logging_name = LOGGING_NAME - def pre_check_file_exists(self): + def pre_check_file_exists(self) -> None: """ Confirm the input file still exists where it should """ @@ -775,7 +959,7 @@ def pre_check_file_exists(self): f"Cannot consume {self.input_doc.original_file}: File not found.", ) - def pre_check_duplicate(self): + def pre_check_duplicate(self) -> None: """ Using the MD5 of the file, check this exact file doesn't already exist """ @@ -785,21 +969,47 @@ def pre_check_duplicate(self): Q(checksum=checksum) | Q(archive_checksum=checksum), ) if existing_doc.exists(): - msg = ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS - log_msg = f"Not consuming {self.filename}: It is a duplicate of {existing_doc.get().title} (#{existing_doc.get().pk})." + existing_doc = existing_doc.order_by("-created") + duplicates_in_trash = existing_doc.filter(deleted_at__isnull=False) + log_msg = ( + f"Consuming duplicate {self.filename}: " + f"{existing_doc.count()} existing document(s) share the same content." + ) - if existing_doc.first().deleted_at is not None: - msg = ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS_IN_TRASH - log_msg += " Note: existing document is in the trash." + if duplicates_in_trash.exists(): + log_msg += " Note: at least one existing document is in the trash." + + self.log.warning(log_msg) if settings.CONSUMER_DELETE_DUPLICATES: + duplicate = existing_doc.first() + duplicate_label = ( + duplicate.title + or duplicate.original_filename + or (Path(duplicate.filename).name if duplicate.filename else None) + or str(duplicate.pk) + ) + Path(self.input_doc.original_file).unlink() - self._fail( - msg, - log_msg, - ) - def pre_check_directories(self): + failure_msg = ( + f"Not consuming {self.filename}: " + f"It is a duplicate of {duplicate_label} (#{duplicate.pk})" + ) + status_msg = ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS + + if duplicates_in_trash.exists(): + status_msg = ( + ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS_IN_TRASH + ) + failure_msg += " Note: existing document is in the trash." + + self._fail( + status_msg, + failure_msg, + ) + + def pre_check_directories(self) -> None: """ Ensure all required directories exist before attempting to use them """ @@ -808,12 +1018,38 @@ def pre_check_directories(self): settings.ORIGINALS_DIR.mkdir(parents=True, exist_ok=True) settings.ARCHIVE_DIR.mkdir(parents=True, exist_ok=True) - def pre_check_asn_value(self): + def run(self) -> None: + self._send_progress( + 0, + 100, + ProgressStatusOptions.STARTED, + ConsumerStatusShortMessage.NEW_FILE, + ) + + # Make sure that preconditions for consuming the file are met. + + self.pre_check_file_exists() + self.pre_check_duplicate() + self.pre_check_directories() + + +class AsnCheckPlugin( + NoCleanupPluginMixin, + NoSetupPluginMixin, + AlwaysRunPluginMixin, + LoggingMixin, + ConsumerPluginMixin, + ConsumeTaskPlugin, +): + NAME: str = "AsnCheckPlugin" + logging_name = LOGGING_NAME + + def pre_check_asn_value(self) -> None: """ Check that if override_asn is given, it is unique and within a valid range """ if self.metadata.asn is None: - # check not necessary in case no ASN gets set + # if ASN is None return # Validate the range is above zero and less than uint32_t max # otherwise, Whoosh can't handle it in the index @@ -845,16 +1081,4 @@ def pre_check_asn_value(self): ) def run(self) -> None: - self._send_progress( - 0, - 100, - ProgressStatusOptions.STARTED, - ConsumerStatusShortMessage.NEW_FILE, - ) - - # Make sure that preconditions for consuming the file are met. - - self.pre_check_file_exists() - self.pre_check_duplicate() - self.pre_check_directories() self.pre_check_asn_value() diff --git a/src/documents/data_models.py b/src/documents/data_models.py index 7f98a1f05b..a2452a8af4 100644 --- a/src/documents/data_models.py +++ b/src/documents/data_models.py @@ -22,7 +22,7 @@ class DocumentMetadataOverrides: document_type_id: int | None = None tag_ids: list[int] | None = None storage_path_id: int | None = None - created: datetime.datetime | None = None + created: datetime.date | None = None asn: int | None = None owner_id: int | None = None view_users: list[int] | None = None @@ -30,6 +30,9 @@ class DocumentMetadataOverrides: change_users: list[int] | None = None change_groups: list[int] | None = None custom_fields: dict | None = None + skip_asn_if_exists: bool = False + version_label: str | None = None + actor_id: int | None = None def update(self, other: "DocumentMetadataOverrides") -> "DocumentMetadataOverrides": """ @@ -49,6 +52,12 @@ def update(self, other: "DocumentMetadataOverrides") -> "DocumentMetadataOverrid self.storage_path_id = other.storage_path_id if other.owner_id is not None: self.owner_id = other.owner_id + if other.actor_id is not None: + self.actor_id = other.actor_id + if other.skip_asn_if_exists: + self.skip_asn_if_exists = True + if other.version_label is not None: + self.version_label = other.version_label # merge if self.tag_ids is None: @@ -100,6 +109,7 @@ def from_document(doc) -> "DocumentMetadataOverrides": overrides.storage_path_id = doc.storage_path.id if doc.storage_path else None overrides.owner_id = doc.owner.id if doc.owner else None overrides.tag_ids = list(doc.tags.values_list("id", flat=True)) + overrides.created = doc.created overrides.view_users = list( get_users_with_perms( @@ -114,7 +124,7 @@ def from_document(doc) -> "DocumentMetadataOverrides": ).values_list("id", flat=True), ) overrides.custom_fields = { - custom_field.id: custom_field.value + custom_field.field.id: custom_field.value for custom_field in doc.custom_fields.all() } @@ -156,11 +166,12 @@ class ConsumableDocument: source: DocumentSource original_file: Path + root_document_id: int | None = None original_path: Path | None = None mailrule_id: int | None = None mime_type: str = dataclasses.field(init=False, default=None) - def __post_init__(self): + def __post_init__(self) -> None: """ After a dataclass is initialized, this is called to finalize some data 1. Make sure the original path is an absolute, fully qualified path diff --git a/src/documents/file_handling.py b/src/documents/file_handling.py index 3a0ffd9fbe..7f59d45571 100644 --- a/src/documents/file_handling.py +++ b/src/documents/file_handling.py @@ -99,51 +99,62 @@ def generate_unique_filename(doc, *, archive_filename=False) -> Path: return new_filename +def format_filename(document: Document, template_str: str) -> str | None: + rendered_filename = validate_filepath_template_and_render( + template_str, + document, + ) + if rendered_filename is None: + return None + + # Apply this setting. It could become a filter in the future (or users could use |default) + if settings.FILENAME_FORMAT_REMOVE_NONE: + rendered_filename = rendered_filename.replace("/-none-/", "/") + rendered_filename = rendered_filename.replace(" -none-", "") + rendered_filename = rendered_filename.replace("-none-", "") + rendered_filename = rendered_filename.strip(os.sep) + + rendered_filename = rendered_filename.replace( + "-none-", + "none", + ) # backward compatibility + + return rendered_filename + + def generate_filename( doc: Document, *, counter=0, - append_gpg=True, archive_filename=False, + use_format=True, ) -> Path: + # version docs use the root document for formatting, just with a suffix + context_doc = doc if doc.root_document_id is None else doc.root_document + version_suffix = ( + f"_v{doc.version_index}" + if doc.root_document_id is not None and doc.version_index is not None + else "" + ) base_path: Path | None = None - def format_filename(document: Document, template_str: str) -> str | None: - rendered_filename = validate_filepath_template_and_render( - template_str, - document, - ) - if rendered_filename is None: - return None - - # Apply this setting. It could become a filter in the future (or users could use |default) - if settings.FILENAME_FORMAT_REMOVE_NONE: - rendered_filename = rendered_filename.replace("/-none-/", "/") - rendered_filename = rendered_filename.replace(" -none-", "") - rendered_filename = rendered_filename.replace("-none-", "") - rendered_filename = rendered_filename.strip(os.sep) - - rendered_filename = rendered_filename.replace( - "-none-", - "none", - ) # backward compatibility - - return rendered_filename - # Determine the source of the format string - if doc.storage_path is not None: - filename_format = doc.storage_path.path - elif settings.FILENAME_FORMAT is not None: - # Maybe convert old to new style - filename_format = convert_format_str_to_template_format( - settings.FILENAME_FORMAT, - ) + if use_format: + if context_doc.storage_path is not None: + filename_format = context_doc.storage_path.path + elif settings.FILENAME_FORMAT is not None: + # Maybe convert old to new style + filename_format = convert_format_str_to_template_format( + settings.FILENAME_FORMAT, + ) + else: + filename_format = None else: filename_format = None # If we have one, render it if filename_format is not None: - rendered_path: str | None = format_filename(doc, filename_format) + rendered_path: str | None = format_filename(context_doc, filename_format) if rendered_path: base_path = Path(rendered_path) @@ -157,7 +168,7 @@ def format_filename(document: Document, template_str: str) -> str | None: base_filename = base_path.name # Build the final filename with counter and filetype - final_filename = f"{base_filename}{counter_str}{filetype_str}" + final_filename = f"{base_filename}{version_suffix}{counter_str}{filetype_str}" # If we have a directory component, include it if str(directory) != ".": @@ -166,11 +177,9 @@ def format_filename(document: Document, template_str: str) -> str | None: full_path = Path(final_filename) else: # No template, use document ID - final_filename = f"{doc.pk:07}{counter_str}{filetype_str}" + final_filename = ( + f"{context_doc.pk:07}{version_suffix}{counter_str}{filetype_str}" + ) full_path = Path(final_filename) - # Add GPG extension if needed - if append_gpg and doc.storage_type == doc.STORAGE_TYPE_GPG: - full_path = full_path.with_suffix(full_path.suffix + ".gpg") - return full_path diff --git a/src/documents/filters.py b/src/documents/filters.py index 3a8d4d327f..2f7de1cd41 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -6,8 +6,10 @@ import operator from contextlib import contextmanager from typing import TYPE_CHECKING +from typing import Any from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldError from django.db.models import Case from django.db.models import CharField from django.db.models import Count @@ -39,6 +41,7 @@ from documents.models import DocumentType from documents.models import PaperlessTask from documents.models import ShareLink +from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag @@ -119,7 +122,7 @@ class Meta: class ObjectFilter(Filter): - def __init__(self, *, exclude=False, in_list=False, field_name=""): + def __init__(self, *, exclude=False, in_list=False, field_name="") -> None: super().__init__() self.exclude = exclude self.in_list = in_list @@ -159,13 +162,37 @@ def filter(self, qs, value): @extend_schema_field(serializers.CharField) class TitleContentFilter(Filter): - def filter(self, qs, value): + def filter(self, qs: Any, value: Any) -> Any: + value = value.strip() if isinstance(value, str) else value if value: - return qs.filter(Q(title__icontains=value) | Q(content__icontains=value)) + try: + return qs.filter( + Q(title__icontains=value) | Q(effective_content__icontains=value), + ) + except FieldError: + return qs.filter( + Q(title__icontains=value) | Q(content__icontains=value), + ) else: return qs +@extend_schema_field(serializers.CharField) +class EffectiveContentFilter(Filter): + def filter(self, qs: Any, value: Any) -> Any: + value = value.strip() if isinstance(value, str) else value + if not value: + return qs + try: + return qs.filter( + **{f"effective_content__{self.lookup_expr}": value}, + ) + except FieldError: + return qs.filter( + **{f"content__{self.lookup_expr}": value}, + ) + + @extend_schema_field(serializers.BooleanField) class SharedByUser(Filter): def filter(self, qs, value): @@ -214,6 +241,7 @@ class Meta: @extend_schema_field(serializers.CharField) class CustomFieldsFilter(Filter): def filter(self, qs, value): + value = value.strip() if isinstance(value, str) else value if value: fields_with_matching_selects = CustomField.objects.filter( extra_data__icontains=value, @@ -244,6 +272,7 @@ def filter(self, qs, value): class MimeTypeFilter(Filter): def filter(self, qs, value): + value = value.strip() if isinstance(value, str) else value if value: return qs.filter(mime_type__icontains=value) else: @@ -251,7 +280,7 @@ def filter(self, qs, value): class SelectField(serializers.CharField): - def __init__(self, custom_field: CustomField): + def __init__(self, custom_field: CustomField) -> None: self._options = custom_field.extra_data["select_options"] super().__init__(max_length=16) @@ -672,7 +701,7 @@ def _track_query_depth(self): @extend_schema_field(serializers.CharField) class CustomFieldQueryFilter(Filter): - def __init__(self, validation_prefix): + def __init__(self, validation_prefix) -> None: """ A filter that filters documents based on custom field name and value. @@ -720,6 +749,11 @@ class DocumentFilterSet(FilterSet): title_content = TitleContentFilter() + content__istartswith = EffectiveContentFilter(lookup_expr="istartswith") + content__iendswith = EffectiveContentFilter(lookup_expr="iendswith") + content__icontains = EffectiveContentFilter(lookup_expr="icontains") + content__iexact = EffectiveContentFilter(lookup_expr="iexact") + owner__id__none = ObjectFilter(field_name="owner", exclude=True) custom_fields__icontains = CustomFieldsFilter() @@ -760,7 +794,6 @@ class Meta: fields = { "id": ID_KWARGS, "title": CHAR_KWARGS, - "content": CHAR_KWARGS, "archive_serial_number": INT_KWARGS, "created": DATE_KWARGS, "added": DATETIME_KWARGS, @@ -793,6 +826,29 @@ class Meta: } +class ShareLinkBundleFilterSet(FilterSet): + documents = Filter(method="filter_documents") + + class Meta: + model = ShareLinkBundle + fields = { + "created": DATETIME_KWARGS, + "expiration": DATETIME_KWARGS, + "status": ["exact"], + } + + def filter_documents(self, queryset, name, value): + ids = [] + if value: + try: + ids = [int(item) for item in value.split(",") if item] + except ValueError: + return queryset.none() + if not ids: + return queryset + return queryset.filter(documents__in=ids).distinct() + + class PaperlessTaskFilterSet(FilterSet): acknowledged = BooleanFilter( label="Acknowledged", diff --git a/src/documents/index.py b/src/documents/index.py index 90cbb8000c..3a3b59e37a 100644 --- a/src/documents/index.py +++ b/src/documents/index.py @@ -5,14 +5,16 @@ import re from collections import Counter from contextlib import contextmanager +from datetime import UTC from datetime import datetime from datetime import time from datetime import timedelta -from datetime import timezone from shutil import rmtree +from time import sleep from typing import TYPE_CHECKING from typing import Literal +from dateutil.relativedelta import relativedelta from django.conf import settings from django.utils import timezone as django_timezone from django.utils.timezone import get_current_timezone @@ -31,6 +33,7 @@ from whoosh.idsets import BitSet from whoosh.idsets import DocIdSet from whoosh.index import FileIndex +from whoosh.index import LockError from whoosh.index import create_in from whoosh.index import exists_in from whoosh.index import open_dir @@ -96,11 +99,33 @@ def get_schema() -> Schema: def open_index(*, recreate=False) -> FileIndex: - try: - if exists_in(settings.INDEX_DIR) and not recreate: - return open_dir(settings.INDEX_DIR, schema=get_schema()) - except Exception: - logger.exception("Error while opening the index, recreating.") + transient_exceptions = (FileNotFoundError, LockError) + max_retries = 3 + retry_delay = 0.1 + + for attempt in range(max_retries + 1): + try: + if exists_in(settings.INDEX_DIR) and not recreate: + return open_dir(settings.INDEX_DIR, schema=get_schema()) + break + except transient_exceptions as exc: + is_last_attempt = attempt == max_retries or recreate + if is_last_attempt: + logger.exception( + "Error while opening the index after retries, recreating.", + ) + break + + logger.warning( + "Transient error while opening the index (attempt %s/%s): %s. Retrying.", + attempt + 1, + max_retries + 1, + exc, + ) + sleep(retry_delay) + except Exception: + logger.exception("Error while opening the index, recreating.") + break # create_in doesn't handle corrupted indexes very well, remove the directory entirely first if settings.INDEX_DIR.is_dir(): @@ -133,7 +158,11 @@ def open_index_searcher() -> Searcher: searcher.close() -def update_document(writer: AsyncWriter, doc: Document) -> None: +def update_document( + writer: AsyncWriter, + doc: Document, + effective_content: str | None = None, +) -> None: tags = ",".join([t.name for t in doc.tags.all()]) tags_ids = ",".join([str(t.id) for t in doc.tags.all()]) notes = ",".join([str(c.note) for c in Note.objects.filter(document=doc)]) @@ -163,7 +192,7 @@ def update_document(writer: AsyncWriter, doc: Document) -> None: writer.update_document( id=doc.pk, title=doc.title, - content=doc.content, + content=effective_content or doc.content, correspondent=doc.correspondent.name if doc.correspondent else None, correspondent_id=doc.correspondent.id if doc.correspondent else None, has_correspondent=doc.correspondent is not None, @@ -206,9 +235,12 @@ def remove_document_by_id(writer: AsyncWriter, doc_id) -> None: writer.delete_by_term("id", doc_id) -def add_or_update_document(document: Document) -> None: +def add_or_update_document( + document: Document, + effective_content: str | None = None, +) -> None: with open_index_writer() as writer: - update_document(writer, document) + update_document(writer, document, effective_content=effective_content) def remove_document_from_index(document: Document) -> None: @@ -287,15 +319,75 @@ def __init__( self.first_score = None self.filter_queryset = filter_queryset self.suggested_correction = None + self._manual_hits_cache: list | None = None def __len__(self) -> int: + if self._manual_sort_requested(): + manual_hits = self._manual_hits() + return len(manual_hits) + page = self[0:1] return len(page) + def _manual_sort_requested(self): + ordering = self.query_params.get("ordering", "") + return ordering.lstrip("-").startswith("custom_field_") + + def _manual_hits(self): + if self._manual_hits_cache is None: + q, mask, suggested_correction = self._get_query() + self.suggested_correction = suggested_correction + + results = self.searcher.search( + q, + mask=mask, + filter=MappedDocIdSet(self.filter_queryset, self.searcher.ixreader), + limit=None, + ) + results.fragmenter = highlight.ContextFragmenter(surround=50) + results.formatter = HtmlFormatter(tagname="span", between=" ... ") + + if not self.first_score and len(results) > 0: + self.first_score = results[0].score + + if self.first_score: + results.top_n = [ + ( + (hit[0] / self.first_score) if self.first_score else None, + hit[1], + ) + for hit in results.top_n + ] + + hits_by_id = {hit["id"]: hit for hit in results} + matching_ids = list(hits_by_id.keys()) + + ordered_ids = list( + self.filter_queryset.filter(id__in=matching_ids).values_list( + "id", + flat=True, + ), + ) + ordered_ids = list(dict.fromkeys(ordered_ids)) + + self._manual_hits_cache = [ + hits_by_id[_id] for _id in ordered_ids if _id in hits_by_id + ] + return self._manual_hits_cache + def __getitem__(self, item): if item.start in self.saved_results: return self.saved_results[item.start] + if self._manual_sort_requested(): + manual_hits = self._manual_hits() + start = 0 if item.start is None else item.start + stop = item.stop + hits = manual_hits[start:stop] if stop is not None else manual_hits[start:] + page = ManualResultsPage(hits) + self.saved_results[start] = page + return page + q, mask, suggested_correction = self._get_query() self.suggested_correction = suggested_correction sortedby, reverse = self._get_query_sortedby() @@ -315,25 +407,37 @@ def __getitem__(self, item): if not self.first_score and len(page.results) > 0 and sortedby is None: self.first_score = page.results[0].score - page.results.top_n = list( - map( - lambda hit: ( - (hit[0] / self.first_score) if self.first_score else None, - hit[1], - ), - page.results.top_n, - ), - ) + page.results.top_n = [ + ( + (hit[0] / self.first_score) if self.first_score else None, + hit[1], + ) + for hit in page.results.top_n + ] self.saved_results[item.start] = page return page +class ManualResultsPage(list): + def __init__(self, hits) -> None: + super().__init__(hits) + self.results = ManualResults(hits) + + +class ManualResults: + def __init__(self, hits) -> None: + self._docnums = [hit.docnum for hit in hits] + + def docs(self): + return self._docnums + + class LocalDateParser(English): def reverse_timezone_offset(self, d): return (d.replace(tzinfo=django_timezone.get_current_timezone())).astimezone( - timezone.utc, + UTC, ) def date_from(self, *args, **kwargs): @@ -461,32 +565,84 @@ def get_permissions_criterias(user: User | None = None) -> list: def rewrite_natural_date_keywords(query_string: str) -> str: """ Rewrites natural date keywords (e.g. added:today or added:"yesterday") to UTC range syntax for Whoosh. + This resolves timezone issues with date parsing in Whoosh as well as adding support for more + natural date keywords. """ tz = get_current_timezone() local_now = now().astimezone(tz) - today = local_now.date() - yesterday = today - timedelta(days=1) - - ranges = { - "today": ( - datetime.combine(today, time.min, tzinfo=tz), - datetime.combine(today, time.max, tzinfo=tz), - ), - "yesterday": ( - datetime.combine(yesterday, time.min, tzinfo=tz), - datetime.combine(yesterday, time.max, tzinfo=tz), - ), - } - pattern = r"(\b(?:added|created))\s*:\s*[\"']?(today|yesterday)[\"']?" + # all supported Keywords + pattern = r"(\b(?:added|created|modified))\s*:\s*[\"']?(today|yesterday|this month|previous month|previous week|previous quarter|this year|previous year)[\"']?" def repl(m): - field, keyword = m.group(1), m.group(2) - start, end = ranges[keyword] - start_str = start.astimezone(timezone.utc).strftime("%Y%m%d%H%M%S") - end_str = end.astimezone(timezone.utc).strftime("%Y%m%d%H%M%S") + field = m.group(1) + keyword = m.group(2).lower() + + match keyword: + case "today": + start = datetime.combine(today, time.min, tzinfo=tz) + end = datetime.combine(today, time.max, tzinfo=tz) + + case "yesterday": + yesterday = today - timedelta(days=1) + start = datetime.combine(yesterday, time.min, tzinfo=tz) + end = datetime.combine(yesterday, time.max, tzinfo=tz) + + case "this month": + start = datetime(local_now.year, local_now.month, 1, 0, 0, 0, tzinfo=tz) + end = start + relativedelta(months=1) - timedelta(seconds=1) + + case "previous month": + this_month_start = datetime( + local_now.year, + local_now.month, + 1, + 0, + 0, + 0, + tzinfo=tz, + ) + start = this_month_start - relativedelta(months=1) + end = this_month_start - timedelta(seconds=1) + + case "this year": + start = datetime(local_now.year, 1, 1, 0, 0, 0, tzinfo=tz) + end = datetime(local_now.year, 12, 31, 23, 59, 59, tzinfo=tz) + + case "previous week": + days_since_monday = local_now.weekday() + this_week_start = datetime.combine( + today - timedelta(days=days_since_monday), + time.min, + tzinfo=tz, + ) + start = this_week_start - timedelta(days=7) + end = this_week_start - timedelta(seconds=1) + + case "previous quarter": + current_quarter = (local_now.month - 1) // 3 + 1 + this_quarter_start_month = (current_quarter - 1) * 3 + 1 + this_quarter_start = datetime( + local_now.year, + this_quarter_start_month, + 1, + 0, + 0, + 0, + tzinfo=tz, + ) + start = this_quarter_start - relativedelta(months=3) + end = this_quarter_start - timedelta(seconds=1) + + case "previous year": + start = datetime(local_now.year - 1, 1, 1, 0, 0, 0, tzinfo=tz) + end = datetime(local_now.year - 1, 12, 31, 23, 59, 59, tzinfo=tz) + + # Convert to UTC and format + start_str = start.astimezone(UTC).strftime("%Y%m%d%H%M%S") + end_str = end.astimezone(UTC).strftime("%Y%m%d%H%M%S") return f"{field}:[{start_str} TO {end_str}]" - return re.sub(pattern, repl, query_string) + return re.sub(pattern, repl, query_string, flags=re.IGNORECASE) diff --git a/src/documents/loggers.py b/src/documents/loggers.py index 87ee58868d..f30c823f16 100644 --- a/src/documents/loggers.py +++ b/src/documents/loggers.py @@ -3,7 +3,7 @@ class LoggingMixin: - def renew_logging_group(self): + def renew_logging_group(self) -> None: """ Creates a new UUID to group subsequent log calls together with the extra data named group diff --git a/src/documents/mail.py b/src/documents/mail.py index 6af48ca9b3..21bf03c7a9 100644 --- a/src/documents/mail.py +++ b/src/documents/mail.py @@ -1,25 +1,26 @@ from __future__ import annotations +from dataclasses import dataclass from email import message_from_bytes -from typing import TYPE_CHECKING +from pathlib import Path from django.conf import settings from django.core.mail import EmailMessage from filelock import FileLock -from documents.data_models import ConsumableDocument -if TYPE_CHECKING: - from documents.models import Document +@dataclass(frozen=True) +class EmailAttachment: + path: Path + mime_type: str + friendly_name: str def send_email( subject: str, body: str, to: list[str], - attachments: list[Document | ConsumableDocument], - *, - use_archive: bool, + attachments: list[EmailAttachment], ) -> int: """ Send an email with attachments. @@ -28,8 +29,7 @@ def send_email( subject: Email subject body: Email body text to: List of recipient email addresses - attachments: List of documents to attach (the list may be empty) - use_archive: Whether to attach archive versions when available + attachments: List of attachments Returns: Number of emails sent @@ -46,47 +46,41 @@ def send_email( # Something could be renaming the file concurrently so it can't be attached with FileLock(settings.MEDIA_LOCK): - for document in attachments: - if isinstance(document, ConsumableDocument): - attachment_path = document.original_file - friendly_filename = document.original_file.name - else: - attachment_path = ( - document.archive_path - if use_archive and document.has_archive_version - else document.source_path - ) - friendly_filename = _get_unique_filename( - document, - used_filenames, - archive=use_archive and document.has_archive_version, - ) - used_filenames.add(friendly_filename) - - with attachment_path.open("rb") as f: + for attachment in attachments: + filename = _get_unique_filename( + attachment.friendly_name, + used_filenames, + ) + used_filenames.add(filename) + + with attachment.path.open("rb") as f: content = f.read() - if document.mime_type == "message/rfc822": + if attachment.mime_type == "message/rfc822": # See https://forum.djangoproject.com/t/using-emailmessage-with-an-attached-email-file-crashes-due-to-non-ascii/37981 content = message_from_bytes(content) email.attach( - filename=friendly_filename, + filename=filename, content=content, - mimetype=document.mime_type, + mimetype=attachment.mime_type, ) return email.send() -def _get_unique_filename(doc: Document, used_names: set[str], *, archive: bool) -> str: +def _get_unique_filename(friendly_name: str, used_names: set[str]) -> str: """ - Constructs a unique friendly filename for the given document. - - The filename might not be unique enough, so a counter is appended if needed. + Constructs a unique friendly filename for the given document, append a counter if needed. """ - counter = 0 + if friendly_name not in used_names: + return friendly_name + + stem = Path(friendly_name).stem + suffix = "".join(Path(friendly_name).suffixes) + + counter = 1 while True: - filename = doc.get_public_filename(archive=archive, counter=counter) + filename = f"{stem}_{counter:02}{suffix}" if filename not in used_names: return filename counter += 1 diff --git a/src/documents/management/commands/base.py b/src/documents/management/commands/base.py new file mode 100644 index 0000000000..1d76460c06 --- /dev/null +++ b/src/documents/management/commands/base.py @@ -0,0 +1,550 @@ +""" +Base command class for Paperless-ngx management commands. + +Provides automatic progress bar and multiprocessing support with minimal boilerplate. +""" + +from __future__ import annotations + +import logging +import os +from collections.abc import Callable +from collections.abc import Iterable +from collections.abc import Sized +from concurrent.futures import ProcessPoolExecutor +from concurrent.futures import as_completed +from contextlib import contextmanager +from dataclasses import dataclass +from typing import TYPE_CHECKING +from typing import Any +from typing import ClassVar +from typing import Generic +from typing import TypeVar + +from django import db +from django.core.management import CommandError +from django.db.models import QuerySet +from django_rich.management import RichCommand +from rich import box +from rich.console import Console +from rich.console import Group +from rich.console import RenderableType +from rich.live import Live +from rich.progress import BarColumn +from rich.progress import MofNCompleteColumn +from rich.progress import Progress +from rich.progress import SpinnerColumn +from rich.progress import TextColumn +from rich.progress import TimeElapsedColumn +from rich.progress import TimeRemainingColumn +from rich.table import Table +from rich.text import Text + +if TYPE_CHECKING: + from collections.abc import Generator + from collections.abc import Sequence + + from django.core.management import CommandParser + +T = TypeVar("T") +R = TypeVar("R") + + +@dataclass(slots=True, frozen=True) +class _BufferedRecord: + level: int + name: str + message: str + + +class BufferingLogHandler(logging.Handler): + """Captures log records during a command run for deferred rendering. + + Attach to a logger before a long operation and call ``render()`` + afterwards to emit the buffered records via Rich, optionally filtered + by minimum level. + """ + + def __init__(self) -> None: + super().__init__() + self._records: list[_BufferedRecord] = [] + + def emit(self, record: logging.LogRecord) -> None: + self._records.append( + _BufferedRecord( + level=record.levelno, + name=record.name, + message=self.format(record), + ), + ) + + def render( + self, + console: Console, + *, + min_level: int = logging.DEBUG, + title: str = "Log Output", + ) -> None: + records = [r for r in self._records if r.level >= min_level] + if not records: + return + + table = Table( + title=title, + show_header=True, + header_style="bold", + show_lines=False, + box=box.SIMPLE, + ) + table.add_column("Level", style="bold", width=8) + table.add_column("Logger", style="dim") + table.add_column("Message", no_wrap=False) + + _level_styles: dict[int, str] = { + logging.DEBUG: "dim", + logging.INFO: "cyan", + logging.WARNING: "yellow", + logging.ERROR: "red", + logging.CRITICAL: "bold red", + } + + for record in records: + style = _level_styles.get(record.level, "") + table.add_row( + Text(logging.getLevelName(record.level), style=style), + record.name, + record.message, + ) + + console.print(table) + + def clear(self) -> None: + self._records.clear() + + +@dataclass(frozen=True, slots=True) +class ProcessResult(Generic[T, R]): + """ + Result of processing a single item in parallel. + + Attributes: + item: The input item that was processed. + result: The return value from the processing function, or None if an error occurred. + error: The exception if processing failed, or None on success. + """ + + item: T + result: R | None + error: BaseException | None + + @property + def success(self) -> bool: + """Return True if the item was processed successfully.""" + return self.error is None + + +class PaperlessCommand(RichCommand): + """ + Base command class with automatic progress bar and multiprocessing support. + + Features are opt-in via class attributes: + supports_progress_bar: Adds --no-progress-bar argument (default: True) + supports_multiprocessing: Adds --processes argument (default: False) + + Example usage: + + class Command(PaperlessCommand): + help = "Process all documents" + + def handle(self, *args, **options): + documents = Document.objects.all() + for doc in self.track(documents, description="Processing..."): + process_document(doc) + + class Command(PaperlessCommand): + help = "Regenerate thumbnails" + supports_multiprocessing = True + + def handle(self, *args, **options): + ids = list(Document.objects.values_list("id", flat=True)) + for result in self.process_parallel(process_doc, ids): + if result.error: + self.console.print(f"[red]Failed: {result.error}[/red]") + + class Command(PaperlessCommand): + help = "Import documents with live stats" + + def handle(self, *args, **options): + stats = ImportStats() + + def render_stats() -> Table: + ... # build Rich Table from stats + + for item in self.track_with_stats( + items, + description="Importing...", + stats_renderer=render_stats, + ): + result = import_item(item) + stats.imported += 1 + """ + + supports_progress_bar: ClassVar[bool] = True + supports_multiprocessing: ClassVar[bool] = False + + # Instance attributes set by execute() before handle() runs + no_progress_bar: bool + process_count: int + + def add_arguments(self, parser: CommandParser) -> None: + """Add arguments based on supported features.""" + super().add_arguments(parser) + + if self.supports_progress_bar: + parser.add_argument( + "--no-progress-bar", + default=False, + action="store_true", + help="Disable the progress bar", + ) + + if self.supports_multiprocessing: + default_processes = max(1, (os.cpu_count() or 1) // 4) + parser.add_argument( + "--processes", + default=default_processes, + type=int, + help=f"Number of processes to use (default: {default_processes})", + ) + + def execute(self, *args: Any, **options: Any) -> str | None: + """ + Set up instance state before handle() is called. + + This is called by Django's command infrastructure after argument parsing + but before handle(). We use it to set instance attributes from options. + """ + if self.supports_progress_bar: + self.no_progress_bar = options.get("no_progress_bar", False) + else: + self.no_progress_bar = True + + if self.supports_multiprocessing: + self.process_count = options.get("processes", 1) + if self.process_count < 1: + raise CommandError("--processes must be at least 1") + else: + self.process_count = 1 + + return super().execute(*args, **options) + + @contextmanager + def buffered_logging( + self, + *logger_names: str, + level: int = logging.DEBUG, + ) -> Generator[BufferingLogHandler, None, None]: + """Context manager that captures log output from named loggers. + + Installs a ``BufferingLogHandler`` on each named logger for the + duration of the block, suppressing propagation to avoid interleaving + with the Rich live display. The handler is removed on exit regardless + of whether an exception occurred. + + Usage:: + + with self.buffered_logging("paperless", "documents") as log_buf: + # ... run progress loop ... + if options["verbose"]: + log_buf.render(self.console) + """ + handler = BufferingLogHandler() + handler.setFormatter(logging.Formatter("%(message)s")) + + loggers: list[logging.Logger] = [] + original_propagate: dict[str, bool] = {} + + for name in logger_names: + log = logging.getLogger(name) + log.addHandler(handler) + original_propagate[name] = log.propagate + log.propagate = False + loggers.append(log) + + try: + yield handler + finally: + for log in loggers: + log.removeHandler(handler) + log.propagate = original_propagate[log.name] + + @staticmethod + def _progress_columns() -> tuple[Any, ...]: + """ + Return the standard set of progress bar columns. + + Extracted so both _create_progress (standalone) and track_with_stats + (inside Live) use identical column configuration without duplication. + """ + return ( + SpinnerColumn(), + TextColumn("[progress.description]{task.description}"), + BarColumn(), + MofNCompleteColumn(), + TimeElapsedColumn(), + TimeRemainingColumn(), + ) + + def _create_progress(self, description: str) -> Progress: + """ + Create a standalone Progress instance with its own stderr Console. + + Use this for track(). For track_with_stats(), Progress is created + directly inside a Live context instead. + + Progress output is directed to stderr to match the convention that + progress bars are transient UI feedback, not command output. This + mirrors the convention that progress bars are transient UI feedback and prevents progress bar rendering + from interfering with stdout-based assertions in tests or piped + command output. + + Args: + description: Text to display alongside the progress bar. + + Returns: + A Progress instance configured with appropriate columns. + """ + return Progress( + *self._progress_columns(), + console=Console(stderr=True), + transient=False, + ) + + def _get_iterable_length(self, iterable: Iterable[object]) -> int | None: + """ + Attempt to determine the length of an iterable without consuming it. + + Tries .count() first (for Django querysets - executes SELECT COUNT(*)), + then falls back to len() for sequences. + + Args: + iterable: The iterable to measure. + + Returns: + The length if determinable, None otherwise. + """ + if isinstance(iterable, QuerySet): + return iterable.count() + + if isinstance(iterable, Sized): + return len(iterable) + + return None + + def track( + self, + iterable: Iterable[T], + *, + description: str = "Processing...", + total: int | None = None, + ) -> Generator[T, None, None]: + """ + Iterate over items with an optional progress bar. + + Respects --no-progress-bar flag. When disabled, simply yields items + without any progress display. + + Args: + iterable: The items to iterate over. + description: Text to display alongside the progress bar. + total: Total number of items. If None, attempts to determine + automatically via .count() (for querysets) or len(). + + Yields: + Items from the iterable. + + Example: + for doc in self.track(documents, description="Renaming..."): + process(doc) + """ + if self.no_progress_bar: + yield from iterable + return + + if total is None: + total = self._get_iterable_length(iterable) + + with self._create_progress(description) as progress: + task_id = progress.add_task(description, total=total) + for item in iterable: + yield item + progress.advance(task_id) + + def track_with_stats( + self, + iterable: Iterable[T], + *, + description: str = "Processing...", + stats_renderer: Callable[[], RenderableType], + total: int | None = None, + ) -> Generator[T, None, None]: + """ + Iterate over items with a progress bar and a live-updating stats display. + + The progress bar and stats renderable are combined in a single Live + context, so the stats panel re-renders in place below the progress bar + after each item is processed. + + Respects --no-progress-bar flag. When disabled, yields items without + any display (stats are still updated by the caller's loop body, so + they will be accurate for any post-loop summary the caller prints). + + Args: + iterable: The items to iterate over. + description: Text to display alongside the progress bar. + stats_renderer: Zero-argument callable that returns a Rich + renderable. Called after each item to refresh the display. + The caller typically closes over a mutable dataclass and + rebuilds a Table from it on each call. + total: Total number of items. If None, attempts to determine + automatically via .count() (for querysets) or len(). + + Yields: + Items from the iterable. + + Example: + @dataclass + class Stats: + processed: int = 0 + failed: int = 0 + + stats = Stats() + + def render_stats() -> Table: + table = Table(box=None) + table.add_column("Processed") + table.add_column("Failed") + table.add_row(str(stats.processed), str(stats.failed)) + return table + + for item in self.track_with_stats( + items, + description="Importing...", + stats_renderer=render_stats, + ): + try: + import_item(item) + stats.processed += 1 + except Exception: + stats.failed += 1 + """ + if self.no_progress_bar: + yield from iterable + return + + if total is None: + total = self._get_iterable_length(iterable) + + stderr_console = Console(stderr=True) + + # Progress is created without its own console so Live controls rendering. + progress = Progress(*self._progress_columns()) + task_id = progress.add_task(description, total=total) + + with Live( + Group(progress, stats_renderer()), + console=stderr_console, + refresh_per_second=4, + ) as live: + for item in iterable: + yield item + progress.advance(task_id) + live.update(Group(progress, stats_renderer())) + + def process_parallel( + self, + fn: Callable[[T], R], + items: Sequence[T], + *, + description: str = "Processing...", + ) -> Generator[ProcessResult[T, R], None, None]: + """ + Process items in parallel with progress tracking. + + When --processes=1, runs sequentially in the main process without + spawning subprocesses. This is critical for testing, as multiprocessing + breaks fixtures, mocks, and database transactions. + + When --processes > 1, uses ProcessPoolExecutor and automatically closes + database connections before spawning workers (required for PostgreSQL). + + Args: + fn: Function to apply to each item. Must be picklable for parallel + execution (i.e., defined at module level, not a lambda or closure). + items: Sequence of items to process. + description: Text to display alongside the progress bar. + + Yields: + ProcessResult for each item, containing the item, result, and any error. + + Example: + def regenerate_thumbnail(doc_id: int) -> Path: + ... + + for result in self.process_parallel(regenerate_thumbnail, doc_ids): + if result.error: + self.console.print(f"[red]Failed {result.item}[/red]") + """ + total = len(items) + + if self.process_count == 1: + # Sequential execution in main process - critical for testing, so we don't fork in fork, etc + yield from self._process_sequential(fn, items, description, total) + else: + # Parallel execution with ProcessPoolExecutor + yield from self._process_parallel(fn, items, description, total) + + def _process_sequential( + self, + fn: Callable[[T], R], + items: Sequence[T], + description: str, + total: int, + ) -> Generator[ProcessResult[T, R], None, None]: + """Process items sequentially in the main process.""" + for item in self.track(items, description=description, total=total): + try: + result = fn(item) + yield ProcessResult(item=item, result=result, error=None) + except Exception as e: + yield ProcessResult(item=item, result=None, error=e) + + def _process_parallel( + self, + fn: Callable[[T], R], + items: Sequence[T], + description: str, + total: int, + ) -> Generator[ProcessResult[T, R], None, None]: + """Process items in parallel using ProcessPoolExecutor.""" + + # Close database connections before forking - required for PostgreSQL + db.connections.close_all() + + with self._create_progress(description) as progress: + task_id = progress.add_task(description, total=total) + + with ProcessPoolExecutor(max_workers=self.process_count) as executor: + # Submit all tasks and map futures back to items + future_to_item = {executor.submit(fn, item): item for item in items} + + # Yield results as they complete + for future in as_completed(future_to_item): + item = future_to_item[future] + try: + result = future.result() + yield ProcessResult(item=item, result=result, error=None) + except Exception as e: + yield ProcessResult(item=item, result=None, error=e) + finally: + progress.advance(task_id) diff --git a/src/documents/management/commands/convert_mariadb_uuid.py b/src/documents/management/commands/convert_mariadb_uuid.py index 76ccf9e762..3533d03f3e 100644 --- a/src/documents/management/commands/convert_mariadb_uuid.py +++ b/src/documents/management/commands/convert_mariadb_uuid.py @@ -9,7 +9,7 @@ class Command(BaseCommand): # This code is taken almost entirely from https://github.com/wagtail/wagtail/pull/11912 with all credit to the original author. help = "Converts UUID columns from char type to the native UUID type used in MariaDB 10.7+ and Django 5.0+." - def convert_field(self, model, field_name, *, null=False): + def convert_field(self, model, field_name, *, null=False) -> None: if model._meta.get_field(field_name).model != model: # pragma: no cover # Field is inherited from a parent model return diff --git a/src/documents/management/commands/decrypt_documents.py b/src/documents/management/commands/decrypt_documents.py deleted file mode 100644 index 793cac4bb2..0000000000 --- a/src/documents/management/commands/decrypt_documents.py +++ /dev/null @@ -1,93 +0,0 @@ -from pathlib import Path - -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 - - -class Command(BaseCommand): - help = ( - "This is how you migrate your stored documents from an encrypted " - "state to an unencrypted one (or vice-versa)" - ) - - def add_arguments(self, parser) -> None: - parser.add_argument( - "--passphrase", - help=( - "If PAPERLESS_PASSPHRASE isn't set already, you need to specify it here" - ), - ) - - def handle(self, *args, **options) -> None: - try: - self.stdout.write( - self.style.WARNING( - "\n\n" - "WARNING: This script is going to work directly on your " - "document originals, so\n" - "WARNING: you probably shouldn't run " - "this unless you've got a recent backup\n" - "WARNING: handy. It " - "*should* work without a hitch, but be safe and backup your\n" - "WARNING: stuff first.\n\n" - "Hit Ctrl+C to exit now, or Enter to " - "continue.\n\n", - ), - ) - _ = input() - except KeyboardInterrupt: - return - - passphrase = options["passphrase"] or settings.PASSPHRASE - if not passphrase: - raise CommandError( - "Passphrase not defined. Please set it with --passphrase or " - "by declaring it in your environment or your config.", - ) - - self.__gpg_to_unencrypted(passphrase) - - def __gpg_to_unencrypted(self, passphrase: str) -> None: - encrypted_files = Document.objects.filter( - storage_type=Document.STORAGE_TYPE_GPG, - ) - - for document in encrypted_files: - self.stdout.write(f"Decrypting {document}") - - old_paths = [document.source_path, document.thumbnail_path] - - with document.source_file as file_handle: - raw_document = GnuPG.decrypted(file_handle, passphrase) - with document.thumbnail_file as file_handle: - raw_thumb = GnuPG.decrypted(file_handle, passphrase) - - document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED - - ext: str = Path(document.filename).suffix - - if not ext == ".gpg": - raise CommandError( - f"Abort: encrypted file {document.source_path} does not " - f"end with .gpg", - ) - - document.filename = Path(document.filename).stem - - with document.source_path.open("wb") as f: - f.write(raw_document) - - with document.thumbnail_path.open("wb") as f: - f.write(raw_thumb) - - Document.objects.filter(id=document.id).update( - storage_type=document.storage_type, - filename=document.filename, - ) - - for path in old_paths: - path.unlink() diff --git a/src/documents/management/commands/document_archiver.py b/src/documents/management/commands/document_archiver.py index 1aa52117a3..bd34843211 100644 --- a/src/documents/management/commands/document_archiver.py +++ b/src/documents/management/commands/document_archiver.py @@ -1,20 +1,15 @@ import logging -import multiprocessing -import tqdm -from django import db from django.conf import settings -from django.core.management.base import BaseCommand -from documents.management.commands.mixins import MultiProcessMixin -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand from documents.models import Document from documents.tasks import update_document_content_maybe_archive_file logger = logging.getLogger("paperless.management.archiver") -class Command(MultiProcessMixin, ProgressBarMixin, BaseCommand): +class Command(PaperlessCommand): help = ( "Using the current classification model, assigns correspondents, tags " "and document types to all documents, effectively allowing you to " @@ -22,7 +17,11 @@ class Command(MultiProcessMixin, ProgressBarMixin, BaseCommand): "modified) after their initial import." ) + supports_progress_bar = True + supports_multiprocessing = True + def add_arguments(self, parser): + super().add_arguments(parser) parser.add_argument( "-f", "--overwrite", @@ -44,13 +43,8 @@ def add_arguments(self, parser): "run on this specific document." ), ) - self.add_argument_progress_bar_mixin(parser) - self.add_argument_processes_mixin(parser) def handle(self, *args, **options): - self.handle_processes_mixin(**options) - self.handle_progress_bar_mixin(**options) - settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) overwrite = options["overwrite"] @@ -60,35 +54,21 @@ def handle(self, *args, **options): else: documents = Document.objects.all() - document_ids = list( - map( - lambda doc: doc.id, - filter(lambda d: overwrite or not d.has_archive_version, documents), - ), - ) - - # Note to future self: this prevents django from reusing database - # connections between processes, which is bad and does not work - # with postgres. - db.connections.close_all() + document_ids = [ + doc.id for doc in documents if overwrite or not doc.has_archive_version + ] try: logging.getLogger().handlers[0].level = logging.ERROR - if self.process_count == 1: - for doc_id in document_ids: - update_document_content_maybe_archive_file(doc_id) - else: # pragma: no cover - with multiprocessing.Pool(self.process_count) as pool: - list( - tqdm.tqdm( - pool.imap_unordered( - update_document_content_maybe_archive_file, - document_ids, - ), - total=len(document_ids), - disable=self.no_progress_bar, - ), + for result in self.process_parallel( + update_document_content_maybe_archive_file, + document_ids, + description="Archiving...", + ): + if result.error: + self.console.print( + f"[red]Failed document {result.item}: {result.error}[/red]", ) - except KeyboardInterrupt: - self.stdout.write(self.style.NOTICE("Aborting...")) + except KeyboardInterrupt: # pragma: no cover + self.console.print("[yellow]Aborting...[/yellow]") diff --git a/src/documents/management/commands/document_consumer.py b/src/documents/management/commands/document_consumer.py index 97027e02db..5ba8d30cdf 100644 --- a/src/documents/management/commands/document_consumer.py +++ b/src/documents/management/commands/document_consumer.py @@ -1,135 +1,343 @@ +""" +Document consumer management command. + +Watches a consumption directory for new documents and queues them for processing. +Uses watchfiles for efficient file system monitoring with support for both +native OS notifications and polling fallback. +""" + +from __future__ import annotations + import logging -import os -from concurrent.futures import ThreadPoolExecutor -from fnmatch import filter +from dataclasses import dataclass from pathlib import Path -from pathlib import PurePath from threading import Event from time import monotonic -from time import sleep +from typing import TYPE_CHECKING from typing import Final from django import db 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 watchfiles import Change +from watchfiles import DefaultFilter +from watchfiles import watch 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.parsers import get_supported_file_extensions from documents.tasks import consume_file -try: - from inotifyrecursive import INotify - from inotifyrecursive import flags -except ImportError: # pragma: no cover - INotify = flags = None +if TYPE_CHECKING: + from collections.abc import Iterator + logger = logging.getLogger("paperless.management.consumer") -def _tags_from_path(filepath: Path) -> list[int]: +@dataclass +class TrackedFile: + """Represents a file being tracked for stability.""" + + path: Path + last_event_time: float + last_mtime: float | None = None + last_size: int | None = None + + def update_stats(self) -> bool: + """ + Update file stats. Returns True if file exists and stats were updated. + """ + try: + stat = self.path.stat() + self.last_mtime = stat.st_mtime + self.last_size = stat.st_size + return True + except OSError: + return False + + def is_unchanged(self) -> bool: + """ + Check if file stats match the previously recorded values. + Returns False if file doesn't exist or stats changed. + """ + try: + stat = self.path.stat() + return stat.st_mtime == self.last_mtime and stat.st_size == self.last_size + except OSError: + return False + + +class FileStabilityTracker: + """ + Tracks file events and determines when files are stable for consumption. + + A file is considered stable when: + 1. No new events have been received for it within the stability delay + 2. Its size and modification time haven't changed + 3. It still exists as a regular file + + This handles various edge cases: + - Network copies that write in chunks + - Scanners that open/close files multiple times + - Temporary files that get renamed + - Files that are deleted before becoming stable """ - Walk up the directory tree from filepath to CONSUMPTION_DIR - and get or create Tag IDs for every directory. - Returns set of Tag models + def __init__(self, stability_delay: float = 1.0) -> None: + """ + Initialize the tracker. + + Args: + stability_delay: Time in seconds a file must remain unchanged + before being considered stable. + """ + self.stability_delay = stability_delay + self._tracked: dict[Path, TrackedFile] = {} + + def track(self, path: Path, change: Change) -> None: + """ + Register a file event. + + Args: + path: The file path that changed. + change: The type of change (added, modified, deleted). + """ + path = path.resolve() + + match change: + case Change.deleted: + self._tracked.pop(path, None) + logger.debug(f"Stopped tracking deleted file: {path}") + case Change.added | Change.modified: + current_time = monotonic() + if path in self._tracked: + tracked = self._tracked[path] + tracked.last_event_time = current_time + tracked.update_stats() + logger.debug(f"Updated tracking for: {path}") + else: + tracked = TrackedFile(path=path, last_event_time=current_time) + if tracked.update_stats(): + self._tracked[path] = tracked + logger.debug(f"Started tracking: {path}") + else: + logger.debug(f"Could not stat file, not tracking: {path}") + + def get_stable_files(self) -> Iterator[Path]: + """ + Yield files that have been stable for the configured delay. + + Files are removed from tracking once yielded or determined to be invalid. + """ + current_time = monotonic() + to_remove: list[Path] = [] + to_yield: list[Path] = [] + + for path, tracked in self._tracked.items(): + time_since_event = current_time - tracked.last_event_time + + if time_since_event < self.stability_delay: + continue + + # File has waited long enough, verify it's unchanged + if not tracked.is_unchanged(): + # Stats changed or file gone - update and wait again + if tracked.update_stats(): + tracked.last_event_time = current_time + logger.debug(f"File changed during stability check: {path}") + else: + # File no longer exists, remove from tracking + to_remove.append(path) + logger.debug(f"File disappeared during stability check: {path}") + continue + + # File is stable, we can return it + to_yield.append(path) + logger.info(f"File is stable: {path}") + + # Remove files that are no longer valid + for path in to_remove: + self._tracked.pop(path, None) + + # Remove and yield stable files + for path in to_yield: + self._tracked.pop(path, None) + yield path + + def has_pending_files(self) -> bool: + """Check if there are files waiting for stability check.""" + return len(self._tracked) > 0 + + @property + def pending_count(self) -> int: + """Number of files being tracked.""" + return len(self._tracked) + + +class ConsumerFilter(DefaultFilter): """ - db.close_old_connections() - tag_ids = set() - path_parts = filepath.relative_to(settings.CONSUMPTION_DIR).parent.parts - for part in path_parts: - tag_ids.add( - Tag.objects.get_or_create(name__iexact=part, defaults={"name": part})[0].pk, + Filter for watchfiles that accepts only supported document types + and ignores system files/directories. + + Extends DefaultFilter leveraging its built-in filtering: + - `ignore_dirs`: Directory names to ignore (and all their contents) + - `ignore_entity_patterns`: Regex patterns matched against filename/dirname only + + We add custom logic for file extension filtering (only accept supported + document types), which the library doesn't provide. + """ + + # Regex patterns for files to always ignore (matched against filename only) + # These are passed to DefaultFilter.ignore_entity_patterns + DEFAULT_IGNORE_PATTERNS: Final[tuple[str, ...]] = ( + r"^\.DS_Store$", + r"^\.DS_STORE$", + r"^\._.*", + r"^desktop\.ini$", + r"^Thumbs\.db$", + ) + + # Directories to always ignore (passed to DefaultFilter.ignore_dirs) + # These are matched by directory name, not full path + DEFAULT_IGNORE_DIRS: Final[tuple[str, ...]] = ( + ".stfolder", # Syncthing + ".stversions", # Syncthing + ".localized", # macOS + "@eaDir", # Synology NAS + ".Spotlight-V100", # macOS + ".Trashes", # macOS + "__MACOSX", # macOS archive artifacts + ) + + def __init__( + self, + *, + supported_extensions: frozenset[str] | None = None, + ignore_patterns: list[str] | None = None, + ignore_dirs: list[str] | None = None, + ) -> None: + """ + Initialize the consumer filter. + + Args: + supported_extensions: Set of file extensions to accept (e.g., {".pdf", ".png"}). + If None, uses get_supported_file_extensions(). + ignore_patterns: Additional regex patterns to ignore (matched against filename). + ignore_dirs: Additional directory names to ignore (merged with defaults). + """ + # Get supported extensions + if supported_extensions is None: + supported_extensions = frozenset(get_supported_file_extensions()) + self._supported_extensions = supported_extensions + + # Combine default and user patterns + all_patterns: list[str] = list(self.DEFAULT_IGNORE_PATTERNS) + if ignore_patterns: + all_patterns.extend(ignore_patterns) + + # Combine default and user ignore_dirs + all_ignore_dirs: list[str] = list(self.DEFAULT_IGNORE_DIRS) + if ignore_dirs: + all_ignore_dirs.extend(ignore_dirs) + + # Let DefaultFilter handle all the pattern and directory filtering + super().__init__( + ignore_dirs=tuple(all_ignore_dirs), + ignore_entity_patterns=tuple(all_patterns), + ignore_paths=(), ) - return list(tag_ids) + def __call__(self, change: Change, path: str) -> bool: + """ + Filter function for watchfiles. + Returns True if the path should be watched, False to ignore. -def _is_ignored(filepath: Path) -> bool: - """ - Checks if the given file should be ignored, based on configured - patterns. + The parent DefaultFilter handles: + - Hidden files/directories (starting with .) + - Directories in ignore_dirs + - Files/directories matching ignore_entity_patterns - Returns True if the file is ignored, False otherwise - """ - # Trim out the consume directory, leaving only filename and it's - # path relative to the consume directory - filepath_relative = PurePath(filepath).relative_to(settings.CONSUMPTION_DIR) - - # March through the components of the path, including directories and the filename - # looking for anything matching - # foo/bar/baz/file.pdf -> (foo, bar, baz, file.pdf) - parts = [] - for part in filepath_relative.parts: - # If the part is not the name (ie, it's a dir) - # Need to append the trailing slash or fnmatch doesn't match - # fnmatch("dir", "dir/*") == False - # fnmatch("dir/", "dir/*") == True - if part != filepath_relative.name: - part = part + "/" - parts.append(part) - - for pattern in settings.CONSUMER_IGNORE_PATTERNS: - if len(filter(parts, pattern)): + We additionally filter files by extension. + """ + # Let parent filter handle directory ignoring and pattern matching + if not super().__call__(change, path): + return False + + path_obj = Path(path) + + # For directories, parent filter already handled everything + if path_obj.is_dir(): return True - return False + # For files, check extension + return self._has_supported_extension(path_obj) + def _has_supported_extension(self, path: Path) -> bool: + """Check if the file has a supported extension.""" + suffix = path.suffix.lower() + return suffix in self._supported_extensions -def _consume(filepath: Path) -> None: - # Check permissions early - try: - filepath.stat() - except (PermissionError, OSError): - logger.warning(f"Not consuming file {filepath}: Permission denied.") - return - if filepath.is_dir() or _is_ignored(filepath): - return +def _tags_from_path(filepath: Path, consumption_dir: Path) -> list[int]: + """ + Walk up the directory tree from filepath to consumption_dir + and get or create Tag IDs for every directory. - if not filepath.is_file(): - logger.debug(f"Not consuming file {filepath}: File has moved.") - return + Returns list of Tag primary keys. + """ + db.close_old_connections() + tag_ids: set[int] = set() + path_parts = filepath.relative_to(consumption_dir).parent.parts - if not is_file_ext_supported(filepath.suffix): - logger.warning(f"Not consuming file {filepath}: Unknown file extension.") - return + for part in path_parts: + tag, _ = Tag.objects.get_or_create( + name__iexact=part, + defaults={"name": part}, + ) + tag_ids.add(tag.pk) - # Total wait time: up to 500ms - os_error_retry_count: Final[int] = 50 - os_error_retry_wait: Final[float] = 0.01 + return list(tag_ids) - read_try_count = 0 - file_open_ok = False - os_error_str = None - while (read_try_count < os_error_retry_count) and not file_open_ok: - try: - with filepath.open("rb"): - file_open_ok = True - except OSError as e: - read_try_count += 1 - os_error_str = str(e) - sleep(os_error_retry_wait) - - if read_try_count >= os_error_retry_count: - logger.warning(f"Not consuming file {filepath}: OS reports {os_error_str}") - return +def _consume_file( + filepath: Path, + consumption_dir: Path, + *, + subdirs_as_tags: bool, +) -> None: + """ + Queue a file for consumption. - tag_ids = None + Args: + filepath: Path to the file to consume. + consumption_dir: Base consumption directory. + subdirs_as_tags: Whether to create tags from subdirectory names. + """ + # Verify file still exists and is accessible try: - if settings.CONSUMER_SUBDIRS_AS_TAGS: - tag_ids = _tags_from_path(filepath) - except Exception: - logger.exception("Error creating tags from path") + if not filepath.is_file(): + logger.debug(f"Not consuming {filepath}: not a file or doesn't exist") + return + except OSError as e: + logger.warning(f"Not consuming {filepath}: {e}") + return + + # Get tags from path if configured + tag_ids: list[int] | None = None + if subdirs_as_tags: + try: + tag_ids = _tags_from_path(filepath, consumption_dir) + except Exception: + logger.exception(f"Error creating tags from path for {filepath}") + # Queue for consumption try: - logger.info(f"Adding {filepath} to the task queue.") + logger.info(f"Adding {filepath} to the task queue") consume_file.delay( ConsumableDocument( source=DocumentSource.ConsumeFolder, @@ -138,228 +346,228 @@ def _consume(filepath: Path) -> None: DocumentMetadataOverrides(tag_ids=tag_ids), ) except Exception: - # Catch all so that the consumer won't crash. - # This is also what the test case is listening for to check for - # errors. - logger.exception("Error while consuming document") + logger.exception(f"Error while queuing document {filepath}") -def _consume_wait_unmodified(file: Path) -> None: - """ - Waits for the given file to appear unmodified based on file size - and modification time. Will wait a configured number of seconds - and retry a configured number of times before either consuming or - giving up +class Command(BaseCommand): """ - if _is_ignored(file): - return - - logger.debug(f"Waiting for file {file} to remain unmodified") - mtime = -1 - size = -1 - current_try = 0 - while current_try < settings.CONSUMER_POLLING_RETRY_COUNT: - try: - stat_data = file.stat() - new_mtime = stat_data.st_mtime - new_size = stat_data.st_size - except FileNotFoundError: - logger.debug( - f"File {file} moved while waiting for it to remain unmodified.", - ) - return - if new_mtime == mtime and new_size == size: - _consume(file) - return - mtime = new_mtime - size = new_size - sleep(settings.CONSUMER_POLLING_DELAY) - current_try += 1 - - logger.error(f"Timeout while waiting on file {file} to remain unmodified.") - - -class Handler(FileSystemEventHandler): - def __init__(self, pool: ThreadPoolExecutor) -> None: - super().__init__() - self._pool = pool + Watch a consumption directory and queue new documents for processing. - def on_created(self, event): - self._pool.submit(_consume_wait_unmodified, Path(event.src_path)) - - def on_moved(self, event): - self._pool.submit(_consume_wait_unmodified, Path(event.dest_path)) + Uses watchfiles for efficient file system monitoring. Supports both + native OS notifications (inotify on Linux, FSEvents on macOS) and + polling for network filesystems. + """ + help = "Watch the consumption directory for new documents" -class Command(BaseCommand): - """ - On every iteration of an infinite loop, consume what we can from the - consumption directory. - """ + # For testing - allows tests to stop the consumer + stop_flag: Event = Event() - # This is here primarily for the tests and is irrelevant in production. - stop_flag = Event() - # Also only for testing, configures in one place the timeout used before checking - # the stop flag + # Testing timeout in seconds testing_timeout_s: Final[float] = 0.5 - testing_timeout_ms: Final[float] = testing_timeout_s * 1000.0 - def add_arguments(self, parser): + def add_arguments(self, parser) -> None: parser.add_argument( "directory", - default=settings.CONSUMPTION_DIR, + default=None, nargs="?", - help="The consumption directory.", + help="The consumption directory (defaults to CONSUMPTION_DIR setting)", + ) + parser.add_argument( + "--oneshot", + action="store_true", + help="Process existing files and exit without watching", ) - parser.add_argument("--oneshot", action="store_true", help="Run only once.") - - # Only use during unit testing, will configure a timeout - # Leaving it unset or false and the consumer will exit when it - # receives SIGINT parser.add_argument( "--testing", action="store_true", - help="Flag used only for unit testing", + help="Enable testing mode with shorter timeouts", default=False, ) - def handle(self, *args, **options): - directory = options["directory"] - recursive = settings.CONSUMER_RECURSIVE - + def handle(self, *args, **options) -> None: + # Resolve consumption directory + directory = options.get("directory") + if not directory: + directory = getattr(settings, "CONSUMPTION_DIR", None) if not directory: - raise CommandError("CONSUMPTION_DIR does not appear to be set.") + raise CommandError("CONSUMPTION_DIR is not configured") directory = Path(directory).resolve() + if not directory.exists(): + raise CommandError(f"Consumption directory does not exist: {directory}") + if not directory.is_dir(): - raise CommandError(f"Consumption directory {directory} does not exist") + raise CommandError(f"Consumption path is not a directory: {directory}") - # Consumer will need this + # Ensure scratch directory exists settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) - if recursive: - for dirpath, _, filenames in os.walk(directory): - for filename in filenames: - filepath = Path(dirpath) / filename - _consume(filepath) - else: - for filepath in directory.iterdir(): - _consume(filepath) + # Get settings + recursive: bool = settings.CONSUMER_RECURSIVE + subdirs_as_tags: bool = settings.CONSUMER_SUBDIRS_AS_TAGS + polling_interval: float = settings.CONSUMER_POLLING_INTERVAL + stability_delay: float = settings.CONSUMER_STABILITY_DELAY + ignore_patterns: list[str] = settings.CONSUMER_IGNORE_PATTERNS + ignore_dirs: list[str] = settings.CONSUMER_IGNORE_DIRS + is_testing: bool = options.get("testing", False) + is_oneshot: bool = options.get("oneshot", False) + + # Create filter + consumer_filter = ConsumerFilter( + ignore_patterns=ignore_patterns, + ignore_dirs=ignore_dirs, + ) - if options["oneshot"]: + # Process existing files + self._process_existing_files( + directory=directory, + recursive=recursive, + subdirs_as_tags=subdirs_as_tags, + consumer_filter=consumer_filter, + ) + + if is_oneshot: + logger.info("Oneshot mode: processed existing files, exiting") return - if settings.CONSUMER_POLLING == 0 and INotify: - self.handle_inotify(directory, recursive, is_testing=options["testing"]) + # Start watching + self._watch_directory( + directory=directory, + recursive=recursive, + subdirs_as_tags=subdirs_as_tags, + consumer_filter=consumer_filter, + polling_interval=polling_interval, + stability_delay=stability_delay, + is_testing=is_testing, + ) + + logger.debug("Consumer exiting") + + def _process_existing_files( + self, + *, + directory: Path, + recursive: bool, + subdirs_as_tags: bool, + consumer_filter: ConsumerFilter, + ) -> None: + """Process any existing files in the consumption directory.""" + logger.info(f"Processing existing files in {directory}") + + glob_pattern = "**/*" if recursive else "*" + + for filepath in directory.glob(glob_pattern): + # Use filter to check if file should be processed + if not filepath.is_file(): + continue + + if not consumer_filter(Change.added, str(filepath)): + continue + + _consume_file( + filepath=filepath, + consumption_dir=directory, + subdirs_as_tags=subdirs_as_tags, + ) + + def _watch_directory( + self, + *, + directory: Path, + recursive: bool, + subdirs_as_tags: bool, + consumer_filter: ConsumerFilter, + polling_interval: float, + stability_delay: float, + is_testing: bool, + ) -> None: + """Watch directory for changes and process stable files.""" + use_polling = polling_interval > 0 + poll_delay_ms = int(polling_interval * 1000) if use_polling else 0 + + if use_polling: + logger.info( + f"Watching {directory} using polling (interval: {polling_interval}s)", + ) else: - if INotify is None and settings.CONSUMER_POLLING == 0: # pragma: no cover - logger.warning("Using polling as INotify import failed") - self.handle_polling(directory, recursive, is_testing=options["testing"]) + logger.info(f"Watching {directory} using native file system events") - logger.debug("Consumer exiting.") + # Create stability tracker + tracker = FileStabilityTracker(stability_delay=stability_delay) - def handle_polling(self, directory, recursive, *, is_testing: bool): - logger.info(f"Polling directory for changes: {directory}") + # Calculate timeouts + stability_timeout_ms = int(stability_delay * 1000) + testing_timeout_ms = int(self.testing_timeout_s * 1000) - timeout = None - if is_testing: - timeout = self.testing_timeout_s - logger.debug(f"Configuring timeout to {timeout}s") - - polling_interval = settings.CONSUMER_POLLING - if polling_interval == 0: # pragma: no cover - # Only happens if INotify failed to import - logger.warning("Using polling of 10s, consider setting this") - polling_interval = 10 - - with ThreadPoolExecutor(max_workers=4) as pool: - observer = PollingObserver(timeout=polling_interval) - observer.schedule(Handler(pool), directory, recursive=recursive) - observer.start() - try: - while observer.is_alive(): - observer.join(timeout) - if self.stop_flag.is_set(): - observer.stop() - except KeyboardInterrupt: - observer.stop() - observer.join() - - def handle_inotify(self, directory, recursive, *, is_testing: bool): - logger.info(f"Using inotify to watch directory for changes: {directory}") - - timeout_ms = None + # Calculate appropriate timeout for watch loop + # In polling mode, rust_timeout must be significantly longer than poll_delay_ms + # to ensure poll cycles can complete before timing out if is_testing: - timeout_ms = self.testing_timeout_ms - logger.debug(f"Configuring timeout to {timeout_ms}ms") - - inotify = INotify() - inotify_flags = flags.CLOSE_WRITE | flags.MOVED_TO | flags.MODIFY - if recursive: - inotify.add_watch_recursive(directory, inotify_flags) + if use_polling: + # For polling: timeout must be at least 3x the poll interval to allow + # multiple poll cycles. This prevents timeouts from interfering with + # the polling mechanism. + min_polling_timeout_ms = poll_delay_ms * 3 + timeout_ms = max(min_polling_timeout_ms, testing_timeout_ms) + else: + # For native watching, use short timeout to check stop flag + timeout_ms = testing_timeout_ms else: - inotify.add_watch(directory, inotify_flags) - - inotify_debounce_secs: Final[float] = settings.CONSUMER_INOTIFY_DELAY - inotify_debounce_ms: Final[int] = inotify_debounce_secs * 1000 + # Not testing, wait indefinitely for first event + timeout_ms = 0 - finished = False + self.stop_flag.clear() - notified_files = {} - - try: - while not finished: - try: - for event in inotify.read(timeout=timeout_ms): - path = inotify.get_path(event.wd) if recursive else directory - filepath = Path(path) / event.name - if flags.MODIFY in flags.from_mask(event.mask): - notified_files.pop(filepath, None) - else: - notified_files[filepath] = monotonic() - - # Check the files against the timeout - still_waiting = {} - # last_event_time is time of the last inotify event for this file - for filepath, last_event_time in notified_files.items(): - # Current time - last time over the configured timeout - waited_long_enough = ( - monotonic() - last_event_time - ) > inotify_debounce_secs - - # Also make sure the file exists still, some scanners might write a - # temporary file first - try: - file_still_exists = filepath.exists() and filepath.is_file() - except (PermissionError, OSError): # pragma: no cover - # If we can't check, let it fail in the _consume function - file_still_exists = True + while not self.stop_flag.is_set(): + try: + for changes in watch( + directory, + watch_filter=consumer_filter, + rust_timeout=timeout_ms, + yield_on_timeout=True, + force_polling=use_polling, + poll_delay_ms=poll_delay_ms, + recursive=recursive, + stop_event=self.stop_flag, + ): + # Process each change + for change_type, path in changes: + path = Path(path).resolve() + if not path.is_file(): continue - - if waited_long_enough and file_still_exists: - _consume(filepath) - elif file_still_exists: - still_waiting[filepath] = last_event_time - - # These files are still waiting to hit the timeout - notified_files = still_waiting - - # If files are waiting, need to exit read() to check them - # Otherwise, go back to infinite sleep time, but only if not testing - if len(notified_files) > 0: - timeout_ms = inotify_debounce_ms - elif is_testing: - timeout_ms = self.testing_timeout_ms + logger.debug(f"Event: {change_type.name} for {path}") + tracker.track(path, change_type) + + # Check for stable files + for stable_path in tracker.get_stable_files(): + _consume_file( + filepath=stable_path, + consumption_dir=directory, + subdirs_as_tags=subdirs_as_tags, + ) + + # Exit watch loop to reconfigure timeout + break + + # Determine next timeout + if tracker.has_pending_files(): + # Check pending files at stability interval + timeout_ms = stability_timeout_ms + elif is_testing: + # In testing, use appropriate timeout based on watch mode + if use_polling: + # For polling: ensure timeout allows polls to complete + min_polling_timeout_ms = poll_delay_ms * 3 + timeout_ms = max(min_polling_timeout_ms, testing_timeout_ms) else: - timeout_ms = None - - if self.stop_flag.is_set(): - logger.debug("Finishing because event is set") - finished = True - - except KeyboardInterrupt: - logger.info("Received SIGINT, stopping inotify") - finished = True - finally: - inotify.close() + # For native watching, use short timeout to check stop flag + timeout_ms = testing_timeout_ms + else: # pragma: nocover + # No pending files, wait indefinitely + timeout_ms = 0 + + except KeyboardInterrupt: # pragma: nocover + logger.info("Received interrupt, stopping consumer") + self.stop_flag.set() diff --git a/src/documents/management/commands/document_create_classifier.py b/src/documents/management/commands/document_create_classifier.py index f7903aac77..b662195a71 100644 --- a/src/documents/management/commands/document_create_classifier.py +++ b/src/documents/management/commands/document_create_classifier.py @@ -1,13 +1,32 @@ -from django.core.management.base import BaseCommand +from __future__ import annotations +import time + +from documents.management.commands.base import PaperlessCommand from documents.tasks import train_classifier -class Command(BaseCommand): +class Command(PaperlessCommand): help = ( "Trains the classifier on your data and saves the resulting models to a " "file. The document consumer will then automatically use this new model." ) + supports_progress_bar = False + supports_multiprocessing = False + + def handle(self, *args, **options) -> None: + start = time.monotonic() + + with ( + self.buffered_logging("paperless.tasks"), + self.buffered_logging("paperless.classifier"), + ): + train_classifier( + scheduled=False, + status_callback=lambda msg: self.console.print(f" {msg}"), + ) - def handle(self, *args, **options): - train_classifier(scheduled=False) + elapsed = time.monotonic() - start + self.console.print( + f"[green]✓[/green] Classifier training complete ({elapsed:.1f}s)", + ) diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index 88daeddf59..b8ccca0aba 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -3,11 +3,10 @@ import os import shutil import tempfile -import time +from itertools import islice from pathlib import Path from typing import TYPE_CHECKING -import tqdm from allauth.mfa.models import Authenticator from allauth.socialaccount.models import SocialAccount from allauth.socialaccount.models import SocialApp @@ -18,8 +17,8 @@ from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core import serializers -from django.core.management.base import BaseCommand from django.core.management.base import CommandError +from django.core.serializers.json import DjangoJSONEncoder from django.db import transaction from django.utils import timezone from filelock import FileLock @@ -27,6 +26,8 @@ from guardian.models import UserObjectPermission if TYPE_CHECKING: + from collections.abc import Generator + from django.db.models import QuerySet if settings.AUDIT_LOG_ENABLED: @@ -34,6 +35,7 @@ from documents.file_handling import delete_empty_directories from documents.file_handling import generate_filename +from documents.management.commands.base import PaperlessCommand from documents.management.commands.mixins import CryptMixin from documents.models import Correspondent from documents.models import CustomField @@ -56,20 +58,120 @@ from documents.settings import EXPORTER_THUMBNAIL_NAME from documents.utils import copy_file_with_basic_stats from paperless import version -from paperless.db import GnuPG from paperless.models import ApplicationConfiguration from paperless_mail.models import MailAccount from paperless_mail.models import MailRule -class Command(CryptMixin, BaseCommand): +def serialize_queryset_batched( + queryset: "QuerySet", + *, + batch_size: int = 500, +) -> "Generator[list[dict], None, None]": + """Yield batches of serialized records from a QuerySet. + + Each batch is a list of dicts in Django's Python serialization format. + Uses QuerySet.iterator() to avoid loading the full queryset into memory, + and islice to collect chunk-sized batches serialized in a single call. + """ + iterator = queryset.iterator(chunk_size=batch_size) + while chunk := list(islice(iterator, batch_size)): + yield serializers.serialize("python", chunk) + + +class StreamingManifestWriter: + """Incrementally writes a JSON array to a file, one record at a time. + + Writes to .tmp first; on close(), optionally BLAKE2b-compares + with the existing file (--compare-json) and renames or discards accordingly. + On exception, discard() deletes the tmp file and leaves the original intact. + """ + + def __init__( + self, + path: Path, + *, + compare_json: bool = False, + files_in_export_dir: "set[Path] | None" = None, + ) -> None: + self._path = path.resolve() + self._tmp_path = self._path.with_suffix(self._path.suffix + ".tmp") + self._compare_json = compare_json + self._files_in_export_dir: set[Path] = ( + files_in_export_dir if files_in_export_dir is not None else set() + ) + self._file = None + self._first = True + + def open(self) -> None: + self._path.parent.mkdir(parents=True, exist_ok=True) + self._file = self._tmp_path.open("w", encoding="utf-8") + self._file.write("[") + self._first = True + + def write_record(self, record: dict) -> None: + if not self._first: + self._file.write(",\n") + else: + self._first = False + self._file.write( + json.dumps(record, cls=DjangoJSONEncoder, indent=2, ensure_ascii=False), + ) + + def write_batch(self, records: list[dict]) -> None: + for record in records: + self.write_record(record) + + def close(self) -> None: + if self._file is None: + return + self._file.write("\n]") + self._file.close() + self._file = None + self._finalize() + + def discard(self) -> None: + if self._file is not None: + self._file.close() + self._file = None + if self._tmp_path.exists(): + self._tmp_path.unlink() + + def _finalize(self) -> None: + """Compare with existing file (if --compare-json) then rename or discard tmp.""" + if self._path in self._files_in_export_dir: + self._files_in_export_dir.remove(self._path) + if self._compare_json: + existing_hash = hashlib.blake2b(self._path.read_bytes()).hexdigest() + new_hash = hashlib.blake2b(self._tmp_path.read_bytes()).hexdigest() + if existing_hash == new_hash: + self._tmp_path.unlink() + return + self._tmp_path.rename(self._path) + + def __enter__(self) -> "StreamingManifestWriter": + self.open() + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + if exc_type is not None: + self.discard() + else: + self.close() + + +class Command(CryptMixin, PaperlessCommand): help = ( "Decrypt and rename all files in our collection into a given target " "directory. And include a manifest file containing document data for " "easy import." ) - def add_arguments(self, parser): + supports_progress_bar = True + supports_multiprocessing = False + + def add_arguments(self, parser) -> None: + super().add_arguments(parser) parser.add_argument("target") parser.add_argument( @@ -177,18 +279,22 @@ def add_arguments(self, parser): ) parser.add_argument( - "--no-progress-bar", - default=False, - action="store_true", - help="If set, the progress bar will not be shown", + "--passphrase", + help="If provided, is used to encrypt sensitive data in the export", ) parser.add_argument( - "--passphrase", - help="If provided, is used to encrypt sensitive data in the export", + "--batch-size", + type=int, + default=500, + help=( + "Number of records to process per batch during serialization. " + "Lower values reduce peak memory usage; higher values improve " + "throughput. Default: 500." + ), ) - def handle(self, *args, **options): + def handle(self, *args, **options) -> None: self.target = Path(options["target"]).resolve() self.split_manifest: bool = options["split_manifest"] self.compare_checksums: bool = options["compare_checksums"] @@ -200,8 +306,8 @@ def handle(self, *args, **options): self.no_thumbnail: bool = options["no_thumbnail"] self.zip_export: bool = options["zip"] self.data_only: bool = options["data_only"] - self.no_progress_bar: bool = options["no_progress_bar"] self.passphrase: str | None = options.get("passphrase") + self.batch_size: int = options["batch_size"] self.files_in_export_dir: set[Path] = set() self.exported_files: set[str] = set() @@ -246,7 +352,7 @@ def handle(self, *args, **options): if self.zip_export and temp_dir is not None: temp_dir.cleanup() - def dump(self): + def dump(self) -> None: # 1. Take a snapshot of what files exist in the current export folder for x in self.target.glob("**/*"): if x.is_file(): @@ -291,93 +397,85 @@ def dump(self): if settings.AUDIT_LOG_ENABLED: manifest_key_to_object_query["log_entries"] = LogEntry.objects.all() - with transaction.atomic(): - manifest_dict = {} + # Crypto setup before streaming begins + if self.passphrase: + self.setup_crypto(passphrase=self.passphrase) + elif MailAccount.objects.count() > 0 or SocialToken.objects.count() > 0: + self.stdout.write( + self.style.NOTICE( + "No passphrase was given, sensitive fields will be in plaintext", + ), + ) - # Build an overall manifest - for key, object_query in manifest_key_to_object_query.items(): - manifest_dict[key] = json.loads( - serializers.serialize("json", object_query), - ) + document_manifest: list[dict] = [] + manifest_path = (self.target / "manifest.json").resolve() - self.encrypt_secret_fields(manifest_dict) + with StreamingManifestWriter( + manifest_path, + compare_json=self.compare_json, + files_in_export_dir=self.files_in_export_dir, + ) as writer: + with transaction.atomic(): + for key, qs in manifest_key_to_object_query.items(): + if key == "documents": + # Accumulate for file-copy loop; written to manifest after + for batch in serialize_queryset_batched( + qs, + batch_size=self.batch_size, + ): + for record in batch: + self._encrypt_record_inline(record) + document_manifest.extend(batch) + elif self.split_manifest and key in ( + "notes", + "custom_field_instances", + ): + # Written per-document in _write_split_manifest + pass + else: + for batch in serialize_queryset_batched( + qs, + batch_size=self.batch_size, + ): + for record in batch: + self._encrypt_record_inline(record) + writer.write_batch(batch) - # These are treated specially and included in the per-document manifest - # if that setting is enabled. Otherwise, they are just exported to the bulk - # manifest document_map: dict[int, Document] = { - d.pk: d for d in manifest_key_to_object_query["documents"] + d.pk: d for d in Document.objects.order_by("id") } - document_manifest = manifest_dict["documents"] - - # 3. Export files from each document - for index, document_dict in tqdm.tqdm( - enumerate(document_manifest), - total=len(document_manifest), - disable=self.no_progress_bar, - ): - # 3.1. store files unencrypted - document_dict["fields"]["storage_type"] = Document.STORAGE_TYPE_UNENCRYPTED - document = document_map[document_dict["pk"]] - - # 3.2. generate a unique filename - base_name = self.generate_base_name(document) - - # 3.3. write filenames into manifest - original_target, thumbnail_target, archive_target = ( - self.generate_document_targets(document, base_name, document_dict) - ) + # 3. Export files from each document + for index, document_dict in enumerate( + self.track( + document_manifest, + description="Exporting documents...", + total=len(document_manifest), + ), + ): + document = document_map[document_dict["pk"]] - # 3.4. write files to target folder - if not self.data_only: - self.copy_document_files( - document, - original_target, - thumbnail_target, - archive_target, - ) + # 3.1. generate a unique filename + base_name = self.generate_base_name(document) - if self.split_manifest: - manifest_name = base_name.with_name(f"{base_name.stem}-manifest.json") - if self.use_folder_prefix: - manifest_name = Path("json") / manifest_name - manifest_name = (self.target / manifest_name).resolve() - manifest_name.parent.mkdir(parents=True, exist_ok=True) - content = [document_manifest[index]] - content += list( - filter( - lambda d: d["fields"]["document"] == document_dict["pk"], - manifest_dict["notes"], - ), - ) - content += list( - filter( - lambda d: d["fields"]["document"] == document_dict["pk"], - manifest_dict["custom_field_instances"], - ), + # 3.2. write filenames into manifest + original_target, thumbnail_target, archive_target = ( + self.generate_document_targets(document, base_name, document_dict) ) - self.check_and_write_json( - content, - manifest_name, - ) + # 3.3. write files to target folder + if not self.data_only: + self.copy_document_files( + document, + original_target, + thumbnail_target, + archive_target, + ) - # These were exported already - if self.split_manifest: - del manifest_dict["documents"] - del manifest_dict["notes"] - del manifest_dict["custom_field_instances"] - - # 4.1 write primary manifest to target folder - manifest = [] - for key, item in manifest_dict.items(): - manifest.extend(item) - manifest_path = (self.target / "manifest.json").resolve() - self.check_and_write_json( - manifest, - manifest_path, - ) + if self.split_manifest: + self._write_split_manifest(document_dict, document, base_name) + else: + writer.write_record(document_dict) # 4.2 write version information to target folder extra_metadata_path = (self.target / "metadata.json").resolve() @@ -423,7 +521,6 @@ def generate_base_name(self, document: Document) -> Path: base_name = generate_filename( document, counter=filename_counter, - append_gpg=False, ) else: base_name = document.get_public_filename(counter=filename_counter) @@ -482,51 +579,65 @@ def copy_document_files( If the document is encrypted, the files are decrypted before copying them to the target location. """ - if document.storage_type == Document.STORAGE_TYPE_GPG: - t = int(time.mktime(document.created.timetuple())) - - original_target.parent.mkdir(parents=True, exist_ok=True) - with document.source_file as out_file: - original_target.write_bytes(GnuPG.decrypted(out_file)) - os.utime(original_target, times=(t, t)) - - if thumbnail_target: - thumbnail_target.parent.mkdir(parents=True, exist_ok=True) - with document.thumbnail_file as out_file: - thumbnail_target.write_bytes(GnuPG.decrypted(out_file)) - os.utime(thumbnail_target, times=(t, t)) - - if archive_target: - archive_target.parent.mkdir(parents=True, exist_ok=True) - if TYPE_CHECKING: - assert isinstance(document.archive_path, Path) - with document.archive_path as out_file: - archive_target.write_bytes(GnuPG.decrypted(out_file)) - os.utime(archive_target, times=(t, t)) - else: + self.check_and_copy( + document.source_path, + document.checksum, + original_target, + ) + + if thumbnail_target: + self.check_and_copy(document.thumbnail_path, None, thumbnail_target) + + if archive_target: + if TYPE_CHECKING: + assert isinstance(document.archive_path, Path) self.check_and_copy( - document.source_path, - document.checksum, - original_target, + document.archive_path, + document.archive_checksum, + archive_target, ) - if thumbnail_target: - self.check_and_copy(document.thumbnail_path, None, thumbnail_target) + def _encrypt_record_inline(self, record: dict) -> None: + """Encrypt sensitive fields in a single record, if passphrase is set.""" + if not self.passphrase: + return + fields = self.CRYPT_FIELDS_BY_MODEL.get(record.get("model", "")) + if fields: + for field in fields: + if record["fields"].get(field): + record["fields"][field] = self.encrypt_string( + value=record["fields"][field], + ) - if archive_target: - if TYPE_CHECKING: - assert isinstance(document.archive_path, Path) - self.check_and_copy( - document.archive_path, - document.archive_checksum, - archive_target, - ) + def _write_split_manifest( + self, + document_dict: dict, + document: Document, + base_name: Path, + ) -> None: + """Write per-document manifest file for --split-manifest mode.""" + content = [document_dict] + content.extend( + serializers.serialize("python", Note.objects.filter(document=document)), + ) + content.extend( + serializers.serialize( + "python", + CustomFieldInstance.objects.filter(document=document), + ), + ) + manifest_name = base_name.with_name(f"{base_name.stem}-manifest.json") + if self.use_folder_prefix: + manifest_name = Path("json") / manifest_name + manifest_name = (self.target / manifest_name).resolve() + manifest_name.parent.mkdir(parents=True, exist_ok=True) + self.check_and_write_json(content, manifest_name) def check_and_write_json( self, content: list[dict] | dict, target: Path, - ): + ) -> None: """ Writes the source content to the target json file. If --compare-json arg was used, don't write to target file if @@ -539,15 +650,25 @@ def check_and_write_json( if target in self.files_in_export_dir: self.files_in_export_dir.remove(target) if self.compare_json: - target_checksum = hashlib.md5(target.read_bytes()).hexdigest() - src_str = json.dumps(content, indent=2, ensure_ascii=False) - src_checksum = hashlib.md5(src_str.encode("utf-8")).hexdigest() + target_checksum = hashlib.blake2b(target.read_bytes()).hexdigest() + src_str = json.dumps( + content, + cls=DjangoJSONEncoder, + indent=2, + ensure_ascii=False, + ) + src_checksum = hashlib.blake2b(src_str.encode("utf-8")).hexdigest() if src_checksum == target_checksum: perform_write = False if perform_write: target.write_text( - json.dumps(content, indent=2, ensure_ascii=False), + json.dumps( + content, + cls=DjangoJSONEncoder, + indent=2, + ensure_ascii=False, + ), encoding="utf-8", ) @@ -556,7 +677,7 @@ def check_and_copy( source: Path, source_checksum: str | None, target: Path, - ): + ) -> None: """ Copies the source to the target, if target doesn't exist or the target doesn't seem to match the source attributes @@ -586,28 +707,3 @@ def check_and_copy( if perform_copy: target.parent.mkdir(parents=True, exist_ok=True) copy_file_with_basic_stats(source, target) - - def encrypt_secret_fields(self, manifest: dict) -> None: - """ - Encrypts certain fields in the export. Currently limited to the mail account password - """ - - if self.passphrase: - self.setup_crypto(passphrase=self.passphrase) - - for crypt_config in self.CRYPT_FIELDS: - exporter_key = crypt_config["exporter_key"] - crypt_fields = crypt_config["fields"] - for manifest_record in manifest[exporter_key]: - for field in crypt_fields: - if manifest_record["fields"][field]: - manifest_record["fields"][field] = self.encrypt_string( - value=manifest_record["fields"][field], - ) - - elif MailAccount.objects.count() > 0 or SocialToken.objects.count() > 0: - self.stdout.write( - self.style.NOTICE( - "No passphrase was given, sensitive fields will be in plaintext", - ), - ) diff --git a/src/documents/management/commands/document_fuzzy_match.py b/src/documents/management/commands/document_fuzzy_match.py index 4ecdf6d012..60d00f9cc3 100644 --- a/src/documents/management/commands/document_fuzzy_match.py +++ b/src/documents/management/commands/document_fuzzy_match.py @@ -1,24 +1,20 @@ import dataclasses -import multiprocessing from typing import Final import rapidfuzz -import tqdm -from django.core.management import BaseCommand from django.core.management import CommandError -from documents.management.commands.mixins import MultiProcessMixin -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand from documents.models import Document -@dataclasses.dataclass(frozen=True) +@dataclasses.dataclass(frozen=True, slots=True) class _WorkPackage: first_doc: Document second_doc: Document -@dataclasses.dataclass(frozen=True) +@dataclasses.dataclass(frozen=True, slots=True) class _WorkResult: doc_one_pk: int doc_two_pk: int @@ -31,22 +27,24 @@ def __lt__(self, other: "_WorkResult") -> bool: def _process_and_match(work: _WorkPackage) -> _WorkResult: """ Does basic processing of document content, gets the basic ratio - and returns the result package + and returns the result package. """ - # Normalize the string some, lower case, whitespace, etc first_string = rapidfuzz.utils.default_process(work.first_doc.content) second_string = rapidfuzz.utils.default_process(work.second_doc.content) - # Basic matching ratio match = rapidfuzz.fuzz.ratio(first_string, second_string) return _WorkResult(work.first_doc.pk, work.second_doc.pk, match) -class Command(MultiProcessMixin, ProgressBarMixin, BaseCommand): +class Command(PaperlessCommand): help = "Searches for documents where the content almost matches" + supports_progress_bar = True + supports_multiprocessing = True + def add_arguments(self, parser): + super().add_arguments(parser) parser.add_argument( "--ratio", default=85.0, @@ -59,16 +57,11 @@ def add_arguments(self, parser): action="store_true", help="If set, one document of matches above the ratio WILL BE DELETED", ) - self.add_argument_progress_bar_mixin(parser) - self.add_argument_processes_mixin(parser) def handle(self, *args, **options): RATIO_MIN: Final[float] = 0.0 RATIO_MAX: Final[float] = 100.0 - self.handle_processes_mixin(**options) - self.handle_progress_bar_mixin(**options) - if options["delete"]: self.stdout.write( self.style.WARNING( @@ -80,66 +73,58 @@ def handle(self, *args, **options): checked_pairs: set[tuple[int, int]] = set() work_pkgs: list[_WorkPackage] = [] - # Ratio is a float from 0.0 to 100.0 if opt_ratio < RATIO_MIN or opt_ratio > RATIO_MAX: raise CommandError("The ratio must be between 0 and 100") all_docs = Document.objects.all().order_by("id") - # Build work packages for processing for first_doc in all_docs: for second_doc in all_docs: - # doc to doc is obviously not useful if first_doc.pk == second_doc.pk: continue - # Skip empty documents (e.g. password-protected) if first_doc.content.strip() == "" or second_doc.content.strip() == "": continue - # Skip matching which have already been matched together - # doc 1 to doc 2 is the same as doc 2 to doc 1 doc_1_to_doc_2 = (first_doc.pk, second_doc.pk) doc_2_to_doc_1 = doc_1_to_doc_2[::-1] if doc_1_to_doc_2 in checked_pairs or doc_2_to_doc_1 in checked_pairs: continue checked_pairs.update([doc_1_to_doc_2, doc_2_to_doc_1]) - # Actually something useful to work on now work_pkgs.append(_WorkPackage(first_doc, second_doc)) - # Don't spin up a pool of 1 process + results: list[_WorkResult] = [] if self.process_count == 1: - results = [] - for work in tqdm.tqdm(work_pkgs, disable=self.no_progress_bar): + for work in self.track(work_pkgs, description="Matching..."): results.append(_process_and_match(work)) else: # pragma: no cover - with multiprocessing.Pool(processes=self.process_count) as pool: - results = list( - tqdm.tqdm( - pool.imap_unordered(_process_and_match, work_pkgs), - total=len(work_pkgs), - disable=self.no_progress_bar, - ), - ) - - # Check results - messages = [] - maybe_delete_ids = [] - for result in sorted(results): - if result.ratio >= opt_ratio: + for proc_result in self.process_parallel( + _process_and_match, + work_pkgs, + description="Matching...", + ): + if proc_result.error: + self.console.print( + f"[red]Failed: {proc_result.error}[/red]", + ) + elif proc_result.result is not None: + results.append(proc_result.result) + + messages: list[str] = [] + maybe_delete_ids: list[int] = [] + for match_result in sorted(results): + if match_result.ratio >= opt_ratio: messages.append( self.style.NOTICE( - f"Document {result.doc_one_pk} fuzzy match" - f" to {result.doc_two_pk} (confidence {result.ratio:.3f})\n", + f"Document {match_result.doc_one_pk} fuzzy match" + f" to {match_result.doc_two_pk}" + f" (confidence {match_result.ratio:.3f})\n", ), ) - maybe_delete_ids.append(result.doc_two_pk) + maybe_delete_ids.append(match_result.doc_two_pk) if len(messages) == 0: - messages.append( - self.style.SUCCESS("No matches found\n"), - ) - self.stdout.writelines( - messages, - ) + messages.append(self.style.SUCCESS("No matches found\n")) + self.stdout.writelines(messages) + if options["delete"]: self.stdout.write( self.style.NOTICE( diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index 282f5c48ed..c0056c062b 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -8,14 +8,13 @@ from zipfile import ZipFile from zipfile import is_zipfile -import tqdm +import ijson from django.conf import settings from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist from django.core.management import call_command -from django.core.management.base import BaseCommand from django.core.management.base import CommandError from django.core.serializers.base import DeserializationError from django.db import IntegrityError @@ -25,6 +24,7 @@ from filelock import FileLock from documents.file_handling import create_source_path_directory +from documents.management.commands.base import PaperlessCommand from documents.management.commands.mixins import CryptMixin from documents.models import Correspondent from documents.models import CustomField @@ -33,7 +33,6 @@ from documents.models import DocumentType from documents.models import Note from documents.models import Tag -from documents.parsers import run_convert from documents.settings import EXPORTER_ARCHIVE_NAME from documents.settings import EXPORTER_CRYPTO_SETTINGS_NAME from documents.settings import EXPORTER_FILE_NAME @@ -47,31 +46,38 @@ from auditlog.registry import auditlog +def iter_manifest_records(path: Path) -> Generator[dict, None, None]: + """Yield records one at a time from a manifest JSON array via ijson.""" + try: + with path.open("rb") as f: + yield from ijson.items(f, "item") + except ijson.JSONError as e: + raise CommandError(f"Failed to parse manifest file {path}: {e}") from e + + @contextmanager -def disable_signal(sig, receiver, sender) -> Generator: +def disable_signal(sig, receiver, sender, *, weak: bool | None = None) -> Generator: try: sig.disconnect(receiver=receiver, sender=sender) yield finally: - sig.connect(receiver=receiver, sender=sender) + kwargs = {"weak": weak} if weak is not None else {} + sig.connect(receiver=receiver, sender=sender, **kwargs) -class Command(CryptMixin, BaseCommand): +class Command(CryptMixin, PaperlessCommand): help = ( "Using a manifest.json file, load the data from there, and import the " "documents it refers to." ) + supports_progress_bar = True + supports_multiprocessing = False + def add_arguments(self, parser) -> None: + super().add_arguments(parser) parser.add_argument("source") - parser.add_argument( - "--no-progress-bar", - default=False, - action="store_true", - help="If set, the progress bar will not be shown", - ) - parser.add_argument( "--data-only", default=False, @@ -146,14 +152,9 @@ def load_manifest_files(self) -> None: Loads manifest data from the various JSON files for parsing and loading the database """ main_manifest_path: Path = self.source / "manifest.json" - - with main_manifest_path.open() as infile: - self.manifest = json.load(infile) self.manifest_paths.append(main_manifest_path) for file in Path(self.source).glob("**/*-manifest.json"): - with file.open() as infile: - self.manifest += json.load(infile) self.manifest_paths.append(file) def load_metadata(self) -> None: @@ -204,7 +205,7 @@ def load_data_to_database(self) -> None: ContentType.objects.all().delete() Permission.objects.all().delete() for manifest_path in self.manifest_paths: - call_command("loaddata", manifest_path) + call_command("loaddata", manifest_path, skip_checks=True) except (FieldDoesNotExist, DeserializationError, IntegrityError) as e: self.stdout.write(self.style.ERROR("Database import failed")) if ( @@ -230,12 +231,10 @@ def handle(self, *args, **options) -> None: self.source = Path(options["source"]).resolve() self.data_only: bool = options["data_only"] - self.no_progress_bar: bool = options["no_progress_bar"] self.passphrase: str | None = options.get("passphrase") self.version: str | None = None self.salt: str | None = None self.manifest_paths = [] - self.manifest = [] # Create a temporary directory for extracting a zip file into it, even if supplied source is no zip file to keep code cleaner. with tempfile.TemporaryDirectory() as tmp_dir: @@ -245,7 +244,7 @@ def handle(self, *args, **options) -> None: self.source = Path(tmp_dir) self._run_import() - def _run_import(self): + def _run_import(self) -> None: self.pre_check() self.load_metadata() self.load_manifest_files() @@ -258,16 +257,19 @@ def _run_import(self): post_save, receiver=update_filename_and_move_files, sender=Document, + weak=False, ), disable_signal( m2m_changed, receiver=update_filename_and_move_files, sender=Document.tags.through, + weak=False, ), disable_signal( post_save, receiver=update_filename_and_move_files, sender=CustomFieldInstance, + weak=False, ), disable_signal( post_save, @@ -292,6 +294,9 @@ def _run_import(self): else: self.stdout.write(self.style.NOTICE("Data only import completed")) + for tmp in getattr(self, "_decrypted_tmp_paths", []): + tmp.unlink(missing_ok=True) + self.stdout.write("Updating search index...") call_command( "document_index", @@ -344,11 +349,12 @@ def check_document_validity(document_record: dict) -> None: ) from e self.stdout.write("Checking the manifest") - for record in self.manifest: - # Only check if the document files exist if this is not data only - # We don't care about documents for a data only import - if not self.data_only and record["model"] == "documents.document": - check_document_validity(record) + for manifest_path in self.manifest_paths: + for record in iter_manifest_records(manifest_path): + # Only check if the document files exist if this is not data only + # We don't care about documents for a data only import + if not self.data_only and record["model"] == "documents.document": + check_document_validity(record) def _import_files_from_manifest(self) -> None: settings.ORIGINALS_DIR.mkdir(parents=True, exist_ok=True) @@ -357,30 +363,36 @@ def _import_files_from_manifest(self) -> None: self.stdout.write("Copy files into paperless...") - manifest_documents = list( - filter(lambda r: r["model"] == "documents.document", self.manifest), - ) - - for record in tqdm.tqdm(manifest_documents, disable=self.no_progress_bar): + document_records = [ + { + "pk": record["pk"], + EXPORTER_FILE_NAME: record[EXPORTER_FILE_NAME], + EXPORTER_THUMBNAIL_NAME: record.get(EXPORTER_THUMBNAIL_NAME), + EXPORTER_ARCHIVE_NAME: record.get(EXPORTER_ARCHIVE_NAME), + } + for manifest_path in self.manifest_paths + for record in iter_manifest_records(manifest_path) + if record["model"] == "documents.document" + ] + + for record in self.track(document_records, description="Copying files..."): document = Document.objects.get(pk=record["pk"]) doc_file = record[EXPORTER_FILE_NAME] document_path = self.source / doc_file - if EXPORTER_THUMBNAIL_NAME in record: + if record[EXPORTER_THUMBNAIL_NAME]: thumb_file = record[EXPORTER_THUMBNAIL_NAME] thumbnail_path = (self.source / thumb_file).resolve() else: thumbnail_path = None - if EXPORTER_ARCHIVE_NAME in record: + if record[EXPORTER_ARCHIVE_NAME]: archive_file = record[EXPORTER_ARCHIVE_NAME] archive_path = self.source / archive_file else: archive_path = None - document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED - with FileLock(settings.MEDIA_LOCK): if Path(document.source_path).is_file(): raise FileExistsError(document.source_path) @@ -390,22 +402,10 @@ def _import_files_from_manifest(self) -> None: copy_file_with_basic_stats(document_path, document.source_path) if thumbnail_path: - if thumbnail_path.suffix in {".png", ".PNG"}: - run_convert( - density=300, - scale="500x5000>", - alpha="remove", - strip=True, - trim=False, - auto_orient=True, - input_file=f"{thumbnail_path}[0]", - output_file=str(document.thumbnail_path), - ) - else: - copy_file_with_basic_stats( - thumbnail_path, - document.thumbnail_path, - ) + copy_file_with_basic_stats( + thumbnail_path, + document.thumbnail_path, + ) if archive_path: create_source_path_directory(document.archive_path) @@ -416,33 +416,43 @@ def _import_files_from_manifest(self) -> None: document.save() + def _decrypt_record_if_needed(self, record: dict) -> dict: + fields = self.CRYPT_FIELDS_BY_MODEL.get(record.get("model", "")) + if fields: + for field in fields: + if record["fields"].get(field): + record["fields"][field] = self.decrypt_string( + value=record["fields"][field], + ) + return record + def decrypt_secret_fields(self) -> None: """ - The converse decryption of some fields out of the export before importing to database + The converse decryption of some fields out of the export before importing to database. + Streams records from each manifest path and writes decrypted content to a temp file. """ - if self.passphrase: - # Salt has been loaded from metadata.json at this point, so it cannot be None - self.setup_crypto(passphrase=self.passphrase, salt=self.salt) - - had_at_least_one_record = False - - for crypt_config in self.CRYPT_FIELDS: - importer_model: str = crypt_config["model_name"] - crypt_fields: str = crypt_config["fields"] - for record in filter( - lambda x: x["model"] == importer_model, - self.manifest, - ): - had_at_least_one_record = True - for field in crypt_fields: - if record["fields"][field]: - record["fields"][field] = self.decrypt_string( - value=record["fields"][field], - ) - - if had_at_least_one_record: - # It's annoying, but the DB is loaded from the JSON directly - # Maybe could change that in the future? - (self.source / "manifest.json").write_text( - json.dumps(self.manifest, indent=2, ensure_ascii=False), - ) + if not self.passphrase: + return + # Salt has been loaded from metadata.json at this point, so it cannot be None + self.setup_crypto(passphrase=self.passphrase, salt=self.salt) + self._decrypted_tmp_paths: list[Path] = [] + new_paths: list[Path] = [] + for manifest_path in self.manifest_paths: + tmp = manifest_path.with_name(manifest_path.stem + ".decrypted.json") + with tmp.open("w", encoding="utf-8") as out: + out.write("[\n") + first = True + for record in iter_manifest_records(manifest_path): + if not first: + out.write(",\n") + json.dump( + self._decrypt_record_if_needed(record), + out, + indent=2, + ensure_ascii=False, + ) + first = False + out.write("\n]\n") + self._decrypted_tmp_paths.append(tmp) + new_paths.append(tmp) + self.manifest_paths = new_paths diff --git a/src/documents/management/commands/document_index.py b/src/documents/management/commands/document_index.py index 1fa4f5a70e..742922010a 100644 --- a/src/documents/management/commands/document_index.py +++ b/src/documents/management/commands/document_index.py @@ -1,22 +1,28 @@ -from django.core.management import BaseCommand from django.db import transaction -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand from documents.tasks import index_optimize from documents.tasks import index_reindex -class Command(ProgressBarMixin, BaseCommand): +class Command(PaperlessCommand): help = "Manages the document index." + supports_progress_bar = True + supports_multiprocessing = False + def add_arguments(self, parser): + super().add_arguments(parser) parser.add_argument("command", choices=["reindex", "optimize"]) - self.add_argument_progress_bar_mixin(parser) def handle(self, *args, **options): - self.handle_progress_bar_mixin(**options) with transaction.atomic(): if options["command"] == "reindex": - index_reindex(progress_bar_disable=self.no_progress_bar) + index_reindex( + iter_wrapper=lambda docs: self.track( + docs, + description="Indexing documents...", + ), + ) elif options["command"] == "optimize": index_optimize() diff --git a/src/documents/management/commands/document_llmindex.py b/src/documents/management/commands/document_llmindex.py new file mode 100644 index 0000000000..3b9e3440bd --- /dev/null +++ b/src/documents/management/commands/document_llmindex.py @@ -0,0 +1,25 @@ +from typing import Any + +from documents.management.commands.base import PaperlessCommand +from documents.tasks import llmindex_index + + +class Command(PaperlessCommand): + help = "Manages the LLM-based vector index for Paperless." + + supports_progress_bar = True + supports_multiprocessing = False + + def add_arguments(self, parser: Any) -> None: + super().add_arguments(parser) + parser.add_argument("command", choices=["rebuild", "update"]) + + def handle(self, *args: Any, **options: Any) -> None: + llmindex_index( + rebuild=options["command"] == "rebuild", + scheduled=False, + iter_wrapper=lambda docs: self.track( + docs, + description="Indexing documents...", + ), + ) diff --git a/src/documents/management/commands/document_renamer.py b/src/documents/management/commands/document_renamer.py index 2dfca217e8..0e16f5cce9 100644 --- a/src/documents/management/commands/document_renamer.py +++ b/src/documents/management/commands/document_renamer.py @@ -1,25 +1,15 @@ -import logging - -import tqdm -from django.core.management.base import BaseCommand from django.db.models.signals import post_save -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand from documents.models import Document -class Command(ProgressBarMixin, BaseCommand): - help = "This will rename all documents to match the latest filename format." +class Command(PaperlessCommand): + help = "Rename all documents" - def add_arguments(self, parser): - self.add_argument_progress_bar_mixin(parser) + supports_progress_bar = True + supports_multiprocessing = False def handle(self, *args, **options): - self.handle_progress_bar_mixin(**options) - logging.getLogger().handlers[0].level = logging.ERROR - - for document in tqdm.tqdm( - Document.objects.all(), - disable=self.no_progress_bar, - ): + for document in self.track(Document.objects.all(), description="Renaming..."): post_save.send(Document, instance=document, created=False) diff --git a/src/documents/management/commands/document_retagger.py b/src/documents/management/commands/document_retagger.py index 10bb54b711..fc2e52e86c 100644 --- a/src/documents/management/commands/document_retagger.py +++ b/src/documents/management/commands/document_retagger.py @@ -1,20 +1,178 @@ +from __future__ import annotations + import logging +from dataclasses import dataclass +from dataclasses import field +from typing import TYPE_CHECKING -import tqdm -from django.core.management.base import BaseCommand +from rich.table import Table +from rich.text import Text from documents.classifier import load_classifier -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand 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 +if TYPE_CHECKING: + from rich.console import RenderableType + + from documents.models import Correspondent + from documents.models import DocumentType + from documents.models import StoragePath + from documents.models import Tag + logger = logging.getLogger("paperless.management.retagger") -class Command(ProgressBarMixin, BaseCommand): +@dataclass(slots=True) +class RetaggerStats: + """Cumulative counters updated as the retagger processes documents. + + Mutable by design -- fields are incremented in the processing loop. + slots=True reduces per-instance memory overhead and speeds attribute access. + """ + + correspondents: int = 0 + document_types: int = 0 + tags_added: int = 0 + tags_removed: int = 0 + storage_paths: int = 0 + documents_processed: int = 0 + + +@dataclass(slots=True) +class DocumentSuggestion: + """Buffered classifier suggestions for a single document (suggest mode only). + + Mutable by design -- fields are assigned incrementally as each setter runs. + """ + + document: Document + correspondent: Correspondent | None = None + document_type: DocumentType | None = None + tags_to_add: frozenset[Tag] = field(default_factory=frozenset) + tags_to_remove: frozenset[Tag] = field(default_factory=frozenset) + storage_path: StoragePath | None = None + + @property + def has_suggestions(self) -> bool: + return bool( + self.correspondent is not None + or self.document_type is not None + or self.tags_to_add + or self.tags_to_remove + or self.storage_path is not None, + ) + + +def _build_stats_table(stats: RetaggerStats, *, suggest: bool) -> Table: + """ + Build the live-updating stats table shown below the progress bar. + + In suggest mode the labels read "would set / would add" to make clear + that nothing has been written to the database. + """ + table = Table(box=None, padding=(0, 2), show_header=True, header_style="bold") + + table.add_column("Documents") + table.add_column("Correspondents") + table.add_column("Doc Types") + table.add_column("Tags (+)") + table.add_column("Tags (-)") + table.add_column("Storage Paths") + + verb = "would set" if suggest else "set" + + table.add_row( + str(stats.documents_processed), + f"{stats.correspondents} {verb}", + f"{stats.document_types} {verb}", + f"+{stats.tags_added}", + f"-{stats.tags_removed}", + f"{stats.storage_paths} {verb}", + ) + + return table + + +def _build_suggestion_table( + suggestions: list[DocumentSuggestion], + base_url: str | None, +) -> Table: + """ + Build the final suggestion table printed after the progress bar completes. + + Only documents with at least one suggestion are included. + """ + table = Table( + title="Suggested Changes", + show_header=True, + header_style="bold cyan", + show_lines=True, + ) + + table.add_column("Document", style="bold", no_wrap=False, min_width=20) + table.add_column("Correspondent") + table.add_column("Doc Type") + table.add_column("Tags") + table.add_column("Storage Path") + + for suggestion in suggestions: + if not suggestion.has_suggestions: + continue + + doc = suggestion.document + + if base_url: + doc_cell = Text() + doc_cell.append(str(doc)) + doc_cell.append(f"\n{base_url}/documents/{doc.pk}", style="dim") + else: + doc_cell = Text(f"{doc} [{doc.pk}]") + + tag_parts: list[str] = [] + for tag in sorted(suggestion.tags_to_add, key=lambda t: t.name): + tag_parts.append(f"[green]+{tag.name}[/green]") + for tag in sorted(suggestion.tags_to_remove, key=lambda t: t.name): + tag_parts.append(f"[red]-{tag.name}[/red]") + tag_cell = Text.from_markup(", ".join(tag_parts)) if tag_parts else Text("-") + + table.add_row( + doc_cell, + str(suggestion.correspondent) if suggestion.correspondent else "-", + str(suggestion.document_type) if suggestion.document_type else "-", + tag_cell, + str(suggestion.storage_path) if suggestion.storage_path else "-", + ) + + return table + + +def _build_summary_table(stats: RetaggerStats) -> Table: + """Build the final applied-changes summary table.""" + table = Table( + title="Retagger Summary", + show_header=True, + header_style="bold cyan", + ) + + table.add_column("Metric", style="bold") + table.add_column("Count", justify="right") + + table.add_row("Documents processed", str(stats.documents_processed)) + table.add_row("Correspondents set", str(stats.correspondents)) + table.add_row("Document types set", str(stats.document_types)) + table.add_row("Tags added", str(stats.tags_added)) + table.add_row("Tags removed", str(stats.tags_removed)) + table.add_row("Storage paths set", str(stats.storage_paths)) + + return table + + +class Command(PaperlessCommand): help = ( "Using the current classification model, assigns correspondents, tags " "and document types to all documents, effectively allowing you to " @@ -22,7 +180,11 @@ class Command(ProgressBarMixin, BaseCommand): "modified) after their initial import." ) - def add_arguments(self, parser): + supports_progress_bar = True + supports_multiprocessing = False + + def add_arguments(self, parser) -> None: + super().add_arguments(parser) parser.add_argument("-c", "--correspondent", default=False, action="store_true") parser.add_argument("-T", "--tags", default=False, action="store_true") parser.add_argument("-t", "--document_type", default=False, action="store_true") @@ -33,9 +195,9 @@ def add_arguments(self, parser): default=False, action="store_true", help=( - "By default this command won't try to assign a correspondent " - "if more than one matches the document. Use this flag if " - "you'd rather it just pick the first one it finds." + "By default this command will not try to assign a correspondent " + "if more than one matches the document. Use this flag to pick " + "the first match instead." ), ) parser.add_argument( @@ -44,31 +206,44 @@ def add_arguments(self, parser): default=False, action="store_true", help=( - "If set, the document retagger will overwrite any previously " - "set correspondent, document and remove correspondents, types " - "and tags that do not match anymore due to changed rules." + "Overwrite any previously set correspondent, document type, and " + "remove tags that no longer match due to changed rules." ), ) - self.add_argument_progress_bar_mixin(parser) parser.add_argument( "--suggest", default=False, action="store_true", - help="Return the suggestion, don't change anything.", + help="Show what would be changed without applying anything.", ) parser.add_argument( "--base-url", - help="The base URL to use to build the link to the documents.", + help="Base URL used to build document links in suggest output.", ) parser.add_argument( "--id-range", - help="A range of document ids on which the retagging should be applied.", + help="Restrict retagging to documents within this ID range (inclusive).", nargs=2, type=int, ) - def handle(self, *args, **options): - self.handle_progress_bar_mixin(**options) + def handle(self, *args, **options) -> None: + suggest: bool = options["suggest"] + overwrite: bool = options["overwrite"] + use_first: bool = options["use_first"] + base_url: str | None = options["base_url"] + + do_correspondent: bool = options["correspondent"] + do_document_type: bool = options["document_type"] + do_tags: bool = options["tags"] + do_storage_path: bool = options["storage_path"] + + if not any([do_correspondent, do_document_type, do_tags, do_storage_path]): + self.console.print( + "[yellow]No classifier targets specified. " + "Use -c, -T, -t, or -s to select what to retag.[/yellow]", + ) + return if options["inbox_only"]: queryset = Document.objects.filter(tags__is_inbox_tag=True) @@ -76,61 +251,95 @@ def handle(self, *args, **options): queryset = Document.objects.all() if options["id_range"]: - queryset = queryset.filter( - id__range=(options["id_range"][0], options["id_range"][1]), - ) + lo, hi = options["id_range"] + queryset = queryset.filter(id__range=(lo, hi)) documents = queryset.distinct() - classifier = load_classifier() - for document in tqdm.tqdm(documents, disable=self.no_progress_bar): - if options["correspondent"]: - set_correspondent( - sender=None, - document=document, - classifier=classifier, - replace=options["overwrite"], - use_first=options["use_first"], - suggest=options["suggest"], - base_url=options["base_url"], - stdout=self.stdout, - style_func=self.style, - ) - - if options["document_type"]: - set_document_type( - sender=None, - document=document, - classifier=classifier, - replace=options["overwrite"], - use_first=options["use_first"], - suggest=options["suggest"], - base_url=options["base_url"], - stdout=self.stdout, - style_func=self.style, - ) - - if options["tags"]: - set_tags( - sender=None, - document=document, - classifier=classifier, - replace=options["overwrite"], - suggest=options["suggest"], - base_url=options["base_url"], - stdout=self.stdout, - style_func=self.style, - ) - if options["storage_path"]: - set_storage_path( - sender=None, - document=document, - classifier=classifier, - replace=options["overwrite"], - use_first=options["use_first"], - suggest=options["suggest"], - base_url=options["base_url"], - stdout=self.stdout, - style_func=self.style, - ) + stats = RetaggerStats() + suggestions: list[DocumentSuggestion] = [] + + def render_stats() -> RenderableType: + return _build_stats_table(stats, suggest=suggest) + + with self.buffered_logging( + "paperless", + "paperless.handlers", + "documents", + ) as log_buf: + for document in self.track_with_stats( + documents, + description="Retagging...", + stats_renderer=render_stats, + ): + suggestion = DocumentSuggestion(document=document) + + if do_correspondent: + correspondent = set_correspondent( + None, + document, + classifier=classifier, + replace=overwrite, + use_first=use_first, + dry_run=suggest, + ) + if correspondent is not None: + stats.correspondents += 1 + suggestion.correspondent = correspondent + + if do_document_type: + document_type = set_document_type( + None, + document, + classifier=classifier, + replace=overwrite, + use_first=use_first, + dry_run=suggest, + ) + if document_type is not None: + stats.document_types += 1 + suggestion.document_type = document_type + + if do_tags: + tags_to_add, tags_to_remove = set_tags( + None, + document, + classifier=classifier, + replace=overwrite, + dry_run=suggest, + ) + stats.tags_added += len(tags_to_add) + stats.tags_removed += len(tags_to_remove) + suggestion.tags_to_add = frozenset(tags_to_add) + suggestion.tags_to_remove = frozenset(tags_to_remove) + + if do_storage_path: + storage_path = set_storage_path( + None, + document, + classifier=classifier, + replace=overwrite, + use_first=use_first, + dry_run=suggest, + ) + if storage_path is not None: + stats.storage_paths += 1 + suggestion.storage_path = storage_path + + stats.documents_processed += 1 + + if suggest: + suggestions.append(suggestion) + + # Post-loop output + if suggest: + visible = [s for s in suggestions if s.has_suggestions] + if visible: + self.console.print(_build_suggestion_table(visible, base_url)) + else: + self.console.print("[green]No changes suggested.[/green]") + else: + self.console.print(_build_summary_table(stats)) + + log_buf.render(self.console, min_level=logging.INFO, title="Retagger Log") diff --git a/src/documents/management/commands/document_sanity_checker.py b/src/documents/management/commands/document_sanity_checker.py index b634d4dc9a..598ddf7bb0 100644 --- a/src/documents/management/commands/document_sanity_checker.py +++ b/src/documents/management/commands/document_sanity_checker.py @@ -1,17 +1,120 @@ -from django.core.management.base import BaseCommand +"""Management command to check the document archive for issues.""" -from documents.management.commands.mixins import ProgressBarMixin +from __future__ import annotations + +import logging +from typing import Any + +from rich.panel import Panel +from rich.table import Table +from rich.text import Text + +from documents.management.commands.base import PaperlessCommand +from documents.models import Document +from documents.sanity_checker import SanityCheckMessages from documents.sanity_checker import check_sanity +_LEVEL_STYLE: dict[int, tuple[str, str]] = { + logging.ERROR: ("bold red", "ERROR"), + logging.WARNING: ("yellow", "WARN"), + logging.INFO: ("dim", "INFO"), +} + -class Command(ProgressBarMixin, BaseCommand): +class Command(PaperlessCommand): help = "This command checks your document archive for issues." - def add_arguments(self, parser): - self.add_argument_progress_bar_mixin(parser) + supports_progress_bar = True + supports_multiprocessing = False + + def _render_results(self, messages: SanityCheckMessages) -> None: + """Render sanity check results as a Rich table.""" + + if ( + not messages.has_error + and not messages.has_warning + and not messages.has_info + ): + self.console.print( + Panel( + "[green]No issues detected.[/green]", + title="Sanity Check", + border_style="green", + ), + ) + return + + # Build a lookup for document titles + doc_pks = [pk for pk in messages.document_pks() if pk is not None] + titles: dict[int, str] = {} + if doc_pks: + titles = dict( + Document.global_objects.filter(pk__in=doc_pks) + .only("pk", "title") + .values_list("pk", "title"), + ) + + table = Table( + title="Sanity Check Results", + show_lines=True, + title_style="bold", + ) + table.add_column("Level", width=7, no_wrap=True) + table.add_column("Document", min_width=20) + table.add_column("Issue", ratio=1) + + for doc_pk, doc_messages in messages.iter_messages(): + if doc_pk is not None: + title = titles.get(doc_pk, "Unknown") + doc_label = f"#{doc_pk} {title}" + else: + doc_label = "(global)" + + for msg in doc_messages: + style, label = _LEVEL_STYLE.get( + msg["level"], + ("dim", "INFO"), + ) + table.add_row( + Text(label, style=style), + Text(doc_label), + Text(str(msg["message"])), + ) + + self.console.print(table) + + parts: list[str] = [] + + if messages.document_error_count: + parts.append( + f"{messages.document_error_count} document(s) with [bold red]errors[/bold red]", + ) + if messages.document_warning_count: + parts.append( + f"{messages.document_warning_count} document(s) with [yellow]warnings[/yellow]", + ) + if messages.document_info_count: + parts.append(f"{messages.document_info_count} document(s) with infos") + if messages.global_warning_count: + parts.append( + f"{messages.global_warning_count} global [yellow]warning(s)[/yellow]", + ) - def handle(self, *args, **options): - self.handle_progress_bar_mixin(**options) - messages = check_sanity(progress=self.use_progress_bar, scheduled=False) + if parts: + if len(parts) > 1: + summary = ", ".join(parts[:-1]) + " and " + parts[-1] + else: + summary = parts[0] + self.console.print(f"\nFound {summary}.") + else: + self.console.print("\nNo issues found.") - messages.log_messages() + def handle(self, *args: Any, **options: Any) -> None: + messages = check_sanity( + scheduled=False, + iter_wrapper=lambda docs: self.track( + docs, + description="Checking documents...", + ), + ) + self._render_results(messages) diff --git a/src/documents/management/commands/document_thumbnails.py b/src/documents/management/commands/document_thumbnails.py index d4653f0b36..e4ae88766d 100644 --- a/src/documents/management/commands/document_thumbnails.py +++ b/src/documents/management/commands/document_thumbnails.py @@ -1,43 +1,47 @@ import logging -import multiprocessing import shutil -import tqdm -from django import db -from django.core.management.base import BaseCommand - -from documents.management.commands.mixins import MultiProcessMixin -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand from documents.models import Document from documents.parsers import get_parser_class_for_mime_type +logger = logging.getLogger("paperless.management.thumbnails") + -def _process_document(doc_id): +def _process_document(doc_id: int) -> None: document: Document = Document.objects.get(id=doc_id) parser_class = get_parser_class_for_mime_type(document.mime_type) - if parser_class: - parser = parser_class(logging_group=None) - else: - print(f"{document} No parser for mime type {document.mime_type}") # noqa: T201 + if parser_class is None: + logger.warning( + "%s: No parser for mime type %s", + document, + document.mime_type, + ) return + parser = parser_class(logging_group=None) + try: thumb = parser.get_thumbnail( document.source_path, document.mime_type, document.get_public_filename(), ) - shutil.move(thumb, document.thumbnail_path) finally: + # TODO(stumpylog): Cleanup once all parsers are handled parser.cleanup() -class Command(MultiProcessMixin, ProgressBarMixin, BaseCommand): +class Command(PaperlessCommand): help = "This will regenerate the thumbnails for all documents." - def add_arguments(self, parser): + supports_progress_bar = True + supports_multiprocessing = True + + def add_arguments(self, parser) -> None: + super().add_arguments(parser) parser.add_argument( "-d", "--document", @@ -49,36 +53,23 @@ def add_arguments(self, parser): "run on this specific document." ), ) - self.add_argument_progress_bar_mixin(parser) - self.add_argument_processes_mixin(parser) def handle(self, *args, **options): logging.getLogger().handlers[0].level = logging.ERROR - self.handle_processes_mixin(**options) - self.handle_progress_bar_mixin(**options) - if options["document"]: documents = Document.objects.filter(pk=options["document"]) else: documents = Document.objects.all() - ids = [doc.id for doc in documents] - - # Note to future self: this prevents django from reusing database - # connections between processes, which is bad and does not work - # with postgres. - db.connections.close_all() + ids = list(documents.values_list("id", flat=True)) - if self.process_count == 1: - for doc_id in ids: - _process_document(doc_id) - else: # pragma: no cover - with multiprocessing.Pool(processes=self.process_count) as pool: - list( - tqdm.tqdm( - pool.imap_unordered(_process_document, ids), - total=len(ids), - disable=self.no_progress_bar, - ), + for result in self.process_parallel( + _process_document, + ids, + description="Regenerating thumbnails...", + ): + if result.error: # pragma: no cover + self.console.print( + f"[red]Failed document {result.item}: {result.error}[/red]", ) diff --git a/src/documents/management/commands/loaddata_stdin.py b/src/documents/management/commands/loaddata_stdin.py deleted file mode 100644 index f6feb2e8db..0000000000 --- a/src/documents/management/commands/loaddata_stdin.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys - -from django.core.management.commands.loaddata import Command as LoadDataCommand - - -# This class is used to migrate data between databases -# That's difficult to test -class Command(LoadDataCommand): # pragma: no cover - """ - Allow the loading of data from standard in. Sourced originally from: - https://gist.github.com/bmispelon/ad5a2c333443b3a1d051 (MIT licensed) - """ - - def parse_name(self, fixture_name): - self.compression_formats["stdin"] = (lambda x, y: sys.stdin, None) - if fixture_name == "-": - return "-", "json", "stdin" - - def find_fixtures(self, fixture_label): - if fixture_label == "-": - return [("-", None, "-")] - return super().find_fixtures(fixture_label) diff --git a/src/documents/management/commands/manage_superuser.py b/src/documents/management/commands/manage_superuser.py index e0d2384385..3a81a47c52 100644 --- a/src/documents/management/commands/manage_superuser.py +++ b/src/documents/management/commands/manage_superuser.py @@ -25,7 +25,7 @@ def create_parser(self, *args, **kwargs): parser.formatter_class = RawTextHelpFormatter return parser - def handle(self, *args, **options): + def handle(self, *args, **options) -> None: username = os.getenv("PAPERLESS_ADMIN_USER", "admin") mail = os.getenv("PAPERLESS_ADMIN_MAIL", "root@localhost") password = os.getenv("PAPERLESS_ADMIN_PASSWORD") diff --git a/src/documents/management/commands/mixins.py b/src/documents/management/commands/mixins.py index a2ad326e44..6d325b1e3b 100644 --- a/src/documents/management/commands/mixins.py +++ b/src/documents/management/commands/mixins.py @@ -1,6 +1,5 @@ import base64 import os -from argparse import ArgumentParser from typing import TypedDict from cryptography.fernet import Fernet @@ -21,45 +20,6 @@ class CryptFields(TypedDict): fields: list[str] -class MultiProcessMixin: - """ - Small class to handle adding an argument and validating it - for the use of multiple processes - """ - - def add_argument_processes_mixin(self, parser: ArgumentParser): - parser.add_argument( - "--processes", - default=max(1, os.cpu_count() // 4), - type=int, - help="Number of processes to distribute work amongst", - ) - - def handle_processes_mixin(self, *args, **options): - self.process_count = options["processes"] - if self.process_count < 1: - raise CommandError("There must be at least 1 process") - - -class ProgressBarMixin: - """ - Many commands use a progress bar, which can be disabled - via this class - """ - - def add_argument_progress_bar_mixin(self, parser: ArgumentParser): - parser.add_argument( - "--no-progress-bar", - default=False, - action="store_true", - help="If set, the progress bar will not be shown", - ) - - def handle_progress_bar_mixin(self, *args, **options): - self.no_progress_bar = options["no_progress_bar"] - self.use_progress_bar = not self.no_progress_bar - - class CryptMixin: """ Fully based on: @@ -91,7 +51,7 @@ class CryptMixin: key_size = 32 kdf_algorithm = "pbkdf2_sha256" - CRYPT_FIELDS: CryptFields = [ + CRYPT_FIELDS: list[CryptFields] = [ { "exporter_key": "mail_accounts", "model_name": "paperless_mail.mailaccount", @@ -109,6 +69,10 @@ class CryptMixin: ], }, ] + # O(1) lookup for per-record encryption; derived from CRYPT_FIELDS at class definition time + CRYPT_FIELDS_BY_MODEL: dict[str, list[str]] = { + cfg["model_name"]: cfg["fields"] for cfg in CRYPT_FIELDS + } def get_crypt_params(self) -> dict[str, dict[str, str | int]]: return { @@ -120,7 +84,7 @@ def get_crypt_params(self) -> dict[str, dict[str, str | int]]: }, } - def load_crypt_params(self, metadata: dict): + def load_crypt_params(self, metadata: dict) -> None: # Load up the values for setting up decryption self.kdf_algorithm: str = metadata[EXPORTER_CRYPTO_SETTINGS_NAME][ EXPORTER_CRYPTO_ALGO_NAME @@ -135,7 +99,7 @@ def load_crypt_params(self, metadata: dict): EXPORTER_CRYPTO_SALT_NAME ] - def setup_crypto(self, *, passphrase: str, salt: str | None = None): + def setup_crypto(self, *, passphrase: str, salt: str | None = None) -> None: """ Constructs a class for encryption or decryption using the specified passphrase and salt diff --git a/src/documents/management/commands/prune_audit_logs.py b/src/documents/management/commands/prune_audit_logs.py index b49f4afc26..1a54332cd3 100644 --- a/src/documents/management/commands/prune_audit_logs.py +++ b/src/documents/management/commands/prune_audit_logs.py @@ -1,27 +1,24 @@ from auditlog.models import LogEntry -from django.core.management.base import BaseCommand from django.db import transaction -from tqdm import tqdm -from documents.management.commands.mixins import ProgressBarMixin +from documents.management.commands.base import PaperlessCommand -class Command(BaseCommand, ProgressBarMixin): - """ - Prune the audit logs of objects that no longer exist. - """ +class Command(PaperlessCommand): + """Prune the audit logs of objects that no longer exist.""" help = "Prunes the audit logs of objects that no longer exist." - def add_arguments(self, parser): - self.add_argument_progress_bar_mixin(parser) + supports_progress_bar = True + supports_multiprocessing = False - def handle(self, **options): - self.handle_progress_bar_mixin(**options) + def handle(self, *args, **options): with transaction.atomic(): - for log_entry in tqdm(LogEntry.objects.all(), disable=self.no_progress_bar): + for log_entry in self.track( + LogEntry.objects.all(), + description="Pruning audit logs...", + ): model_class = log_entry.content_type.model_class() - # use global_objects for SoftDeleteModel objects = ( model_class.global_objects if hasattr(model_class, "global_objects") @@ -32,8 +29,8 @@ def handle(self, **options): and not objects.filter(pk=log_entry.object_id).exists() ): log_entry.delete() - tqdm.write( - self.style.NOTICE( - f"Deleted audit log entry for {model_class.__name__} #{log_entry.object_id}", - ), + self.console.print( + f"Deleted audit log entry for " + f"{model_class.__name__} #{log_entry.object_id}", + style="yellow", ) diff --git a/src/documents/matching.py b/src/documents/matching.py index 2c8d2bf87d..e023adae76 100644 --- a/src/documents/matching.py +++ b/src/documents/matching.py @@ -20,6 +20,7 @@ from documents.models import Workflow from documents.models import WorkflowTrigger from documents.permissions import get_objects_for_user_owner_aware +from documents.regex import safe_regex_search if TYPE_CHECKING: from django.db.models import QuerySet @@ -33,7 +34,7 @@ def log_reason( matching_model: MatchingModel | WorkflowTrigger, document: Document, reason: str, -): +) -> None: class_name = type(matching_model).__name__ name = ( matching_model.name if hasattr(matching_model, "name") else str(matching_model) @@ -64,8 +65,12 @@ def match_correspondents(document: Document, classifier: DocumentClassifier, use return list( filter( - lambda o: matches(o, document) - or (o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO), + lambda o: ( + matches(o, document) + or ( + o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO + ) + ), correspondents, ), ) @@ -91,8 +96,12 @@ def match_document_types(document: Document, classifier: DocumentClassifier, use return list( filter( - lambda o: matches(o, document) - or (o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO), + lambda o: ( + matches(o, document) + or ( + o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO + ) + ), document_types, ), ) @@ -113,10 +122,12 @@ def match_tags(document: Document, classifier: DocumentClassifier, user=None): return list( filter( - lambda o: matches(o, document) - or ( - o.matching_algorithm == MatchingModel.MATCH_AUTO - and o.pk in predicted_tag_ids + lambda o: ( + matches(o, document) + or ( + o.matching_algorithm == MatchingModel.MATCH_AUTO + and o.pk in predicted_tag_ids + ) ), tags, ), @@ -144,31 +155,39 @@ def match_storage_paths(document: Document, classifier: DocumentClassifier, user return list( filter( - lambda o: matches(o, document) - or (o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO), + lambda o: ( + matches(o, document) + or ( + o.pk == pred_id and o.matching_algorithm == MatchingModel.MATCH_AUTO + ) + ), storage_paths, ), ) def matches(matching_model: MatchingModel, document: Document): - search_kwargs = {} + search_flags = 0 - document_content = document.content + document_content = document.get_effective_content() or "" # Check that match is not empty if not matching_model.match.strip(): return False if matching_model.is_insensitive: - search_kwargs = {"flags": re.IGNORECASE} + search_flags = re.IGNORECASE if matching_model.matching_algorithm == MatchingModel.MATCH_NONE: return False elif matching_model.matching_algorithm == MatchingModel.MATCH_ALL: for word in _split_match(matching_model): - search_result = re.search(rf"\b{word}\b", document_content, **search_kwargs) + search_result = re.search( + rf"\b{word}\b", + document_content, + flags=search_flags, + ) if not search_result: return False log_reason( @@ -180,7 +199,7 @@ def matches(matching_model: MatchingModel, document: Document): elif matching_model.matching_algorithm == MatchingModel.MATCH_ANY: for word in _split_match(matching_model): - if re.search(rf"\b{word}\b", document_content, **search_kwargs): + if re.search(rf"\b{word}\b", document_content, flags=search_flags): log_reason(matching_model, document, f"it contains this word: {word}") return True return False @@ -190,7 +209,7 @@ def matches(matching_model: MatchingModel, document: Document): re.search( rf"\b{re.escape(matching_model.match)}\b", document_content, - **search_kwargs, + flags=search_flags, ), ) if result: @@ -202,16 +221,11 @@ def matches(matching_model: MatchingModel, document: Document): return result elif matching_model.matching_algorithm == MatchingModel.MATCH_REGEX: - try: - match = re.search( - re.compile(matching_model.match, **search_kwargs), - document_content, - ) - except re.error: - logger.error( - f"Error while processing regular expression {matching_model.match}", - ) - return False + match = safe_regex_search( + matching_model.match, + document_content, + flags=search_flags, + ) if match: log_reason( matching_model, @@ -403,6 +417,18 @@ def existing_document_matches_workflow( f"Document tags {list(document.tags.all())} include excluded tags {list(trigger_has_not_tags_qs)}", ) + allowed_correspondent_ids = set( + trigger.filter_has_any_correspondents.values_list("id", flat=True), + ) + if ( + allowed_correspondent_ids + and document.correspondent_id not in allowed_correspondent_ids + ): + return ( + False, + f"Document correspondent {document.correspondent} is not one of {list(trigger.filter_has_any_correspondents.all())}", + ) + # Document correspondent vs trigger has_correspondent if ( trigger.filter_has_correspondent_id is not None @@ -424,6 +450,17 @@ def existing_document_matches_workflow( f"Document correspondent {document.correspondent} is excluded by {list(trigger.filter_has_not_correspondents.all())}", ) + allowed_document_type_ids = set( + trigger.filter_has_any_document_types.values_list("id", flat=True), + ) + if allowed_document_type_ids and ( + document.document_type_id not in allowed_document_type_ids + ): + return ( + False, + f"Document doc type {document.document_type} is not one of {list(trigger.filter_has_any_document_types.all())}", + ) + # Document document_type vs trigger has_document_type if ( trigger.filter_has_document_type_id is not None @@ -445,6 +482,17 @@ def existing_document_matches_workflow( f"Document doc type {document.document_type} is excluded by {list(trigger.filter_has_not_document_types.all())}", ) + allowed_storage_path_ids = set( + trigger.filter_has_any_storage_paths.values_list("id", flat=True), + ) + if allowed_storage_path_ids and ( + document.storage_path_id not in allowed_storage_path_ids + ): + return ( + False, + f"Document storage path {document.storage_path} is not one of {list(trigger.filter_has_any_storage_paths.all())}", + ) + # Document storage_path vs trigger has_storage_path if ( trigger.filter_has_storage_path_id is not None @@ -532,6 +580,10 @@ def prefilter_documents_by_workflowtrigger( # Correspondent, DocumentType, etc. filtering + if trigger.filter_has_any_correspondents.exists(): + documents = documents.filter( + correspondent__in=trigger.filter_has_any_correspondents.all(), + ) if trigger.filter_has_correspondent is not None: documents = documents.filter( correspondent=trigger.filter_has_correspondent, @@ -541,6 +593,10 @@ def prefilter_documents_by_workflowtrigger( correspondent__in=trigger.filter_has_not_correspondents.all(), ) + if trigger.filter_has_any_document_types.exists(): + documents = documents.filter( + document_type__in=trigger.filter_has_any_document_types.all(), + ) if trigger.filter_has_document_type is not None: documents = documents.filter( document_type=trigger.filter_has_document_type, @@ -550,6 +606,10 @@ def prefilter_documents_by_workflowtrigger( document_type__in=trigger.filter_has_not_document_types.all(), ) + if trigger.filter_has_any_storage_paths.exists(): + documents = documents.filter( + storage_path__in=trigger.filter_has_any_storage_paths.all(), + ) if trigger.filter_has_storage_path is not None: documents = documents.filter( storage_path=trigger.filter_has_storage_path, @@ -604,8 +664,11 @@ def document_matches_workflow( "filter_has_tags", "filter_has_all_tags", "filter_has_not_tags", + "filter_has_any_document_types", "filter_has_not_document_types", + "filter_has_any_correspondents", "filter_has_not_correspondents", + "filter_has_any_storage_paths", "filter_has_not_storage_paths", ) ) diff --git a/src/documents/migrations/0001_initial.py b/src/documents/migrations/0001_initial.py deleted file mode 100644 index 89c9e29df6..0000000000 --- a/src/documents/migrations/0001_initial.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 1.9 on 2015-12-20 19:10 - -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - initial = True - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="Document", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("sender", models.CharField(blank=True, db_index=True, max_length=128)), - ("title", models.CharField(blank=True, db_index=True, max_length=128)), - ( - "content", - models.TextField( - db_index=( - "mysql" not in settings.DATABASES["default"]["ENGINE"] - ), - ), - ), - ("created", models.DateTimeField(auto_now_add=True)), - ("modified", models.DateTimeField(auto_now=True)), - ], - ), - ] diff --git a/src/documents/migrations/0001_squashed.py b/src/documents/migrations/0001_squashed.py new file mode 100644 index 0000000000..f079fbf7ca --- /dev/null +++ b/src/documents/migrations/0001_squashed.py @@ -0,0 +1,2174 @@ +# Generated by Django 5.2.11 on 2026-03-03 16:27 + +import datetime + +import django.core.validators +import django.db.models.deletion +import django.db.models.functions.comparison +import django.db.models.functions.text +import django.utils.timezone +import multiselectfield.db.fields +from django.conf import settings +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + replaces = [ + ("documents", "0001_initial"), + ("documents", "0002_auto_20151226_1316"), + ("documents", "0003_sender"), + ("documents", "0004_auto_20160114_1844"), + ( + "documents", + "0004_auto_20160114_1844_squashed_0011_auto_20160303_1929", + ), + ("documents", "0005_auto_20160123_0313"), + ("documents", "0006_auto_20160123_0430"), + ("documents", "0007_auto_20160126_2114"), + ("documents", "0008_document_file_type"), + ("documents", "0009_auto_20160214_0040"), + ("documents", "0010_log"), + ("documents", "0011_auto_20160303_1929"), + ("documents", "0012_auto_20160305_0040"), + ("documents", "0013_auto_20160325_2111"), + ("documents", "0014_document_checksum"), + ("documents", "0015_add_insensitive_to_match"), + ( + "documents", + "0015_add_insensitive_to_match_squashed_0018_auto_20170715_1712", + ), + ("documents", "0016_auto_20170325_1558"), + ("documents", "0017_auto_20170512_0507"), + ("documents", "0018_auto_20170715_1712"), + ("documents", "0019_add_consumer_user"), + ("documents", "0020_document_added"), + ("documents", "0021_document_storage_type"), + ("documents", "0022_auto_20181007_1420"), + ("documents", "0023_document_current_filename"), + ("documents", "1000_update_paperless_all"), + ("documents", "1001_auto_20201109_1636"), + ("documents", "1002_auto_20201111_1105"), + ("documents", "1003_mime_types"), + ("documents", "1004_sanity_check_schedule"), + ("documents", "1005_checksums"), + ("documents", "1006_auto_20201208_2209"), + ( + "documents", + "1006_auto_20201208_2209_squashed_1011_auto_20210101_2340", + ), + ("documents", "1007_savedview_savedviewfilterrule"), + ("documents", "1008_auto_20201216_1736"), + ("documents", "1009_auto_20201216_2005"), + ("documents", "1010_auto_20210101_2159"), + ("documents", "1011_auto_20210101_2340"), + ("documents", "1012_fix_archive_files"), + ("documents", "1013_migrate_tag_colour"), + ("documents", "1014_auto_20210228_1614"), + ("documents", "1015_remove_null_characters"), + ("documents", "1016_auto_20210317_1351"), + ( + "documents", + "1016_auto_20210317_1351_squashed_1020_merge_20220518_1839", + ), + ("documents", "1017_alter_savedviewfilterrule_rule_type"), + ("documents", "1018_alter_savedviewfilterrule_value"), + ("documents", "1019_storagepath_document_storage_path"), + ("documents", "1019_uisettings"), + ("documents", "1020_merge_20220518_1839"), + ("documents", "1021_webp_thumbnail_conversion"), + ("documents", "1022_paperlesstask"), + ( + "documents", + "1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type", + ), + ("documents", "1023_add_comments"), + ("documents", "1024_document_original_filename"), + ("documents", "1025_alter_savedviewfilterrule_rule_type"), + ("documents", "1026_transition_to_celery"), + ( + "documents", + "1027_remove_paperlesstask_attempted_task_and_more", + ), + ( + "documents", + "1028_remove_paperlesstask_task_args_and_more", + ), + ("documents", "1029_alter_document_archive_serial_number"), + ("documents", "1030_alter_paperlesstask_task_file_name"), + ( + "documents", + "1031_remove_savedview_user_correspondent_owner_and_more", + ), + ( + "documents", + "1032_alter_correspondent_matching_algorithm_and_more", + ), + ( + "documents", + "1033_alter_documenttype_options_alter_tag_options_and_more", + ), + ("documents", "1034_alter_savedviewfilterrule_rule_type"), + ("documents", "1035_rename_comment_note"), + ("documents", "1036_alter_savedviewfilterrule_rule_type"), + ("documents", "1037_webp_encrypted_thumbnail_conversion"), + ("documents", "1038_sharelink"), + ("documents", "1039_consumptiontemplate"), + ( + "documents", + "1040_customfield_customfieldinstance_and_more", + ), + ("documents", "1041_alter_consumptiontemplate_sources"), + ( + "documents", + "1042_consumptiontemplate_assign_custom_fields_and_more", + ), + ("documents", "1043_alter_savedviewfilterrule_rule_type"), + ( + "documents", + "1044_workflow_workflowaction_workflowtrigger_and_more", + ), + ( + "documents", + "1045_alter_customfieldinstance_value_monetary", + ), + ( + "documents", + "1045_alter_customfieldinstance_value_monetary_squashed_1049_document_deleted_at_document_restored_at", + ), + ( + "documents", + "1046_workflowaction_remove_all_correspondents_and_more", + ), + ("documents", "1047_savedview_display_mode_and_more"), + ("documents", "1048_alter_savedviewfilterrule_rule_type"), + ( + "documents", + "1049_document_deleted_at_document_restored_at", + ), + ("documents", "1050_customfield_extra_data_and_more"), + ( + "documents", + "1051_alter_correspondent_owner_alter_document_owner_and_more", + ), + ("documents", "1052_document_transaction_id"), + ("documents", "1053_document_page_count"), + ( + "documents", + "1054_customfieldinstance_value_monetary_amount_and_more", + ), + ("documents", "1055_alter_storagepath_path"), + ( + "documents", + "1056_customfieldinstance_deleted_at_and_more", + ), + ("documents", "1057_paperlesstask_owner"), + ( + "documents", + "1058_workflowtrigger_schedule_date_custom_field_and_more", + ), + ( + "documents", + "1059_workflowactionemail_workflowactionwebhook_and_more", + ), + ( + "documents", + "1060_alter_customfieldinstance_value_select", + ), + ("documents", "1061_workflowactionwebhook_as_json"), + ("documents", "1062_alter_savedviewfilterrule_rule_type"), + ( + "documents", + "1063_paperlesstask_type_alter_paperlesstask_task_name_and_more", + ), + ("documents", "1064_delete_log"), + ( + "documents", + "1065_workflowaction_assign_custom_fields_values", + ), + ( + "documents", + "1066_alter_workflowtrigger_schedule_offset_days", + ), + ("documents", "1067_alter_document_created"), + ("documents", "1068_alter_document_created"), + ( + "documents", + "1069_workflowtrigger_filter_has_storage_path_and_more", + ), + ( + "documents", + "1070_customfieldinstance_value_long_text_and_more", + ), + ( + "documents", + "1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more", + ), + ( + "documents", + "1072_workflowtrigger_filter_custom_field_query_and_more", + ), + ("documents", "1073_migrate_workflow_title_jinja"), + ( + "documents", + "1074_workflowrun_deleted_at_workflowrun_restored_at_and_more", + ), + ] + + operations = [ + migrations.CreateModel( + name="WorkflowActionEmail", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "subject", + models.CharField( + help_text="The subject of the email, can include some placeholders, see documentation.", + max_length=256, + verbose_name="email subject", + ), + ), + ( + "body", + models.TextField( + help_text="The body (message) of the email, can include some placeholders, see documentation.", + verbose_name="email body", + ), + ), + ( + "to", + models.TextField( + help_text="The destination email addresses, comma separated.", + verbose_name="emails to", + ), + ), + ( + "include_document", + models.BooleanField( + default=False, + verbose_name="include document in email", + ), + ), + ], + ), + migrations.CreateModel( + name="WorkflowActionWebhook", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "url", + models.CharField( + help_text="The destination URL for the notification.", + max_length=256, + verbose_name="webhook url", + ), + ), + ( + "use_params", + models.BooleanField(default=True, verbose_name="use parameters"), + ), + ( + "as_json", + models.BooleanField(default=False, verbose_name="send as JSON"), + ), + ( + "params", + models.JSONField( + blank=True, + help_text="The parameters to send with the webhook URL if body not used.", + null=True, + verbose_name="webhook parameters", + ), + ), + ( + "body", + models.TextField( + blank=True, + help_text="The body to send with the webhook URL if parameters not used.", + null=True, + verbose_name="webhook body", + ), + ), + ( + "headers", + models.JSONField( + blank=True, + help_text="The headers to send with the webhook URL.", + null=True, + verbose_name="webhook headers", + ), + ), + ( + "include_document", + models.BooleanField( + default=False, + verbose_name="include document in webhook", + ), + ), + ], + ), + migrations.CreateModel( + name="Correspondent", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="name")), + ( + "match", + models.CharField(blank=True, max_length=256, verbose_name="match"), + ), + ( + "matching_algorithm", + models.PositiveIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + ( + "is_insensitive", + models.BooleanField(default=True, verbose_name="is insensitive"), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "correspondent", + "verbose_name_plural": "correspondents", + "ordering": ("name",), + "abstract": False, + }, + ), + migrations.CreateModel( + name="DocumentType", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="name")), + ( + "match", + models.CharField(blank=True, max_length=256, verbose_name="match"), + ), + ( + "matching_algorithm", + models.PositiveIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + ( + "is_insensitive", + models.BooleanField(default=True, verbose_name="is insensitive"), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "document type", + "verbose_name_plural": "document types", + "ordering": ("name",), + "abstract": False, + }, + ), + migrations.CreateModel( + name="StoragePath", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="name")), + ( + "match", + models.CharField(blank=True, max_length=256, verbose_name="match"), + ), + ( + "matching_algorithm", + models.PositiveIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + ( + "is_insensitive", + models.BooleanField(default=True, verbose_name="is insensitive"), + ), + ("path", models.TextField(verbose_name="path")), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "storage path", + "verbose_name_plural": "storage paths", + "ordering": ("name",), + "abstract": False, + }, + ), + migrations.CreateModel( + name="Tag", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "tn_ancestors_pks", + models.TextField( + blank=True, + default="", + editable=False, + verbose_name="Ancestors pks", + ), + ), + ( + "tn_ancestors_count", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Ancestors count", + ), + ), + ( + "tn_children_pks", + models.TextField( + blank=True, + default="", + editable=False, + verbose_name="Children pks", + ), + ), + ( + "tn_children_count", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Children count", + ), + ), + ( + "tn_depth", + models.PositiveIntegerField( + default=0, + editable=False, + validators=[ + django.core.validators.MinValueValidator(0), + django.core.validators.MaxValueValidator(10), + ], + verbose_name="Depth", + ), + ), + ( + "tn_descendants_pks", + models.TextField( + blank=True, + default="", + editable=False, + verbose_name="Descendants pks", + ), + ), + ( + "tn_descendants_count", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Descendants count", + ), + ), + ( + "tn_index", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Index", + ), + ), + ( + "tn_level", + models.PositiveIntegerField( + default=1, + editable=False, + validators=[ + django.core.validators.MinValueValidator(1), + django.core.validators.MaxValueValidator(10), + ], + verbose_name="Level", + ), + ), + ( + "tn_priority", + models.PositiveIntegerField( + default=0, + validators=[ + django.core.validators.MinValueValidator(0), + django.core.validators.MaxValueValidator(9999999999), + ], + verbose_name="Priority", + ), + ), + ( + "tn_order", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Order", + ), + ), + ( + "tn_siblings_pks", + models.TextField( + blank=True, + default="", + editable=False, + verbose_name="Siblings pks", + ), + ), + ( + "tn_siblings_count", + models.PositiveIntegerField( + default=0, + editable=False, + verbose_name="Siblings count", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="name")), + ( + "match", + models.CharField(blank=True, max_length=256, verbose_name="match"), + ), + ( + "matching_algorithm", + models.PositiveIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + ( + "is_insensitive", + models.BooleanField(default=True, verbose_name="is insensitive"), + ), + ( + "color", + models.CharField( + default="#a6cee3", + max_length=7, + verbose_name="color", + ), + ), + ( + "is_inbox_tag", + models.BooleanField( + default=False, + help_text="Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags.", + verbose_name="is inbox tag", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ( + "tn_parent", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="tn_children", + to="documents.tag", + verbose_name="Parent", + ), + ), + ], + options={ + "verbose_name": "tag", + "verbose_name_plural": "tags", + "ordering": ("name",), + "abstract": False, + }, + ), + migrations.CreateModel( + name="Document", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("restored_at", models.DateTimeField(blank=True, null=True)), + ("transaction_id", models.UUIDField(blank=True, null=True)), + ( + "title", + models.CharField( + blank=True, + db_index=True, + max_length=128, + verbose_name="title", + ), + ), + ( + "content", + models.TextField( + blank=True, + help_text="The raw, text-only data of the document. This field is primarily used for searching.", + verbose_name="content", + ), + ), + ( + "mime_type", + models.CharField( + editable=False, + max_length=256, + verbose_name="mime type", + ), + ), + ( + "checksum", + models.CharField( + editable=False, + help_text="The checksum of the original document.", + max_length=32, + unique=True, + verbose_name="checksum", + ), + ), + ( + "archive_checksum", + models.CharField( + blank=True, + editable=False, + help_text="The checksum of the archived document.", + max_length=32, + null=True, + verbose_name="archive checksum", + ), + ), + ( + "page_count", + models.PositiveIntegerField( + help_text="The number of pages of the document.", + null=True, + validators=[django.core.validators.MinValueValidator(1)], + verbose_name="page count", + ), + ), + ( + "created", + models.DateField( + db_index=True, + default=datetime.date.today, + verbose_name="created", + ), + ), + ( + "modified", + models.DateTimeField( + auto_now=True, + db_index=True, + verbose_name="modified", + ), + ), + ( + "storage_type", + models.CharField( + choices=[ + ("unencrypted", "Unencrypted"), + ("gpg", "Encrypted with GNU Privacy Guard"), + ], + default="unencrypted", + editable=False, + max_length=11, + verbose_name="storage type", + ), + ), + ( + "added", + models.DateTimeField( + db_index=True, + default=django.utils.timezone.now, + editable=False, + verbose_name="added", + ), + ), + ( + "filename", + models.FilePathField( + default=None, + editable=False, + help_text="Current filename in storage", + max_length=1024, + null=True, + unique=True, + verbose_name="filename", + ), + ), + ( + "archive_filename", + models.FilePathField( + default=None, + editable=False, + help_text="Current archive filename in storage", + max_length=1024, + null=True, + unique=True, + verbose_name="archive filename", + ), + ), + ( + "original_filename", + models.CharField( + default=None, + editable=False, + help_text="The original name of the file when it was uploaded", + max_length=1024, + null=True, + verbose_name="original filename", + ), + ), + ( + "archive_serial_number", + models.PositiveIntegerField( + blank=True, + db_index=True, + help_text="The position of this document in your physical document archive.", + null=True, + unique=True, + validators=[ + django.core.validators.MaxValueValidator(4294967295), + django.core.validators.MinValueValidator(0), + ], + verbose_name="archive serial number", + ), + ), + ( + "correspondent", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="documents", + to="documents.correspondent", + verbose_name="correspondent", + ), + ), + ( + "document_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="documents", + to="documents.documenttype", + verbose_name="document type", + ), + ), + ( + "storage_path", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="documents", + to="documents.storagepath", + verbose_name="storage path", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "document", + "verbose_name_plural": "documents", + "ordering": ("-created",), + }, + ), + migrations.AddField( + model_name="document", + name="tags", + field=models.ManyToManyField( + blank=True, + related_name="documents", + to="documents.tag", + verbose_name="tags", + ), + ), + migrations.CreateModel( + name="Note", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("restored_at", models.DateTimeField(blank=True, null=True)), + ("transaction_id", models.UUIDField(blank=True, null=True)), + ( + "note", + models.TextField( + blank=True, + help_text="Note for the document", + verbose_name="content", + ), + ), + ( + "created", + models.DateTimeField( + db_index=True, + default=django.utils.timezone.now, + verbose_name="created", + ), + ), + ( + "document", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="notes", + to="documents.document", + verbose_name="document", + ), + ), + ( + "user", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="notes", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), + ], + options={ + "verbose_name": "note", + "verbose_name_plural": "notes", + "ordering": ("created",), + }, + ), + migrations.CreateModel( + name="CustomField", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + db_index=True, + default=django.utils.timezone.now, + editable=False, + verbose_name="created", + ), + ), + ("name", models.CharField(max_length=128)), + ( + "data_type", + models.CharField( + choices=[ + ("string", "String"), + ("url", "URL"), + ("date", "Date"), + ("boolean", "Boolean"), + ("integer", "Integer"), + ("float", "Float"), + ("monetary", "Monetary"), + ("documentlink", "Document Link"), + ("select", "Select"), + ("longtext", "Long Text"), + ], + editable=False, + max_length=50, + verbose_name="data type", + ), + ), + ( + "extra_data", + models.JSONField( + blank=True, + help_text="Extra data for the custom field, such as select options", + null=True, + verbose_name="extra data", + ), + ), + ], + options={ + "verbose_name": "custom field", + "verbose_name_plural": "custom fields", + "ordering": ("created",), + "constraints": [ + models.UniqueConstraint( + fields=("name",), + name="documents_customfield_unique_name", + ), + ], + }, + ), + migrations.CreateModel( + name="CustomFieldInstance", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("restored_at", models.DateTimeField(blank=True, null=True)), + ("transaction_id", models.UUIDField(blank=True, null=True)), + ( + "created", + models.DateTimeField( + db_index=True, + default=django.utils.timezone.now, + editable=False, + verbose_name="created", + ), + ), + ("value_text", models.CharField(max_length=128, null=True)), + ("value_bool", models.BooleanField(null=True)), + ("value_url", models.URLField(null=True)), + ("value_date", models.DateField(null=True)), + ("value_int", models.IntegerField(null=True)), + ("value_float", models.FloatField(null=True)), + ("value_monetary", models.CharField(max_length=128, null=True)), + ( + "value_monetary_amount", + models.GeneratedField( + db_persist=True, + expression=models.Case( + models.When( + then=django.db.models.functions.comparison.Cast( + django.db.models.functions.text.Substr( + "value_monetary", + 1, + ), + output_field=models.DecimalField( + decimal_places=2, + max_digits=65, + ), + ), + value_monetary__regex="^\\d+", + ), + default=django.db.models.functions.comparison.Cast( + django.db.models.functions.text.Substr( + "value_monetary", + 4, + ), + output_field=models.DecimalField( + decimal_places=2, + max_digits=65, + ), + ), + output_field=models.DecimalField( + decimal_places=2, + max_digits=65, + ), + ), + output_field=models.DecimalField( + decimal_places=2, + max_digits=65, + ), + ), + ), + ("value_document_ids", models.JSONField(null=True)), + ("value_select", models.CharField(max_length=16, null=True)), + ("value_long_text", models.TextField(null=True)), + ( + "field", + models.ForeignKey( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + related_name="fields", + to="documents.customfield", + ), + ), + ( + "document", + models.ForeignKey( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + related_name="custom_fields", + to="documents.document", + ), + ), + ], + options={ + "verbose_name": "custom field instance", + "verbose_name_plural": "custom field instances", + "ordering": ("created",), + }, + ), + migrations.CreateModel( + name="PaperlessTask", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "task_id", + models.CharField( + help_text="Celery ID for the Task that was run", + max_length=255, + unique=True, + verbose_name="Task ID", + ), + ), + ( + "acknowledged", + models.BooleanField( + default=False, + help_text="If the task is acknowledged via the frontend or API", + verbose_name="Acknowledged", + ), + ), + ( + "task_file_name", + models.CharField( + help_text="Name of the file which the Task was run for", + max_length=255, + null=True, + verbose_name="Task Filename", + ), + ), + ( + "task_name", + models.CharField( + choices=[ + ("consume_file", "Consume File"), + ("train_classifier", "Train Classifier"), + ("check_sanity", "Check Sanity"), + ("index_optimize", "Index Optimize"), + ], + help_text="Name of the task that was run", + max_length=255, + null=True, + verbose_name="Task Name", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("FAILURE", "FAILURE"), + ("PENDING", "PENDING"), + ("RECEIVED", "RECEIVED"), + ("RETRY", "RETRY"), + ("REVOKED", "REVOKED"), + ("STARTED", "STARTED"), + ("SUCCESS", "SUCCESS"), + ], + default="PENDING", + help_text="Current state of the task being run", + max_length=30, + verbose_name="Task State", + ), + ), + ( + "date_created", + models.DateTimeField( + default=django.utils.timezone.now, + help_text="Datetime field when the task result was created in UTC", + null=True, + verbose_name="Created DateTime", + ), + ), + ( + "date_started", + models.DateTimeField( + default=None, + help_text="Datetime field when the task was started in UTC", + null=True, + verbose_name="Started DateTime", + ), + ), + ( + "date_done", + models.DateTimeField( + default=None, + help_text="Datetime field when the task was completed in UTC", + null=True, + verbose_name="Completed DateTime", + ), + ), + ( + "result", + models.TextField( + default=None, + help_text="The data returned by the task", + null=True, + verbose_name="Result Data", + ), + ), + ( + "type", + models.CharField( + choices=[ + ("auto_task", "Auto Task"), + ("scheduled_task", "Scheduled Task"), + ("manual_task", "Manual Task"), + ], + default="auto_task", + help_text="The type of task that was run", + max_length=30, + verbose_name="Task Type", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SavedView", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=128, verbose_name="name")), + ( + "show_on_dashboard", + models.BooleanField(verbose_name="show on dashboard"), + ), + ( + "show_in_sidebar", + models.BooleanField(verbose_name="show in sidebar"), + ), + ( + "sort_field", + models.CharField( + blank=True, + max_length=128, + null=True, + verbose_name="sort field", + ), + ), + ( + "sort_reverse", + models.BooleanField(default=False, verbose_name="sort reverse"), + ), + ( + "page_size", + models.PositiveIntegerField( + blank=True, + null=True, + validators=[django.core.validators.MinValueValidator(1)], + verbose_name="View page size", + ), + ), + ( + "display_mode", + models.CharField( + blank=True, + choices=[ + ("table", "Table"), + ("smallCards", "Small Cards"), + ("largeCards", "Large Cards"), + ], + max_length=128, + null=True, + verbose_name="View display mode", + ), + ), + ( + "display_fields", + models.JSONField( + blank=True, + null=True, + verbose_name="Document display fields", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "saved view", + "verbose_name_plural": "saved views", + "ordering": ("name",), + }, + ), + migrations.CreateModel( + name="SavedViewFilterRule", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "rule_type", + models.PositiveIntegerField( + choices=[ + (0, "title contains"), + (1, "content contains"), + (2, "ASN is"), + (3, "correspondent is"), + (4, "document type is"), + (5, "is in inbox"), + (6, "has tag"), + (7, "has any tag"), + (8, "created before"), + (9, "created after"), + (10, "created year is"), + (11, "created month is"), + (12, "created day is"), + (13, "added before"), + (14, "added after"), + (15, "modified before"), + (16, "modified after"), + (17, "does not have tag"), + (18, "does not have ASN"), + (19, "title or content contains"), + (20, "fulltext query"), + (21, "more like this"), + (22, "has tags in"), + (23, "ASN greater than"), + (24, "ASN less than"), + (25, "storage path is"), + (26, "has correspondent in"), + (27, "does not have correspondent in"), + (28, "has document type in"), + (29, "does not have document type in"), + (30, "has storage path in"), + (31, "does not have storage path in"), + (32, "owner is"), + (33, "has owner in"), + (34, "does not have owner"), + (35, "does not have owner in"), + (36, "has custom field value"), + (37, "is shared by me"), + (38, "has custom fields"), + (39, "has custom field in"), + (40, "does not have custom field in"), + (41, "does not have custom field"), + (42, "custom fields query"), + (43, "created to"), + (44, "created from"), + (45, "added to"), + (46, "added from"), + (47, "mime type is"), + ], + verbose_name="rule type", + ), + ), + ( + "value", + models.CharField( + blank=True, + max_length=255, + null=True, + verbose_name="value", + ), + ), + ( + "saved_view", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="filter_rules", + to="documents.savedview", + verbose_name="saved view", + ), + ), + ], + options={ + "verbose_name": "filter rule", + "verbose_name_plural": "filter rules", + }, + ), + migrations.CreateModel( + name="ShareLink", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("restored_at", models.DateTimeField(blank=True, null=True)), + ("transaction_id", models.UUIDField(blank=True, null=True)), + ( + "created", + models.DateTimeField( + blank=True, + db_index=True, + default=django.utils.timezone.now, + editable=False, + verbose_name="created", + ), + ), + ( + "expiration", + models.DateTimeField( + blank=True, + db_index=True, + null=True, + verbose_name="expiration", + ), + ), + ( + "slug", + models.SlugField( + blank=True, + editable=False, + unique=True, + verbose_name="slug", + ), + ), + ( + "file_version", + models.CharField( + choices=[("archive", "Archive"), ("original", "Original")], + default="archive", + max_length=50, + ), + ), + ( + "document", + models.ForeignKey( + blank=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="share_links", + to="documents.document", + verbose_name="document", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="share_links", + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "verbose_name": "share link", + "verbose_name_plural": "share links", + "ordering": ("created",), + }, + ), + migrations.CreateModel( + name="UiSettings", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("settings", models.JSONField(null=True)), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="ui_settings", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.CreateModel( + name="WorkflowAction", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "type", + models.PositiveIntegerField( + choices=[ + (1, "Assignment"), + (2, "Removal"), + (3, "Email"), + (4, "Webhook"), + ], + default=1, + verbose_name="Workflow Action Type", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "assign_title", + models.TextField( + blank=True, + help_text="Assign a document title, must be a Jinja2 template, see documentation.", + null=True, + verbose_name="assign title", + ), + ), + ( + "assign_custom_fields_values", + models.JSONField( + blank=True, + default=dict, + help_text="Optional values to assign to the custom fields.", + null=True, + verbose_name="custom field values", + ), + ), + ( + "remove_all_tags", + models.BooleanField(default=False, verbose_name="remove all tags"), + ), + ( + "remove_all_document_types", + models.BooleanField( + default=False, + verbose_name="remove all document types", + ), + ), + ( + "remove_all_correspondents", + models.BooleanField( + default=False, + verbose_name="remove all correspondents", + ), + ), + ( + "remove_all_storage_paths", + models.BooleanField( + default=False, + verbose_name="remove all storage paths", + ), + ), + ( + "remove_all_owners", + models.BooleanField( + default=False, + verbose_name="remove all owners", + ), + ), + ( + "remove_all_permissions", + models.BooleanField( + default=False, + verbose_name="remove all permissions", + ), + ), + ( + "remove_all_custom_fields", + models.BooleanField( + default=False, + verbose_name="remove all custom fields", + ), + ), + ( + "assign_change_groups", + models.ManyToManyField( + blank=True, + related_name="+", + to="auth.group", + verbose_name="grant change permissions to these groups", + ), + ), + ( + "assign_change_users", + models.ManyToManyField( + blank=True, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="grant change permissions to these users", + ), + ), + ( + "assign_correspondent", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="documents.correspondent", + verbose_name="assign this correspondent", + ), + ), + ( + "assign_custom_fields", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.customfield", + verbose_name="assign these custom fields", + ), + ), + ( + "assign_document_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="documents.documenttype", + verbose_name="assign this document type", + ), + ), + ( + "assign_owner", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="assign this owner", + ), + ), + ( + "assign_storage_path", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to="documents.storagepath", + verbose_name="assign this storage path", + ), + ), + ( + "assign_tags", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.tag", + verbose_name="assign this tag", + ), + ), + ( + "assign_view_groups", + models.ManyToManyField( + blank=True, + related_name="+", + to="auth.group", + verbose_name="grant view permissions to these groups", + ), + ), + ( + "assign_view_users", + models.ManyToManyField( + blank=True, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="grant view permissions to these users", + ), + ), + ( + "remove_change_groups", + models.ManyToManyField( + blank=True, + related_name="+", + to="auth.group", + verbose_name="remove change permissions for these groups", + ), + ), + ( + "remove_change_users", + models.ManyToManyField( + blank=True, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="remove change permissions for these users", + ), + ), + ( + "remove_correspondents", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.correspondent", + verbose_name="remove these correspondent(s)", + ), + ), + ( + "remove_custom_fields", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.customfield", + verbose_name="remove these custom fields", + ), + ), + ( + "remove_document_types", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.documenttype", + verbose_name="remove these document type(s)", + ), + ), + ( + "remove_owners", + models.ManyToManyField( + blank=True, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="remove these owner(s)", + ), + ), + ( + "remove_storage_paths", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.storagepath", + verbose_name="remove these storage path(s)", + ), + ), + ( + "remove_tags", + models.ManyToManyField( + blank=True, + related_name="+", + to="documents.tag", + verbose_name="remove these tag(s)", + ), + ), + ( + "remove_view_groups", + models.ManyToManyField( + blank=True, + related_name="+", + to="auth.group", + verbose_name="remove view permissions for these groups", + ), + ), + ( + "remove_view_users", + models.ManyToManyField( + blank=True, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="remove view permissions for these users", + ), + ), + ( + "email", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="action", + to="documents.workflowactionemail", + verbose_name="email", + ), + ), + ( + "webhook", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="action", + to="documents.workflowactionwebhook", + verbose_name="webhook", + ), + ), + ], + options={ + "verbose_name": "workflow action", + "verbose_name_plural": "workflow actions", + }, + ), + migrations.CreateModel( + name="Workflow", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField(max_length=256, unique=True, verbose_name="name"), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ("enabled", models.BooleanField(default=True, verbose_name="enabled")), + ( + "actions", + models.ManyToManyField( + related_name="workflows", + to="documents.workflowaction", + verbose_name="actions", + ), + ), + ], + ), + migrations.CreateModel( + name="WorkflowRun", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("restored_at", models.DateTimeField(blank=True, null=True)), + ("transaction_id", models.UUIDField(blank=True, null=True)), + ( + "type", + models.PositiveIntegerField( + choices=[ + (1, "Consumption Started"), + (2, "Document Added"), + (3, "Document Updated"), + (4, "Scheduled"), + ], + null=True, + verbose_name="workflow trigger type", + ), + ), + ( + "run_at", + models.DateTimeField( + db_index=True, + default=django.utils.timezone.now, + verbose_name="date run", + ), + ), + ( + "document", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="workflow_runs", + to="documents.document", + verbose_name="document", + ), + ), + ( + "workflow", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="runs", + to="documents.workflow", + verbose_name="workflow", + ), + ), + ], + options={ + "verbose_name": "workflow run", + "verbose_name_plural": "workflow runs", + }, + ), + migrations.CreateModel( + name="WorkflowTrigger", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "type", + models.PositiveIntegerField( + choices=[ + (1, "Consumption Started"), + (2, "Document Added"), + (3, "Document Updated"), + (4, "Scheduled"), + ], + default=1, + verbose_name="Workflow Trigger Type", + ), + ), + ( + "sources", + multiselectfield.db.fields.MultiSelectField( + choices=[ + (1, "Consume Folder"), + (2, "Api Upload"), + (3, "Mail Fetch"), + (4, "Web UI"), + ], + default="1,2,3,4", + max_length=7, + ), + ), + ( + "filter_path", + models.CharField( + blank=True, + help_text="Only consume documents with a path that matches this if specified. Wildcards specified as * are allowed. Case insensitive.", + max_length=256, + null=True, + verbose_name="filter path", + ), + ), + ( + "filter_filename", + models.CharField( + blank=True, + help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", + max_length=256, + null=True, + verbose_name="filter filename", + ), + ), + ( + "match", + models.CharField(blank=True, max_length=256, verbose_name="match"), + ), + ( + "matching_algorithm", + models.PositiveIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + ], + default=0, + verbose_name="matching algorithm", + ), + ), + ( + "is_insensitive", + models.BooleanField(default=True, verbose_name="is insensitive"), + ), + ( + "filter_custom_field_query", + models.TextField( + blank=True, + help_text="JSON-encoded custom field query expression.", + null=True, + verbose_name="filter custom field query", + ), + ), + ( + "schedule_offset_days", + models.IntegerField( + default=0, + help_text="The number of days to offset the schedule trigger by.", + verbose_name="schedule offset days", + ), + ), + ( + "schedule_is_recurring", + models.BooleanField( + default=False, + help_text="If the schedule should be recurring.", + verbose_name="schedule is recurring", + ), + ), + ( + "schedule_recurring_interval_days", + models.PositiveIntegerField( + default=1, + help_text="The number of days between recurring schedule triggers.", + validators=[django.core.validators.MinValueValidator(1)], + verbose_name="schedule recurring delay in days", + ), + ), + ( + "schedule_date_field", + models.CharField( + choices=[ + ("added", "Added"), + ("created", "Created"), + ("modified", "Modified"), + ("custom_field", "Custom Field"), + ], + default="added", + help_text="The field to check for a schedule trigger.", + max_length=20, + verbose_name="schedule date field", + ), + ), + ( + "filter_has_all_tags", + models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_all", + to="documents.tag", + verbose_name="has all of these tag(s)", + ), + ), + ( + "filter_has_correspondent", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="documents.correspondent", + verbose_name="has this correspondent", + ), + ), + ( + "filter_has_document_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="documents.documenttype", + verbose_name="has this document type", + ), + ), + ( + "filter_has_not_correspondents", + models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_not_correspondent", + to="documents.correspondent", + verbose_name="does not have these correspondent(s)", + ), + ), + ( + "filter_has_not_document_types", + models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_not_document_type", + to="documents.documenttype", + verbose_name="does not have these document type(s)", + ), + ), + ( + "filter_has_not_storage_paths", + models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_not_storage_path", + to="documents.storagepath", + verbose_name="does not have these storage path(s)", + ), + ), + ( + "filter_has_not_tags", + models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_not", + to="documents.tag", + verbose_name="does not have these tag(s)", + ), + ), + ( + "filter_has_storage_path", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="documents.storagepath", + verbose_name="has this storage path", + ), + ), + ( + "filter_has_tags", + models.ManyToManyField( + blank=True, + to="documents.tag", + verbose_name="has these tag(s)", + ), + ), + ], + options={ + "verbose_name": "workflow trigger", + "verbose_name_plural": "workflow triggers", + }, + ), + ] diff --git a/src/documents/migrations/0002_auto_20151226_1316.py b/src/documents/migrations/0002_auto_20151226_1316.py deleted file mode 100644 index ffd2409029..0000000000 --- a/src/documents/migrations/0002_auto_20151226_1316.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 1.9 on 2015-12-26 13:16 - -import django.utils.timezone -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0001_initial"), - ] - - operations = [ - migrations.AlterModelOptions( - name="document", - options={"ordering": ("sender", "title")}, - ), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateTimeField( - default=django.utils.timezone.now, - editable=False, - ), - ), - ] diff --git a/src/documents/migrations/1033_alter_documenttype_options_alter_tag_options_and_more.py b/src/documents/migrations/0002_squashed.py similarity index 58% rename from src/documents/migrations/1033_alter_documenttype_options_alter_tag_options_and_more.py rename to src/documents/migrations/0002_squashed.py index 1368ac6410..a8f0029e74 100644 --- a/src/documents/migrations/1033_alter_documenttype_options_alter_tag_options_and_more.py +++ b/src/documents/migrations/0002_squashed.py @@ -1,50 +1,55 @@ -# Generated by Django 4.1.5 on 2023-03-04 22:33 +# Generated by Django 5.2.11 on 2026-03-03 16:27 +import django.db.models.deletion from django.db import migrations from django.db import models class Migration(migrations.Migration): + initial = True + dependencies = [ - ("documents", "1032_alter_correspondent_matching_algorithm_and_more"), + ("documents", "0001_squashed"), + ("paperless_mail", "0001_squashed"), + ] + + # This migration needs a "replaces", but it doesn't matter which. + # Chose the last 2.20.x migration + replaces = [ + ("documents", "1075_workflowaction_order"), ] operations = [ - migrations.AlterModelOptions( - name="documenttype", - options={ - "ordering": ("name",), - "verbose_name": "document type", - "verbose_name_plural": "document types", - }, - ), - migrations.AlterModelOptions( - name="tag", - options={ - "ordering": ("name",), - "verbose_name": "tag", - "verbose_name_plural": "tags", - }, - ), - migrations.AlterField( - model_name="correspondent", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AlterField( - model_name="documenttype", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), + migrations.AddField( + model_name="workflowtrigger", + name="filter_mailrule", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="paperless_mail.mailrule", + verbose_name="filter documents from this mail rule", + ), ), - migrations.AlterField( - model_name="storagepath", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), + migrations.AddField( + model_name="workflowtrigger", + name="schedule_date_custom_field", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="documents.customfield", + verbose_name="schedule date custom field", + ), ), - migrations.AlterField( - model_name="tag", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), + migrations.AddField( + model_name="workflow", + name="triggers", + field=models.ManyToManyField( + related_name="workflows", + to="documents.workflowtrigger", + verbose_name="triggers", + ), ), migrations.AddConstraint( model_name="correspondent", @@ -61,6 +66,13 @@ class Migration(migrations.Migration): name="documents_correspondent_name_uniq", ), ), + migrations.AddConstraint( + model_name="customfieldinstance", + constraint=models.UniqueConstraint( + fields=("document", "field"), + name="documents_customfieldinstance_unique_document_field", + ), + ), migrations.AddConstraint( model_name="documenttype", constraint=models.UniqueConstraint( diff --git a/src/paperless_mail/migrations/0011_remove_mailrule_assign_tag.py b/src/documents/migrations/0003_remove_document_storage_type.py similarity index 50% rename from src/paperless_mail/migrations/0011_remove_mailrule_assign_tag.py rename to src/documents/migrations/0003_remove_document_storage_type.py index 16cec87109..2c5c70d7f0 100644 --- a/src/paperless_mail/migrations/0011_remove_mailrule_assign_tag.py +++ b/src/documents/migrations/0003_remove_document_storage_type.py @@ -1,16 +1,16 @@ -# Generated by Django 3.2.12 on 2022-03-11 15:18 +# Generated by Django 5.2.9 on 2026-01-24 23:05 from django.db import migrations class Migration(migrations.Migration): dependencies = [ - ("paperless_mail", "0010_auto_20220311_1602"), + ("documents", "0002_squashed"), ] operations = [ migrations.RemoveField( - model_name="mailrule", - name="assign_tag", + model_name="document", + name="storage_type", ), ] diff --git a/src/documents/migrations/0003_sender.py b/src/documents/migrations/0003_sender.py deleted file mode 100644 index dd194afdb4..0000000000 --- a/src/documents/migrations/0003_sender.py +++ /dev/null @@ -1,70 +0,0 @@ -# Generated by Django 1.9 on 2016-01-11 12:21 - -import django.db.models.deletion -from django.db import migrations -from django.db import models -from django.template.defaultfilters import slugify - -DOCUMENT_SENDER_MAP = {} - - -def move_sender_strings_to_sender_model(apps, schema_editor): - sender_model = apps.get_model("documents", "Sender") - document_model = apps.get_model("documents", "Document") - - # Create the sender and log the relationship with the document - for document in document_model.objects.all(): - if document.sender: - ( - DOCUMENT_SENDER_MAP[document.pk], - _, - ) = sender_model.objects.get_or_create( - name=document.sender, - defaults={"slug": slugify(document.sender)}, - ) - - -def realign_senders(apps, schema_editor): - document_model = apps.get_model("documents", "Document") - for pk, sender in DOCUMENT_SENDER_MAP.items(): - document_model.objects.filter(pk=pk).update(sender=sender) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0002_auto_20151226_1316"), - ] - - operations = [ - migrations.CreateModel( - name="Sender", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128, unique=True)), - ("slug", models.SlugField()), - ], - ), - migrations.RunPython(move_sender_strings_to_sender_model), - migrations.RemoveField( - model_name="document", - name="sender", - ), - migrations.AddField( - model_name="document", - name="sender", - field=models.ForeignKey( - blank=True, - on_delete=django.db.models.deletion.CASCADE, - to="documents.Sender", - ), - ), - migrations.RunPython(realign_senders), - ] diff --git a/src/documents/migrations/0004_auto_20160114_1844.py b/src/documents/migrations/0004_auto_20160114_1844.py deleted file mode 100644 index 97bda420ea..0000000000 --- a/src/documents/migrations/0004_auto_20160114_1844.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 1.9 on 2016-01-14 18:44 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0003_sender"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="sender", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documents", - to="documents.Sender", - ), - ), - ] diff --git a/src/documents/migrations/0004_auto_20160114_1844_squashed_0011_auto_20160303_1929.py b/src/documents/migrations/0004_auto_20160114_1844_squashed_0011_auto_20160303_1929.py deleted file mode 100644 index 8d86cbbc1b..0000000000 --- a/src/documents/migrations/0004_auto_20160114_1844_squashed_0011_auto_20160303_1929.py +++ /dev/null @@ -1,178 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 17:52 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - replaces = [ - ("documents", "0004_auto_20160114_1844"), - ("documents", "0005_auto_20160123_0313"), - ("documents", "0006_auto_20160123_0430"), - ("documents", "0007_auto_20160126_2114"), - ("documents", "0008_document_file_type"), - ("documents", "0009_auto_20160214_0040"), - ("documents", "0010_log"), - ("documents", "0011_auto_20160303_1929"), - ] - - dependencies = [ - ("documents", "0003_sender"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="sender", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documents", - to="documents.sender", - ), - ), - migrations.AlterModelOptions( - name="sender", - options={"ordering": ("name",)}, - ), - migrations.CreateModel( - name="Tag", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128, unique=True)), - ("slug", models.SlugField(blank=True)), - ( - "colour", - models.PositiveIntegerField( - choices=[ - (1, "#a6cee3"), - (2, "#1f78b4"), - (3, "#b2df8a"), - (4, "#33a02c"), - (5, "#fb9a99"), - (6, "#e31a1c"), - (7, "#fdbf6f"), - (8, "#ff7f00"), - (9, "#cab2d6"), - (10, "#6a3d9a"), - (11, "#b15928"), - (12, "#000000"), - (13, "#cccccc"), - ], - default=1, - ), - ), - ("match", models.CharField(blank=True, max_length=256)), - ( - "matching_algorithm", - models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.', - ), - ), - ], - options={ - "abstract": False, - }, - ), - migrations.AlterField( - model_name="sender", - name="slug", - field=models.SlugField(blank=True), - ), - migrations.AddField( - model_name="document", - name="file_type", - field=models.CharField( - choices=[ - ("pdf", "PDF"), - ("png", "PNG"), - ("jpg", "JPG"), - ("gif", "GIF"), - ("tiff", "TIFF"), - ], - default="pdf", - editable=False, - max_length=4, - ), - preserve_default=False, - ), - migrations.AddField( - model_name="document", - name="tags", - field=models.ManyToManyField( - blank=True, - related_name="documents", - to="documents.tag", - ), - ), - migrations.CreateModel( - name="Log", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("group", models.UUIDField(blank=True)), - ("message", models.TextField()), - ( - "level", - models.PositiveIntegerField( - choices=[ - (10, "Debugging"), - (20, "Informational"), - (30, "Warning"), - (40, "Error"), - (50, "Critical"), - ], - default=20, - ), - ), - ( - "component", - models.PositiveIntegerField( - choices=[(1, "Consumer"), (2, "Mail Fetcher")], - ), - ), - ("created", models.DateTimeField(auto_now_add=True)), - ("modified", models.DateTimeField(auto_now=True)), - ], - options={ - "ordering": ("-modified",), - }, - ), - migrations.RenameModel( - old_name="Sender", - new_name="Correspondent", - ), - migrations.AlterModelOptions( - name="document", - options={"ordering": ("correspondent", "title")}, - ), - migrations.RenameField( - model_name="document", - old_name="sender", - new_name="correspondent", - ), - ] diff --git a/src/documents/migrations/0004_workflowtrigger_filter_has_any_correspondents_and_more.py b/src/documents/migrations/0004_workflowtrigger_filter_has_any_correspondents_and_more.py new file mode 100644 index 0000000000..217328eb1e --- /dev/null +++ b/src/documents/migrations/0004_workflowtrigger_filter_has_any_correspondents_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 5.2.7 on 2025-12-17 22:25 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0003_remove_document_storage_type"), + ] + + operations = [ + migrations.AddField( + model_name="workflowtrigger", + name="filter_has_any_correspondents", + field=models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_any_correspondent", + to="documents.correspondent", + verbose_name="has one of these correspondents", + ), + ), + migrations.AddField( + model_name="workflowtrigger", + name="filter_has_any_document_types", + field=models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_any_document_type", + to="documents.documenttype", + verbose_name="has one of these document types", + ), + ), + migrations.AddField( + model_name="workflowtrigger", + name="filter_has_any_storage_paths", + field=models.ManyToManyField( + blank=True, + related_name="workflowtriggers_has_any_storage_path", + to="documents.storagepath", + verbose_name="has one of these storage paths", + ), + ), + ] diff --git a/src/documents/migrations/0005_alter_document_checksum_unique.py b/src/documents/migrations/0005_alter_document_checksum_unique.py new file mode 100644 index 0000000000..7a35cbb6df --- /dev/null +++ b/src/documents/migrations/0005_alter_document_checksum_unique.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.7 on 2026-01-14 17:45 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0004_workflowtrigger_filter_has_any_correspondents_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="document", + name="checksum", + field=models.CharField( + editable=False, + max_length=32, + verbose_name="checksum", + help_text="The checksum of the original document.", + ), + ), + ] diff --git a/src/documents/migrations/0005_auto_20160123_0313.py b/src/documents/migrations/0005_auto_20160123_0313.py deleted file mode 100644 index b0ccc58250..0000000000 --- a/src/documents/migrations/0005_auto_20160123_0313.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 1.9 on 2016-01-23 03:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0004_auto_20160114_1844"), - ] - - operations = [ - migrations.AlterModelOptions( - name="sender", - options={"ordering": ("name",)}, - ), - ] diff --git a/src/documents/migrations/0006_auto_20160123_0430.py b/src/documents/migrations/0006_auto_20160123_0430.py deleted file mode 100644 index 315b9646f3..0000000000 --- a/src/documents/migrations/0006_auto_20160123_0430.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 1.9 on 2016-01-23 04:30 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0005_auto_20160123_0313"), - ] - - operations = [ - migrations.CreateModel( - name="Tag", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128, unique=True)), - ("slug", models.SlugField(blank=True)), - ( - "colour", - models.PositiveIntegerField( - choices=[ - (1, "#a6cee3"), - (2, "#1f78b4"), - (3, "#b2df8a"), - (4, "#33a02c"), - (5, "#fb9a99"), - (6, "#e31a1c"), - (7, "#fdbf6f"), - (8, "#ff7f00"), - (9, "#cab2d6"), - (10, "#6a3d9a"), - (11, "#ffff99"), - (12, "#b15928"), - (13, "#000000"), - (14, "#cccccc"), - ], - default=1, - ), - ), - ], - options={ - "abstract": False, - }, - ), - migrations.AlterField( - model_name="sender", - name="slug", - field=models.SlugField(blank=True), - ), - migrations.AddField( - model_name="document", - name="tags", - field=models.ManyToManyField(related_name="documents", to="documents.Tag"), - ), - ] diff --git a/src/documents/migrations/0006_document_content_length.py b/src/documents/migrations/0006_document_content_length.py new file mode 100644 index 0000000000..ccc8b86d3c --- /dev/null +++ b/src/documents/migrations/0006_document_content_length.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.6 on 2026-01-24 07:33 + +import django.db.models.functions.text +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0005_alter_document_checksum_unique"), + ] + + operations = [ + migrations.AddField( + model_name="document", + name="content_length", + field=models.GeneratedField( + db_persist=True, + expression=django.db.models.functions.text.Length("content"), + null=False, + help_text="Length of the content field in characters. Automatically maintained by the database for faster statistics computation.", + output_field=models.PositiveIntegerField(default=0), + ), + ), + ] diff --git a/src/documents/migrations/0007_auto_20160126_2114.py b/src/documents/migrations/0007_auto_20160126_2114.py deleted file mode 100644 index 04ccc05893..0000000000 --- a/src/documents/migrations/0007_auto_20160126_2114.py +++ /dev/null @@ -1,55 +0,0 @@ -# Generated by Django 1.9 on 2016-01-26 21:14 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0006_auto_20160123_0430"), - ] - - operations = [ - migrations.AddField( - model_name="tag", - name="match", - field=models.CharField(blank=True, max_length=256), - ), - migrations.AddField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - blank=True, - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - ], - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.', - null=True, - ), - ), - migrations.AlterField( - model_name="tag", - name="colour", - field=models.PositiveIntegerField( - choices=[ - (1, "#a6cee3"), - (2, "#1f78b4"), - (3, "#b2df8a"), - (4, "#33a02c"), - (5, "#fb9a99"), - (6, "#e31a1c"), - (7, "#fdbf6f"), - (8, "#ff7f00"), - (9, "#cab2d6"), - (10, "#6a3d9a"), - (11, "#b15928"), - (12, "#000000"), - (13, "#cccccc"), - ], - default=1, - ), - ), - ] diff --git a/src/documents/migrations/0007_sharelinkbundle.py b/src/documents/migrations/0007_sharelinkbundle.py new file mode 100644 index 0000000000..b7c3b72230 --- /dev/null +++ b/src/documents/migrations/0007_sharelinkbundle.py @@ -0,0 +1,177 @@ +# Generated by Django 5.2.9 on 2026-01-27 01:09 + +import django.db.models.deletion +import django.db.models.functions.text +import django.utils.timezone +from django.conf import settings +from django.contrib.auth.management import create_permissions +from django.contrib.auth.models import Group +from django.contrib.auth.models import Permission +from django.contrib.auth.models import User +from django.db import migrations +from django.db import models + + +def grant_share_link_bundle_permissions(apps, schema_editor): + # Ensure newly introduced permissions are created for all apps + for app_config in apps.get_app_configs(): + app_config.models_module = True + create_permissions(app_config, apps=apps, verbosity=0) + app_config.models_module = None + + add_document_perm = Permission.objects.filter(codename="add_document").first() + share_bundle_permissions = Permission.objects.filter( + codename__contains="sharelinkbundle", + ) + + users = User.objects.filter(user_permissions=add_document_perm).distinct() + for user in users: + user.user_permissions.add(*share_bundle_permissions) + + groups = Group.objects.filter(permissions=add_document_perm).distinct() + for group in groups: + group.permissions.add(*share_bundle_permissions) + + +def revoke_share_link_bundle_permissions(apps, schema_editor): + share_bundle_permissions = Permission.objects.filter( + codename__contains="sharelinkbundle", + ) + for user in User.objects.all(): + user.user_permissions.remove(*share_bundle_permissions) + for group in Group.objects.all(): + group.permissions.remove(*share_bundle_permissions) + + +class Migration(migrations.Migration): + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("documents", "0006_document_content_length"), + ] + + operations = [ + migrations.CreateModel( + name="ShareLinkBundle", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created", + models.DateTimeField( + blank=True, + db_index=True, + default=django.utils.timezone.now, + editable=False, + verbose_name="created", + ), + ), + ( + "expiration", + models.DateTimeField( + blank=True, + db_index=True, + null=True, + verbose_name="expiration", + ), + ), + ( + "slug", + models.SlugField( + blank=True, + editable=False, + unique=True, + verbose_name="slug", + ), + ), + ( + "file_version", + models.CharField( + choices=[("archive", "Archive"), ("original", "Original")], + default="archive", + max_length=50, + ), + ), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("processing", "Processing"), + ("ready", "Ready"), + ("failed", "Failed"), + ], + default="pending", + max_length=50, + ), + ), + ( + "size_bytes", + models.PositiveIntegerField( + blank=True, + null=True, + verbose_name="size (bytes)", + ), + ), + ( + "last_error", + models.JSONField( + blank=True, + null=True, + default=None, + verbose_name="last error", + ), + ), + ( + "file_path", + models.CharField( + blank=True, + max_length=512, + verbose_name="file path", + ), + ), + ( + "built_at", + models.DateTimeField( + blank=True, + null=True, + verbose_name="built at", + ), + ), + ( + "documents", + models.ManyToManyField( + related_name="share_link_bundles", + to="documents.document", + verbose_name="documents", + ), + ), + ( + "owner", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="share_link_bundles", + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ], + options={ + "ordering": ("-created",), + "verbose_name": "share link bundle", + "verbose_name_plural": "share link bundles", + }, + ), + migrations.RunPython( + grant_share_link_bundle_permissions, + reverse_code=revoke_share_link_bundle_permissions, + ), + ] diff --git a/src/documents/migrations/0008_document_file_type.py b/src/documents/migrations/0008_document_file_type.py deleted file mode 100644 index 7787f86225..0000000000 --- a/src/documents/migrations/0008_document_file_type.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 1.9 on 2016-01-29 22:58 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0007_auto_20160126_2114"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="file_type", - field=models.CharField( - choices=[ - ("pdf", "PDF"), - ("png", "PNG"), - ("jpg", "JPG"), - ("gif", "GIF"), - ("tiff", "TIFF"), - ], - default="pdf", - editable=False, - max_length=4, - ), - preserve_default=False, - ), - migrations.AlterField( - model_name="document", - name="tags", - field=models.ManyToManyField( - blank=True, - related_name="documents", - to="documents.Tag", - ), - ), - ] diff --git a/src/documents/migrations/0008_workflowaction_passwords_alter_workflowaction_type.py b/src/documents/migrations/0008_workflowaction_passwords_alter_workflowaction_type.py new file mode 100644 index 0000000000..c2f241086b --- /dev/null +++ b/src/documents/migrations/0008_workflowaction_passwords_alter_workflowaction_type.py @@ -0,0 +1,38 @@ +# Generated by Django 5.2.7 on 2025-12-29 03:56 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0007_sharelinkbundle"), + ] + + operations = [ + migrations.AddField( + model_name="workflowaction", + name="passwords", + field=models.JSONField( + blank=True, + help_text="Passwords to try when removing PDF protection. Separate with commas or new lines.", + null=True, + verbose_name="passwords", + ), + ), + migrations.AlterField( + model_name="workflowaction", + name="type", + field=models.PositiveIntegerField( + choices=[ + (1, "Assignment"), + (2, "Removal"), + (3, "Email"), + (4, "Webhook"), + (5, "Password removal"), + ], + default=1, + verbose_name="Workflow Action Type", + ), + ), + ] diff --git a/src/documents/migrations/0009_alter_document_content_length.py b/src/documents/migrations/0009_alter_document_content_length.py new file mode 100644 index 0000000000..4210426e41 --- /dev/null +++ b/src/documents/migrations/0009_alter_document_content_length.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.11 on 2026-02-07 19:06 + +import django.db.models.functions.text +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0008_workflowaction_passwords_alter_workflowaction_type"), + ] + + operations = [ + migrations.AlterField( + model_name="document", + name="content_length", + field=models.GeneratedField( + db_persist=True, + expression=django.db.models.functions.text.Length("content"), + help_text="Length of the content field in characters. Automatically maintained by the database for faster statistics computation.", + output_field=models.PositiveIntegerField(default=0), + serialize=False, + ), + ), + ] diff --git a/src/documents/migrations/0009_auto_20160214_0040.py b/src/documents/migrations/0009_auto_20160214_0040.py deleted file mode 100644 index 5c95e10351..0000000000 --- a/src/documents/migrations/0009_auto_20160214_0040.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 1.9 on 2016-02-14 00:40 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0008_document_file_type"), - ] - - operations = [ - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.', - ), - ), - ] diff --git a/src/documents/migrations/0010_log.py b/src/documents/migrations/0010_log.py deleted file mode 100644 index 8f015cab06..0000000000 --- a/src/documents/migrations/0010_log.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 1.9 on 2016-02-27 17:54 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0009_auto_20160214_0040"), - ] - - operations = [ - migrations.CreateModel( - name="Log", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("group", models.UUIDField(blank=True)), - ("message", models.TextField()), - ( - "level", - models.PositiveIntegerField( - choices=[ - (10, "Debugging"), - (20, "Informational"), - (30, "Warning"), - (40, "Error"), - (50, "Critical"), - ], - default=20, - ), - ), - ( - "component", - models.PositiveIntegerField( - choices=[(1, "Consumer"), (2, "Mail Fetcher")], - ), - ), - ("created", models.DateTimeField(auto_now_add=True)), - ("modified", models.DateTimeField(auto_now=True)), - ], - options={ - "ordering": ("-modified",), - }, - ), - ] diff --git a/src/documents/migrations/0010_optimize_integer_field_sizes.py b/src/documents/migrations/0010_optimize_integer_field_sizes.py new file mode 100644 index 0000000000..15aadadc37 --- /dev/null +++ b/src/documents/migrations/0010_optimize_integer_field_sizes.py @@ -0,0 +1,227 @@ +# Generated by Django 5.2.11 on 2026-02-09 16:37 + +import django.core.validators +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0009_alter_document_content_length"), + ] + + operations = [ + migrations.AlterField( + model_name="correspondent", + name="matching_algorithm", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + migrations.AlterField( + model_name="documenttype", + name="matching_algorithm", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + migrations.AlterField( + model_name="savedviewfilterrule", + name="rule_type", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "title contains"), + (1, "content contains"), + (2, "ASN is"), + (3, "correspondent is"), + (4, "document type is"), + (5, "is in inbox"), + (6, "has tag"), + (7, "has any tag"), + (8, "created before"), + (9, "created after"), + (10, "created year is"), + (11, "created month is"), + (12, "created day is"), + (13, "added before"), + (14, "added after"), + (15, "modified before"), + (16, "modified after"), + (17, "does not have tag"), + (18, "does not have ASN"), + (19, "title or content contains"), + (20, "fulltext query"), + (21, "more like this"), + (22, "has tags in"), + (23, "ASN greater than"), + (24, "ASN less than"), + (25, "storage path is"), + (26, "has correspondent in"), + (27, "does not have correspondent in"), + (28, "has document type in"), + (29, "does not have document type in"), + (30, "has storage path in"), + (31, "does not have storage path in"), + (32, "owner is"), + (33, "has owner in"), + (34, "does not have owner"), + (35, "does not have owner in"), + (36, "has custom field value"), + (37, "is shared by me"), + (38, "has custom fields"), + (39, "has custom field in"), + (40, "does not have custom field in"), + (41, "does not have custom field"), + (42, "custom fields query"), + (43, "created to"), + (44, "created from"), + (45, "added to"), + (46, "added from"), + (47, "mime type is"), + ], + verbose_name="rule type", + ), + ), + migrations.AlterField( + model_name="storagepath", + name="matching_algorithm", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + migrations.AlterField( + model_name="tag", + name="matching_algorithm", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + (6, "Automatic"), + ], + default=1, + verbose_name="matching algorithm", + ), + ), + migrations.AlterField( + model_name="workflow", + name="order", + field=models.SmallIntegerField(default=0, verbose_name="order"), + ), + migrations.AlterField( + model_name="workflowaction", + name="order", + field=models.PositiveSmallIntegerField(default=0, verbose_name="order"), + ), + migrations.AlterField( + model_name="workflowaction", + name="type", + field=models.PositiveSmallIntegerField( + choices=[ + (1, "Assignment"), + (2, "Removal"), + (3, "Email"), + (4, "Webhook"), + (5, "Password removal"), + ], + default=1, + verbose_name="Workflow Action Type", + ), + ), + migrations.AlterField( + model_name="workflowrun", + name="type", + field=models.PositiveSmallIntegerField( + choices=[ + (1, "Consumption Started"), + (2, "Document Added"), + (3, "Document Updated"), + (4, "Scheduled"), + ], + null=True, + verbose_name="workflow trigger type", + ), + ), + migrations.AlterField( + model_name="workflowtrigger", + name="matching_algorithm", + field=models.PositiveSmallIntegerField( + choices=[ + (0, "None"), + (1, "Any word"), + (2, "All words"), + (3, "Exact match"), + (4, "Regular expression"), + (5, "Fuzzy word"), + ], + default=0, + verbose_name="matching algorithm", + ), + ), + migrations.AlterField( + model_name="workflowtrigger", + name="schedule_offset_days", + field=models.SmallIntegerField( + default=0, + help_text="The number of days to offset the schedule trigger by.", + verbose_name="schedule offset days", + ), + ), + migrations.AlterField( + model_name="workflowtrigger", + name="schedule_recurring_interval_days", + field=models.PositiveSmallIntegerField( + default=1, + help_text="The number of days between recurring schedule triggers.", + validators=[django.core.validators.MinValueValidator(1)], + verbose_name="schedule recurring delay in days", + ), + ), + migrations.AlterField( + model_name="workflowtrigger", + name="type", + field=models.PositiveSmallIntegerField( + choices=[ + (1, "Consumption Started"), + (2, "Document Added"), + (3, "Document Updated"), + (4, "Scheduled"), + ], + default=1, + verbose_name="Workflow Trigger Type", + ), + ), + ] diff --git a/src/documents/migrations/0011_alter_workflowaction_type.py b/src/documents/migrations/0011_alter_workflowaction_type.py new file mode 100644 index 0000000000..c31f4241ca --- /dev/null +++ b/src/documents/migrations/0011_alter_workflowaction_type.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2.11 on 2026-02-14 19:19 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0010_optimize_integer_field_sizes"), + ] + + operations = [ + migrations.AlterField( + model_name="workflowaction", + name="type", + field=models.PositiveSmallIntegerField( + choices=[ + (1, "Assignment"), + (2, "Removal"), + (3, "Email"), + (4, "Webhook"), + (5, "Password removal"), + (6, "Move to trash"), + ], + default=1, + verbose_name="Workflow Action Type", + ), + ), + ] diff --git a/src/documents/migrations/0011_auto_20160303_1929.py b/src/documents/migrations/0011_auto_20160303_1929.py deleted file mode 100644 index 4c4fcd3adb..0000000000 --- a/src/documents/migrations/0011_auto_20160303_1929.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 1.9.2 on 2016-03-03 19:29 - -from django.db import migrations - - -class Migration(migrations.Migration): - atomic = False - dependencies = [ - ("documents", "0010_log"), - ] - - operations = [ - migrations.RenameModel( - old_name="Sender", - new_name="Correspondent", - ), - migrations.AlterModelOptions( - name="document", - options={"ordering": ("correspondent", "title")}, - ), - migrations.RenameField( - model_name="document", - old_name="sender", - new_name="correspondent", - ), - ] diff --git a/src/documents/migrations/0012_auto_20160305_0040.py b/src/documents/migrations/0012_auto_20160305_0040.py deleted file mode 100644 index 097661137d..0000000000 --- a/src/documents/migrations/0012_auto_20160305_0040.py +++ /dev/null @@ -1,128 +0,0 @@ -# Generated by Django 1.9.2 on 2016-03-05 00:40 - -import os -import re -import shutil -import subprocess -import tempfile -from pathlib import Path - -import gnupg -from django.conf import settings -from django.db import migrations -from django.utils.termcolors import colorize as colourise # Spelling hurts me - - -class GnuPG: - """ - A handy singleton to use when handling encrypted files. - """ - - gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) - - @classmethod - def decrypted(cls, file_handle): - return cls.gpg.decrypt_file(file_handle, passphrase=settings.PASSPHRASE).data - - @classmethod - def encrypted(cls, file_handle): - return cls.gpg.encrypt_file( - file_handle, - recipients=None, - passphrase=settings.PASSPHRASE, - symmetric=True, - ).data - - -def move_documents_and_create_thumbnails(apps, schema_editor): - (Path(settings.MEDIA_ROOT) / "documents" / "originals").mkdir( - parents=True, - exist_ok=True, - ) - (Path(settings.MEDIA_ROOT) / "documents" / "thumbnails").mkdir( - parents=True, - exist_ok=True, - ) - - documents: list[str] = os.listdir(Path(settings.MEDIA_ROOT) / "documents") # noqa: PTH208 - - if set(documents) == {"originals", "thumbnails"}: - return - - print( - colourise( - "\n\n" - " This is a one-time only migration to generate thumbnails for all of your\n" - " documents so that future UIs will have something to work with. If you have\n" - " a lot of documents though, this may take a while, so a coffee break may be\n" - " in order." - "\n", - opts=("bold",), - ), - ) - - Path(settings.SCRATCH_DIR).mkdir(parents=True, exist_ok=True) - - for f in sorted(documents): - if not f.endswith("gpg"): - continue - - print( - " {} {} {}".format( - colourise("*", fg="green"), - colourise("Generating a thumbnail for", fg="white"), - colourise(f, fg="cyan"), - ), - ) - - thumb_temp: str = tempfile.mkdtemp(prefix="paperless", dir=settings.SCRATCH_DIR) - orig_temp: str = tempfile.mkdtemp(prefix="paperless", dir=settings.SCRATCH_DIR) - - orig_source: Path = Path(settings.MEDIA_ROOT) / "documents" / f - orig_target: Path = Path(orig_temp) / f.replace(".gpg", "") - - with orig_source.open("rb") as encrypted, orig_target.open("wb") as unencrypted: - unencrypted.write(GnuPG.decrypted(encrypted)) - - subprocess.Popen( - ( - settings.CONVERT_BINARY, - "-scale", - "500x5000", - "-alpha", - "remove", - orig_target, - Path(thumb_temp) / "convert-%04d.png", - ), - ).wait() - - thumb_source: Path = Path(thumb_temp) / "convert-0000.png" - thumb_target: Path = ( - Path(settings.MEDIA_ROOT) - / "documents" - / "thumbnails" - / re.sub(r"(\d+)\.\w+(\.gpg)", "\\1.png\\2", f) - ) - with ( - thumb_source.open("rb") as unencrypted, - thumb_target.open("wb") as encrypted, - ): - encrypted.write(GnuPG.encrypted(unencrypted)) - - shutil.rmtree(thumb_temp) - shutil.rmtree(orig_temp) - - shutil.move( - Path(settings.MEDIA_ROOT) / "documents" / f, - Path(settings.MEDIA_ROOT) / "documents" / "originals" / f, - ) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0011_auto_20160303_1929"), - ] - - operations = [ - migrations.RunPython(move_documents_and_create_thumbnails), - ] diff --git a/src/documents/migrations/0012_document_root_document.py b/src/documents/migrations/0012_document_root_document.py new file mode 100644 index 0000000000..c287be0dc0 --- /dev/null +++ b/src/documents/migrations/0012_document_root_document.py @@ -0,0 +1,37 @@ +# Generated by Django 5.1.6 on 2025-02-26 17:08 + +import django.db.models.deletion +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0011_alter_workflowaction_type"), + ] + + operations = [ + migrations.AddField( + model_name="document", + name="root_document", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="versions", + to="documents.document", + verbose_name="root document for this version", + ), + ), + migrations.AddField( + model_name="document", + name="version_label", + field=models.CharField( + blank=True, + help_text="Optional short label for a document version.", + max_length=64, + null=True, + verbose_name="version label", + ), + ), + ] diff --git a/src/documents/migrations/0013_alter_paperlesstask_task_name.py b/src/documents/migrations/0013_alter_paperlesstask_task_name.py new file mode 100644 index 0000000000..46882d5372 --- /dev/null +++ b/src/documents/migrations/0013_alter_paperlesstask_task_name.py @@ -0,0 +1,30 @@ +# Generated by Django 5.2.11 on 2026-03-03 16:42 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0012_document_root_document"), + ] + + operations = [ + migrations.AlterField( + model_name="paperlesstask", + name="task_name", + field=models.CharField( + choices=[ + ("consume_file", "Consume File"), + ("train_classifier", "Train Classifier"), + ("check_sanity", "Check Sanity"), + ("index_optimize", "Index Optimize"), + ("llmindex_update", "LLM Index Update"), + ], + help_text="Name of the task that was run", + max_length=255, + null=True, + verbose_name="Task Name", + ), + ), + ] diff --git a/src/documents/migrations/0013_auto_20160325_2111.py b/src/documents/migrations/0013_auto_20160325_2111.py deleted file mode 100644 index 1d3f8b07df..0000000000 --- a/src/documents/migrations/0013_auto_20160325_2111.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 1.9.4 on 2016-03-25 21:11 - -import django.utils.timezone -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0012_auto_20160305_0040"), - ] - - operations = [ - migrations.AddField( - model_name="correspondent", - name="match", - field=models.CharField(blank=True, max_length=256), - ), - migrations.AddField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. If you don\'t know what a regex is, you probably don\'t want this option.', - ), - ), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.RemoveField( - model_name="log", - name="component", - ), - ] diff --git a/src/documents/migrations/0014_document_checksum.py b/src/documents/migrations/0014_document_checksum.py deleted file mode 100644 index de256ced7b..0000000000 --- a/src/documents/migrations/0014_document_checksum.py +++ /dev/null @@ -1,182 +0,0 @@ -# Generated by Django 1.9.4 on 2016-03-28 19:09 - -import hashlib -from pathlib import Path - -import django.utils.timezone -import gnupg -from django.conf import settings -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 - - -class GnuPG: - """ - A handy singleton to use when handling encrypted files. - """ - - gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) - - @classmethod - def decrypted(cls, file_handle): - return cls.gpg.decrypt_file(file_handle, passphrase=settings.PASSPHRASE).data - - @classmethod - def encrypted(cls, file_handle): - return cls.gpg.encrypt_file( - file_handle, - recipients=None, - passphrase=settings.PASSPHRASE, - symmetric=True, - ).data - - -class Document: - """ - Django's migrations restrict access to model methods, so this is a snapshot - of the methods that existed at the time this migration was written, since - we need to make use of a lot of these shortcuts here. - """ - - def __init__(self, doc): - self.pk = doc.pk - self.correspondent = doc.correspondent - self.title = doc.title - self.file_type = doc.file_type - self.tags = doc.tags - self.created = doc.created - - def __str__(self): - created = self.created.strftime("%Y%m%d%H%M%S") - if self.correspondent and self.title: - return f"{created}: {self.correspondent} - {self.title}" - if self.correspondent or self.title: - return f"{created}: {self.correspondent or self.title}" - return str(created) - - @property - def source_path(self): - return ( - Path(settings.MEDIA_ROOT) - / "documents" - / "originals" - / f"{self.pk:07}.{self.file_type}.gpg" - ) - - @property - def source_file(self): - return self.source_path.open("rb") - - @property - def file_name(self): - return slugify(str(self)) + "." + self.file_type - - -def set_checksums(apps, schema_editor): - document_model = apps.get_model("documents", "Document") - - if not document_model.objects.all().exists(): - return - - print( - colourise( - "\n\n" - " This is a one-time only migration to generate checksums for all\n" - " of your existing documents. If you have a lot of documents\n" - " though, this may take a while, so a coffee break may be in\n" - " order." - "\n", - opts=("bold",), - ), - ) - - sums = {} - for d in document_model.objects.all(): - document = Document(d) - - print( - " {} {} {}".format( - colourise("*", fg="green"), - colourise("Generating a checksum for", fg="white"), - colourise(document.file_name, fg="cyan"), - ), - ) - - with document.source_file as encrypted: - checksum = hashlib.md5(GnuPG.decrypted(encrypted)).hexdigest() - - if checksum in sums: - error = "\n{line}{p1}\n\n{doc1}\n{doc2}\n\n{p2}\n\n{code}\n\n{p3}{line}".format( - p1=colourise( - "It appears that you have two identical documents in your collection and \nPaperless no longer supports this (see issue #97). The documents in question\nare:", - fg="yellow", - ), - p2=colourise( - "To fix this problem, you'll have to remove one of them from the database, a task\nmost easily done by running the following command in the same\ndirectory as manage.py:", - fg="yellow", - ), - p3=colourise( - "When that's finished, re-run the migrate, and provided that there aren't any\nother duplicates, you should be good to go.", - fg="yellow", - ), - doc1=colourise( - f" * {sums[checksum][1]} (id: {sums[checksum][0]})", - fg="red", - ), - doc2=colourise( - f" * {document.file_name} (id: {document.pk})", - fg="red", - ), - code=colourise( - f" $ echo 'DELETE FROM documents_document WHERE id = {document.pk};' | ./manage.py dbshell", - fg="green", - ), - line=colourise("\n{}\n".format("=" * 80), fg="white", opts=("bold",)), - ) - raise RuntimeError(error) - sums[checksum] = (document.pk, document.file_name) - - document_model.objects.filter(pk=document.pk).update(checksum=checksum) - - -def do_nothing(apps, schema_editor): - pass - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0013_auto_20160325_2111"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="checksum", - field=models.CharField( - default="-", - db_index=True, - editable=False, - max_length=32, - help_text="The checksum of the original document (before it " - "was encrypted). We use this to prevent duplicate " - "document imports.", - ), - preserve_default=False, - ), - migrations.RunPython(set_checksums, do_nothing), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - ), - ), - migrations.AlterField( - model_name="document", - name="modified", - field=models.DateTimeField(auto_now=True, db_index=True), - ), - ] diff --git a/src/documents/migrations/0014_savedview_visibility_to_ui_settings.py b/src/documents/migrations/0014_savedview_visibility_to_ui_settings.py new file mode 100644 index 0000000000..2a91923f3c --- /dev/null +++ b/src/documents/migrations/0014_savedview_visibility_to_ui_settings.py @@ -0,0 +1,153 @@ +# Generated by Django 5.2.11 on 2026-02-20 22:05 + +from collections import defaultdict + +from django.db import migrations +from django.db import models + +# from src-ui/src/app/data/ui-settings.ts +SAVED_VIEWS_KEY = "saved_views" +DASHBOARD_VIEWS_VISIBLE_IDS_KEY = "dashboard_views_visible_ids" +SIDEBAR_VIEWS_VISIBLE_IDS_KEY = "sidebar_views_visible_ids" + + +def _parse_visible_ids(raw_value) -> set[int]: + """Return integer SavedView IDs parsed from a JSON list value.""" + if not isinstance(raw_value, list): + return set() + + parsed_ids = set() + for raw_id in raw_value: + raw_id_string = str(raw_id) + if raw_id_string.isdigit(): + parsed_ids.add(int(raw_id_string)) + return parsed_ids + + +def _set_default_visibility_ids(apps, schema_editor): + """ + Move SavedView visibility from boolean model props into JSON UiSettings.settings.saved_views, specifically: + settings.saved_views.dashboard_views_visible_ids + settings.saved_views.sidebar_views_visible_ids + """ + SavedView = apps.get_model("documents", "SavedView") + UiSettings = apps.get_model("documents", "UiSettings") + User = apps.get_model("auth", "User") + + dashboard_visible_ids_by_owner: defaultdict[int, list[int]] = defaultdict(list) + for owner_id, view_id in SavedView.objects.filter( + owner__isnull=False, + show_on_dashboard=True, + ).values_list("owner_id", "id"): + dashboard_visible_ids_by_owner[owner_id].append(view_id) + + sidebar_visible_ids_by_owner: defaultdict[int, list[int]] = defaultdict(list) + for owner_id, view_id in SavedView.objects.filter( + owner__isnull=False, + show_in_sidebar=True, + ).values_list("owner_id", "id"): + sidebar_visible_ids_by_owner[owner_id].append(view_id) + + for user in User.objects.all(): + ui_settings, _ = UiSettings.objects.get_or_create( + user=user, + defaults={"settings": {}}, + ) + current_settings = ui_settings.settings + if not isinstance(current_settings, dict): + current_settings = {} + + changed = False + saved_views_settings = current_settings.get(SAVED_VIEWS_KEY) + if not isinstance(saved_views_settings, dict): + saved_views_settings = {} + changed = True + + if saved_views_settings.get(DASHBOARD_VIEWS_VISIBLE_IDS_KEY) is None: + saved_views_settings[DASHBOARD_VIEWS_VISIBLE_IDS_KEY] = ( + dashboard_visible_ids_by_owner.get(user.id, []) + ) + changed = True + + if saved_views_settings.get(SIDEBAR_VIEWS_VISIBLE_IDS_KEY) is None: + saved_views_settings[SIDEBAR_VIEWS_VISIBLE_IDS_KEY] = ( + sidebar_visible_ids_by_owner.get(user.id, []) + ) + changed = True + + current_settings[SAVED_VIEWS_KEY] = saved_views_settings + + if changed: + ui_settings.settings = current_settings + ui_settings.save(update_fields=["settings"]) + + +def _restore_visibility_fields(apps, schema_editor): + SavedView = apps.get_model("documents", "SavedView") + UiSettings = apps.get_model("documents", "UiSettings") + + dashboard_visible_ids_by_owner: dict[int, set[int]] = {} + sidebar_visible_ids_by_owner: dict[int, set[int]] = {} + for ui_settings in UiSettings.objects.all(): + current_settings = ui_settings.settings + if not isinstance(current_settings, dict): + continue + saved_views_settings = current_settings.get(SAVED_VIEWS_KEY) + if not isinstance(saved_views_settings, dict): + saved_views_settings = {} + + dashboard_visible_ids_by_owner[ui_settings.user_id] = _parse_visible_ids( + saved_views_settings.get(DASHBOARD_VIEWS_VISIBLE_IDS_KEY), + ) + + sidebar_visible_ids_by_owner[ui_settings.user_id] = _parse_visible_ids( + saved_views_settings.get(SIDEBAR_VIEWS_VISIBLE_IDS_KEY), + ) + + SavedView.objects.update(show_on_dashboard=False, show_in_sidebar=False) + for owner_id, dashboard_visible_ids in dashboard_visible_ids_by_owner.items(): + if not dashboard_visible_ids: + continue + SavedView.objects.filter( + owner_id=owner_id, + id__in=dashboard_visible_ids, + ).update( + show_on_dashboard=True, + ) + for owner_id, sidebar_visible_ids in sidebar_visible_ids_by_owner.items(): + if not sidebar_visible_ids: + continue + SavedView.objects.filter(owner_id=owner_id, id__in=sidebar_visible_ids).update( + show_in_sidebar=True, + ) + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0013_alter_paperlesstask_task_name"), + ] + + operations = [ + migrations.AlterField( + model_name="savedview", + name="show_on_dashboard", + field=models.BooleanField(default=False, verbose_name="show on dashboard"), + ), + migrations.AlterField( + model_name="savedview", + name="show_in_sidebar", + field=models.BooleanField(default=False, verbose_name="show in sidebar"), + ), + migrations.RunPython( + _set_default_visibility_ids, + reverse_code=_restore_visibility_fields, + ), + migrations.RemoveField( + model_name="savedview", + name="show_on_dashboard", + ), + migrations.RemoveField( + model_name="savedview", + name="show_in_sidebar", + ), + ] diff --git a/src/documents/migrations/0015_add_insensitive_to_match.py b/src/documents/migrations/0015_add_insensitive_to_match.py deleted file mode 100644 index 0761cc9290..0000000000 --- a/src/documents/migrations/0015_add_insensitive_to_match.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 1.10.2 on 2016-10-05 21:38 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0014_document_checksum"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="checksum", - field=models.CharField( - editable=False, - help_text="The checksum of the original document (before it was encrypted). We use this to prevent duplicate document imports.", - max_length=32, - unique=True, - ), - ), - migrations.AddField( - model_name="correspondent", - name="is_insensitive", - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name="tag", - name="is_insensitive", - field=models.BooleanField(default=True), - ), - ] diff --git a/src/documents/migrations/0015_add_insensitive_to_match_squashed_0018_auto_20170715_1712.py b/src/documents/migrations/0015_add_insensitive_to_match_squashed_0018_auto_20170715_1712.py deleted file mode 100644 index bfa8976012..0000000000 --- a/src/documents/migrations/0015_add_insensitive_to_match_squashed_0018_auto_20170715_1712.py +++ /dev/null @@ -1,92 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 17:57 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - replaces = [ - ("documents", "0015_add_insensitive_to_match"), - ("documents", "0016_auto_20170325_1558"), - ("documents", "0017_auto_20170512_0507"), - ("documents", "0018_auto_20170715_1712"), - ] - - dependencies = [ - ("documents", "0014_document_checksum"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="checksum", - field=models.CharField( - editable=False, - help_text="The checksum of the original document (before it was encrypted). We use this to prevent duplicate document imports.", - max_length=32, - unique=True, - ), - ), - migrations.AddField( - model_name="correspondent", - name="is_insensitive", - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name="tag", - name="is_insensitive", - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name="document", - name="content", - field=models.TextField( - blank=True, - db_index=("mysql" not in settings.DATABASES["default"]["ENGINE"]), - help_text="The raw, text-only data of the document. This field is primarily used for searching.", - ), - ), - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - migrations.AlterField( - model_name="document", - name="correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.correspondent", - ), - ), - ] diff --git a/src/documents/migrations/0015_document_version_index_and_more.py b/src/documents/migrations/0015_document_version_index_and_more.py new file mode 100644 index 0000000000..5a817074c7 --- /dev/null +++ b/src/documents/migrations/0015_document_version_index_and_more.py @@ -0,0 +1,37 @@ +# Generated by Django 5.2.11 on 2026-03-02 17:48 + +from django.conf import settings +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "0014_savedview_visibility_to_ui_settings"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="document", + name="version_index", + field=models.PositiveIntegerField( + blank=True, + db_index=True, + help_text="Index of this version within the root document.", + null=True, + verbose_name="version index", + ), + ), + migrations.AddConstraint( + model_name="document", + constraint=models.UniqueConstraint( + condition=models.Q( + ("root_document__isnull", False), + ("version_index__isnull", False), + ), + fields=("root_document", "version_index"), + name="documents_document_root_version_index_uniq", + ), + ), + ] diff --git a/src/documents/migrations/0016_auto_20170325_1558.py b/src/documents/migrations/0016_auto_20170325_1558.py deleted file mode 100644 index 743097d0cd..0000000000 --- a/src/documents/migrations/0016_auto_20170325_1558.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 1.10.5 on 2017-03-25 15:58 - -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0015_add_insensitive_to_match"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="content", - field=models.TextField( - blank=True, - db_index=("mysql" not in settings.DATABASES["default"]["ENGINE"]), - help_text="The raw, text-only data of the document. This field is primarily used for searching.", - ), - ), - ] diff --git a/src/documents/migrations/0017_auto_20170512_0507.py b/src/documents/migrations/0017_auto_20170512_0507.py deleted file mode 100644 index b9477a06cc..0000000000 --- a/src/documents/migrations/0017_auto_20170512_0507.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 1.10.5 on 2017-05-12 05:07 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0016_auto_20170325_1558"), - ] - - operations = [ - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - ] diff --git a/src/documents/migrations/0018_auto_20170715_1712.py b/src/documents/migrations/0018_auto_20170715_1712.py deleted file mode 100644 index 838d79ddcd..0000000000 --- a/src/documents/migrations/0018_auto_20170715_1712.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 1.10.5 on 2017-07-15 17:12 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0017_auto_20170512_0507"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.Correspondent", - ), - ), - ] diff --git a/src/documents/migrations/0019_add_consumer_user.py b/src/documents/migrations/0019_add_consumer_user.py deleted file mode 100644 index b38d88538f..0000000000 --- a/src/documents/migrations/0019_add_consumer_user.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 1.10.5 on 2017-07-15 17:12 - -from django.contrib.auth.models import User -from django.db import migrations - - -def forwards_func(apps, schema_editor): - User.objects.create(username="consumer") - - -def reverse_func(apps, schema_editor): - User.objects.get(username="consumer").delete() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0018_auto_20170715_1712"), - ] - - operations = [ - migrations.RunPython(forwards_func, reverse_func), - ] diff --git a/src/documents/migrations/0020_document_added.py b/src/documents/migrations/0020_document_added.py deleted file mode 100644 index 34042eedf9..0000000000 --- a/src/documents/migrations/0020_document_added.py +++ /dev/null @@ -1,29 +0,0 @@ -import django.utils.timezone -from django.db import migrations -from django.db import models - - -def set_added_time_to_created_time(apps, schema_editor): - Document = apps.get_model("documents", "Document") - for doc in Document.objects.all(): - doc.added = doc.created - doc.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0019_add_consumer_user"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="added", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - editable=False, - ), - ), - migrations.RunPython(set_added_time_to_created_time), - ] diff --git a/src/documents/migrations/0021_document_storage_type.py b/src/documents/migrations/0021_document_storage_type.py deleted file mode 100644 index b35fe75edc..0000000000 --- a/src/documents/migrations/0021_document_storage_type.py +++ /dev/null @@ -1,41 +0,0 @@ -# Generated by Django 1.11.10 on 2018-02-04 13:07 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0020_document_added"), - ] - - operations = [ - # Add the field with the default GPG-encrypted value - migrations.AddField( - model_name="document", - name="storage_type", - field=models.CharField( - choices=[ - ("unencrypted", "Unencrypted"), - ("gpg", "Encrypted with GNU Privacy Guard"), - ], - default="gpg", - editable=False, - max_length=11, - ), - ), - # Now that the field is added, change the default to unencrypted - migrations.AlterField( - model_name="document", - name="storage_type", - field=models.CharField( - choices=[ - ("unencrypted", "Unencrypted"), - ("gpg", "Encrypted with GNU Privacy Guard"), - ], - default="unencrypted", - editable=False, - max_length=11, - ), - ), - ] diff --git a/src/documents/migrations/0022_auto_20181007_1420.py b/src/documents/migrations/0022_auto_20181007_1420.py deleted file mode 100644 index 02dfa6d2b7..0000000000 --- a/src/documents/migrations/0022_auto_20181007_1420.py +++ /dev/null @@ -1,61 +0,0 @@ -# Generated by Django 2.0.8 on 2018-10-07 14:20 - -from django.db import migrations -from django.db import models -from django.utils.text import slugify - - -def re_slug_all_the_things(apps, schema_editor): - """ - Rewrite all slug values to make sure they're actually slugs before we brand - them as uneditable. - """ - - Tag = apps.get_model("documents", "Tag") - Correspondent = apps.get_model("documents", "Correspondent") - - for klass in (Tag, Correspondent): - for instance in klass.objects.all(): - klass.objects.filter(pk=instance.pk).update(slug=slugify(instance.slug)) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0021_document_storage_type"), - ] - - operations = [ - migrations.AlterModelOptions( - name="tag", - options={"ordering": ("name",)}, - ), - migrations.AlterField( - model_name="correspondent", - name="slug", - field=models.SlugField(blank=True, editable=False), - ), - migrations.AlterField( - model_name="document", - name="file_type", - field=models.CharField( - choices=[ - ("pdf", "PDF"), - ("png", "PNG"), - ("jpg", "JPG"), - ("gif", "GIF"), - ("tiff", "TIFF"), - ("txt", "TXT"), - ("csv", "CSV"), - ("md", "MD"), - ], - editable=False, - max_length=4, - ), - ), - migrations.AlterField( - model_name="tag", - name="slug", - field=models.SlugField(blank=True, editable=False), - ), - migrations.RunPython(re_slug_all_the_things, migrations.RunPython.noop), - ] diff --git a/src/documents/migrations/0023_document_current_filename.py b/src/documents/migrations/0023_document_current_filename.py deleted file mode 100644 index 5f52e1c892..0000000000 --- a/src/documents/migrations/0023_document_current_filename.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 2.0.10 on 2019-04-26 18:57 - -from django.db import migrations -from django.db import models - - -def set_filename(apps, schema_editor): - Document = apps.get_model("documents", "Document") - for doc in Document.objects.all(): - file_name = f"{doc.pk:07}.{doc.file_type}" - if doc.storage_type == "gpg": - file_name += ".gpg" - - # Set filename - doc.filename = file_name - - # Save document - doc.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0022_auto_20181007_1420"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="filename", - field=models.FilePathField( - default=None, - null=True, - editable=False, - help_text="Current filename in storage", - max_length=256, - ), - ), - migrations.RunPython(set_filename), - ] diff --git a/src/documents/migrations/1000_update_paperless_all.py b/src/documents/migrations/1000_update_paperless_all.py deleted file mode 100644 index ae0d217f69..0000000000 --- a/src/documents/migrations/1000_update_paperless_all.py +++ /dev/null @@ -1,147 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-07 12:35 -import uuid - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -def logs_set_default_group(apps, schema_editor): - Log = apps.get_model("documents", "Log") - for log in Log.objects.all(): - if log.group is None: - log.group = uuid.uuid4() - log.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "0023_document_current_filename"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="archive_serial_number", - field=models.IntegerField( - blank=True, - db_index=True, - help_text="The position of this document in your physical document archive.", - null=True, - unique=True, - ), - ), - migrations.AddField( - model_name="tag", - name="is_inbox_tag", - field=models.BooleanField( - default=False, - help_text="Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags.", - ), - ), - migrations.CreateModel( - name="DocumentType", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128, unique=True)), - ("slug", models.SlugField(blank=True, editable=False)), - ("match", models.CharField(blank=True, max_length=256)), - ( - "matching_algorithm", - models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - (6, "Automatic Classification"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - ("is_insensitive", models.BooleanField(default=True)), - ], - options={ - "abstract": False, - "ordering": ("name",), - }, - ), - migrations.AddField( - model_name="document", - name="document_type", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.documenttype", - ), - ), - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - (6, "Automatic Classification"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any"), - (2, "All"), - (3, "Literal"), - (4, "Regular Expression"), - (5, "Fuzzy Match"), - (6, "Automatic Classification"), - ], - default=1, - help_text='Which algorithm you want to use when matching text to the OCR\'d PDF. Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided. A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF. (If you don\'t know what a regex is, you probably don\'t want this option.) Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', - ), - ), - migrations.AlterField( - model_name="document", - name="content", - field=models.TextField( - blank=True, - help_text="The raw, text-only data of the document. This field is primarily used for searching.", - ), - ), - migrations.AlterModelOptions( - name="log", - options={"ordering": ("-created",)}, - ), - migrations.RemoveField( - model_name="log", - name="modified", - ), - migrations.AlterField( - model_name="log", - name="group", - field=models.UUIDField(blank=True, null=True), - ), - migrations.RunPython( - code=django.db.migrations.operations.special.RunPython.noop, - reverse_code=logs_set_default_group, - ), - ] diff --git a/src/documents/migrations/1001_auto_20201109_1636.py b/src/documents/migrations/1001_auto_20201109_1636.py deleted file mode 100644 index 7477a118c8..0000000000 --- a/src/documents/migrations/1001_auto_20201109_1636.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-09 16:36 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1000_update_paperless_all"), - ] - - operations = [ - migrations.RunPython(migrations.RunPython.noop, migrations.RunPython.noop), - ] diff --git a/src/documents/migrations/1002_auto_20201111_1105.py b/src/documents/migrations/1002_auto_20201111_1105.py deleted file mode 100644 index 1835c4ca9d..0000000000 --- a/src/documents/migrations/1002_auto_20201111_1105.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-11 11:05 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1001_auto_20201109_1636"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="filename", - field=models.FilePathField( - default=None, - editable=False, - help_text="Current filename in storage", - max_length=1024, - null=True, - ), - ), - ] diff --git a/src/documents/migrations/1003_mime_types.py b/src/documents/migrations/1003_mime_types.py deleted file mode 100644 index 4c7ddb492a..0000000000 --- a/src/documents/migrations/1003_mime_types.py +++ /dev/null @@ -1,92 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-20 11:21 -from pathlib import Path - -import magic -from django.conf import settings -from django.db import migrations -from django.db import models - -from paperless.db import GnuPG - -STORAGE_TYPE_UNENCRYPTED = "unencrypted" -STORAGE_TYPE_GPG = "gpg" - - -def source_path(self) -> Path: - if self.filename: - fname: str = str(self.filename) - else: - fname = f"{self.pk:07}.{self.file_type}" - if self.storage_type == STORAGE_TYPE_GPG: - fname += ".gpg" - - return Path(settings.ORIGINALS_DIR) / fname - - -def add_mime_types(apps, schema_editor): - Document = apps.get_model("documents", "Document") - documents = Document.objects.all() - - for d in documents: - with Path(source_path(d)).open("rb") as f: - if d.storage_type == STORAGE_TYPE_GPG: - data = GnuPG.decrypted(f) - else: - data = f.read(1024) - - d.mime_type = magic.from_buffer(data, mime=True) - d.save() - - -def add_file_extensions(apps, schema_editor): - Document = apps.get_model("documents", "Document") - documents = Document.objects.all() - - for d in documents: - d.file_type = Path(d.filename).suffix.lstrip(".") - d.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1002_auto_20201111_1105"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="mime_type", - field=models.CharField(default="-", editable=False, max_length=256), - preserve_default=False, - ), - migrations.RunPython(add_mime_types, migrations.RunPython.noop), - # This operation is here so that we can revert the entire migration: - # By allowing this field to be blank and null, we can revert the - # remove operation further down and the database won't complain about - # NOT NULL violations. - migrations.AlterField( - model_name="document", - name="file_type", - field=models.CharField( - choices=[ - ("pdf", "PDF"), - ("png", "PNG"), - ("jpg", "JPG"), - ("gif", "GIF"), - ("tiff", "TIFF"), - ("txt", "TXT"), - ("csv", "CSV"), - ("md", "MD"), - ], - editable=False, - max_length=4, - null=True, - blank=True, - ), - ), - migrations.RunPython(migrations.RunPython.noop, add_file_extensions), - migrations.RemoveField( - model_name="document", - name="file_type", - ), - ] diff --git a/src/documents/migrations/1004_sanity_check_schedule.py b/src/documents/migrations/1004_sanity_check_schedule.py deleted file mode 100644 index 018cf24923..0000000000 --- a/src/documents/migrations/1004_sanity_check_schedule.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-25 14:53 - -from django.db import migrations -from django.db.migrations import RunPython - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1003_mime_types"), - ] - - operations = [RunPython(migrations.RunPython.noop, migrations.RunPython.noop)] diff --git a/src/documents/migrations/1005_checksums.py b/src/documents/migrations/1005_checksums.py deleted file mode 100644 index 4637e06cee..0000000000 --- a/src/documents/migrations/1005_checksums.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-29 00:48 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1004_sanity_check_schedule"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="archive_checksum", - field=models.CharField( - blank=True, - editable=False, - help_text="The checksum of the archived document.", - max_length=32, - null=True, - ), - ), - migrations.AlterField( - model_name="document", - name="checksum", - field=models.CharField( - editable=False, - help_text="The checksum of the original document.", - max_length=32, - unique=True, - ), - ), - ] diff --git a/src/documents/migrations/1006_auto_20201208_2209.py b/src/documents/migrations/1006_auto_20201208_2209.py deleted file mode 100644 index 425f0a768c..0000000000 --- a/src/documents/migrations/1006_auto_20201208_2209.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.1.4 on 2020-12-08 22:09 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1005_checksums"), - ] - - operations = [ - migrations.RemoveField( - model_name="correspondent", - name="slug", - ), - migrations.RemoveField( - model_name="documenttype", - name="slug", - ), - migrations.RemoveField( - model_name="tag", - name="slug", - ), - ] diff --git a/src/documents/migrations/1006_auto_20201208_2209_squashed_1011_auto_20210101_2340.py b/src/documents/migrations/1006_auto_20201208_2209_squashed_1011_auto_20210101_2340.py deleted file mode 100644 index aa8cb6deba..0000000000 --- a/src/documents/migrations/1006_auto_20201208_2209_squashed_1011_auto_20210101_2340.py +++ /dev/null @@ -1,485 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 18:01 - -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): - replaces = [ - ("documents", "1006_auto_20201208_2209"), - ("documents", "1007_savedview_savedviewfilterrule"), - ("documents", "1008_auto_20201216_1736"), - ("documents", "1009_auto_20201216_2005"), - ("documents", "1010_auto_20210101_2159"), - ("documents", "1011_auto_20210101_2340"), - ] - - dependencies = [ - ("documents", "1005_checksums"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.RemoveField( - model_name="correspondent", - name="slug", - ), - migrations.RemoveField( - model_name="documenttype", - name="slug", - ), - migrations.RemoveField( - model_name="tag", - name="slug", - ), - migrations.CreateModel( - name="SavedView", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128, verbose_name="name")), - ( - "show_on_dashboard", - models.BooleanField(verbose_name="show on dashboard"), - ), - ( - "show_in_sidebar", - models.BooleanField(verbose_name="show in sidebar"), - ), - ( - "sort_field", - models.CharField(max_length=128, verbose_name="sort field"), - ), - ( - "sort_reverse", - models.BooleanField(default=False, verbose_name="sort reverse"), - ), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - ], - options={ - "ordering": ("name",), - "verbose_name": "saved view", - "verbose_name_plural": "saved views", - }, - ), - migrations.AlterModelOptions( - name="correspondent", - options={ - "ordering": ("name",), - "verbose_name": "correspondent", - "verbose_name_plural": "correspondents", - }, - ), - migrations.AlterModelOptions( - name="document", - options={ - "ordering": ("-created",), - "verbose_name": "document", - "verbose_name_plural": "documents", - }, - ), - migrations.AlterModelOptions( - name="documenttype", - options={ - "verbose_name": "document type", - "verbose_name_plural": "document types", - }, - ), - migrations.AlterModelOptions( - name="log", - options={ - "ordering": ("-created",), - "verbose_name": "log", - "verbose_name_plural": "logs", - }, - ), - migrations.AlterModelOptions( - name="tag", - options={"verbose_name": "tag", "verbose_name_plural": "tags"}, - ), - migrations.AlterField( - model_name="correspondent", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="correspondent", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="correspondent", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - migrations.AlterField( - model_name="document", - name="added", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - editable=False, - verbose_name="added", - ), - ), - migrations.AlterField( - model_name="document", - name="archive_checksum", - field=models.CharField( - blank=True, - editable=False, - help_text="The checksum of the archived document.", - max_length=32, - null=True, - verbose_name="archive checksum", - ), - ), - migrations.AlterField( - model_name="document", - name="archive_serial_number", - field=models.IntegerField( - blank=True, - db_index=True, - help_text="The position of this document in your physical document archive.", - null=True, - unique=True, - verbose_name="archive serial number", - ), - ), - migrations.AlterField( - model_name="document", - name="checksum", - field=models.CharField( - editable=False, - help_text="The checksum of the original document.", - max_length=32, - unique=True, - verbose_name="checksum", - ), - ), - migrations.AlterField( - model_name="document", - name="content", - field=models.TextField( - blank=True, - help_text="The raw, text-only data of the document. This field is primarily used for searching.", - verbose_name="content", - ), - ), - migrations.AlterField( - model_name="document", - name="correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.correspondent", - verbose_name="correspondent", - ), - ), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - ), - migrations.AlterField( - model_name="document", - name="document_type", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.documenttype", - verbose_name="document type", - ), - ), - migrations.AlterField( - model_name="document", - name="filename", - field=models.FilePathField( - default=None, - editable=False, - help_text="Current filename in storage", - max_length=1024, - null=True, - verbose_name="filename", - ), - ), - migrations.AlterField( - model_name="document", - name="mime_type", - field=models.CharField( - editable=False, - max_length=256, - verbose_name="mime type", - ), - ), - migrations.AlterField( - model_name="document", - name="modified", - field=models.DateTimeField( - auto_now=True, - db_index=True, - verbose_name="modified", - ), - ), - migrations.AlterField( - model_name="document", - name="storage_type", - field=models.CharField( - choices=[ - ("unencrypted", "Unencrypted"), - ("gpg", "Encrypted with GNU Privacy Guard"), - ], - default="unencrypted", - editable=False, - max_length=11, - verbose_name="storage type", - ), - ), - migrations.AlterField( - model_name="document", - name="tags", - field=models.ManyToManyField( - blank=True, - related_name="documents", - to="documents.tag", - verbose_name="tags", - ), - ), - migrations.AlterField( - model_name="document", - name="title", - field=models.CharField( - blank=True, - db_index=True, - max_length=128, - verbose_name="title", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="documenttype", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="documenttype", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - migrations.AlterField( - model_name="log", - name="created", - field=models.DateTimeField(auto_now_add=True, verbose_name="created"), - ), - migrations.AlterField( - model_name="log", - name="group", - field=models.UUIDField(blank=True, null=True, verbose_name="group"), - ), - migrations.AlterField( - model_name="log", - name="level", - field=models.PositiveIntegerField( - choices=[ - (10, "debug"), - (20, "information"), - (30, "warning"), - (40, "error"), - (50, "critical"), - ], - default=20, - verbose_name="level", - ), - ), - migrations.AlterField( - model_name="log", - name="message", - field=models.TextField(verbose_name="message"), - ), - migrations.CreateModel( - name="SavedViewFilterRule", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "rule_type", - models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - ], - verbose_name="rule type", - ), - ), - ( - "value", - models.CharField( - blank=True, - max_length=128, - null=True, - verbose_name="value", - ), - ), - ( - "saved_view", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="filter_rules", - to="documents.savedview", - verbose_name="saved view", - ), - ), - ], - options={ - "verbose_name": "filter rule", - "verbose_name_plural": "filter rules", - }, - ), - migrations.AlterField( - model_name="tag", - name="colour", - field=models.PositiveIntegerField( - choices=[ - (1, "#a6cee3"), - (2, "#1f78b4"), - (3, "#b2df8a"), - (4, "#33a02c"), - (5, "#fb9a99"), - (6, "#e31a1c"), - (7, "#fdbf6f"), - (8, "#ff7f00"), - (9, "#cab2d6"), - (10, "#6a3d9a"), - (11, "#b15928"), - (12, "#000000"), - (13, "#cccccc"), - ], - default=1, - verbose_name="color", - ), - ), - migrations.AlterField( - model_name="tag", - name="is_inbox_tag", - field=models.BooleanField( - default=False, - help_text="Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags.", - verbose_name="is inbox tag", - ), - ), - migrations.AlterField( - model_name="tag", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="tag", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="tag", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - ] diff --git a/src/documents/migrations/1007_savedview_savedviewfilterrule.py b/src/documents/migrations/1007_savedview_savedviewfilterrule.py deleted file mode 100644 index 64564c6af9..0000000000 --- a/src/documents/migrations/1007_savedview_savedviewfilterrule.py +++ /dev/null @@ -1,90 +0,0 @@ -# Generated by Django 3.1.4 on 2020-12-12 14:41 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1006_auto_20201208_2209"), - ] - - operations = [ - migrations.CreateModel( - name="SavedView", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=128)), - ("show_on_dashboard", models.BooleanField()), - ("show_in_sidebar", models.BooleanField()), - ("sort_field", models.CharField(max_length=128)), - ("sort_reverse", models.BooleanField(default=False)), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="SavedViewFilterRule", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "rule_type", - models.PositiveIntegerField( - choices=[ - (0, "Title contains"), - (1, "Content contains"), - (2, "ASN is"), - (3, "Correspondent is"), - (4, "Document type is"), - (5, "Is in inbox"), - (6, "Has tag"), - (7, "Has any tag"), - (8, "Created before"), - (9, "Created after"), - (10, "Created year is"), - (11, "Created month is"), - (12, "Created day is"), - (13, "Added before"), - (14, "Added after"), - (15, "Modified before"), - (16, "Modified after"), - (17, "Does not have tag"), - ], - ), - ), - ("value", models.CharField(max_length=128)), - ( - "saved_view", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="filter_rules", - to="documents.savedview", - ), - ), - ], - ), - ] diff --git a/src/documents/migrations/1008_auto_20201216_1736.py b/src/documents/migrations/1008_auto_20201216_1736.py deleted file mode 100644 index 76f0343b13..0000000000 --- a/src/documents/migrations/1008_auto_20201216_1736.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.1.4 on 2020-12-16 17:36 - -import django.db.models.functions.text -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1007_savedview_savedviewfilterrule"), - ] - - operations = [ - migrations.AlterModelOptions( - name="correspondent", - options={"ordering": (django.db.models.functions.text.Lower("name"),)}, - ), - migrations.AlterModelOptions( - name="document", - options={"ordering": ("-created",)}, - ), - migrations.AlterModelOptions( - name="documenttype", - options={"ordering": (django.db.models.functions.text.Lower("name"),)}, - ), - migrations.AlterModelOptions( - name="savedview", - options={"ordering": (django.db.models.functions.text.Lower("name"),)}, - ), - migrations.AlterModelOptions( - name="tag", - options={"ordering": (django.db.models.functions.text.Lower("name"),)}, - ), - ] diff --git a/src/documents/migrations/1009_auto_20201216_2005.py b/src/documents/migrations/1009_auto_20201216_2005.py deleted file mode 100644 index 37bae88812..0000000000 --- a/src/documents/migrations/1009_auto_20201216_2005.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.1.4 on 2020-12-16 20:05 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1008_auto_20201216_1736"), - ] - - operations = [ - migrations.AlterModelOptions( - name="correspondent", - options={"ordering": ("name",)}, - ), - migrations.AlterModelOptions( - name="documenttype", - options={"ordering": ("name",)}, - ), - migrations.AlterModelOptions( - name="savedview", - options={"ordering": ("name",)}, - ), - migrations.AlterModelOptions( - name="tag", - options={"ordering": ("name",)}, - ), - ] diff --git a/src/documents/migrations/1010_auto_20210101_2159.py b/src/documents/migrations/1010_auto_20210101_2159.py deleted file mode 100644 index 0c6a42d30a..0000000000 --- a/src/documents/migrations/1010_auto_20210101_2159.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.1.4 on 2021-01-01 21:59 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1009_auto_20201216_2005"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="value", - field=models.CharField(blank=True, max_length=128, null=True), - ), - ] diff --git a/src/documents/migrations/1011_auto_20210101_2340.py b/src/documents/migrations/1011_auto_20210101_2340.py deleted file mode 100644 index dea1077154..0000000000 --- a/src/documents/migrations/1011_auto_20210101_2340.py +++ /dev/null @@ -1,454 +0,0 @@ -# Generated by Django 3.1.4 on 2021-01-01 23:40 - -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): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1010_auto_20210101_2159"), - ] - - operations = [ - migrations.AlterModelOptions( - name="correspondent", - options={ - "ordering": ("name",), - "verbose_name": "correspondent", - "verbose_name_plural": "correspondents", - }, - ), - migrations.AlterModelOptions( - name="document", - options={ - "ordering": ("-created",), - "verbose_name": "document", - "verbose_name_plural": "documents", - }, - ), - migrations.AlterModelOptions( - name="documenttype", - options={ - "verbose_name": "document type", - "verbose_name_plural": "document types", - }, - ), - migrations.AlterModelOptions( - name="log", - options={ - "ordering": ("-created",), - "verbose_name": "log", - "verbose_name_plural": "logs", - }, - ), - migrations.AlterModelOptions( - name="savedview", - options={ - "ordering": ("name",), - "verbose_name": "saved view", - "verbose_name_plural": "saved views", - }, - ), - migrations.AlterModelOptions( - name="savedviewfilterrule", - options={ - "verbose_name": "filter rule", - "verbose_name_plural": "filter rules", - }, - ), - migrations.AlterModelOptions( - name="tag", - options={"verbose_name": "tag", "verbose_name_plural": "tags"}, - ), - migrations.AlterField( - model_name="correspondent", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="correspondent", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="correspondent", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - migrations.AlterField( - model_name="document", - name="added", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - editable=False, - verbose_name="added", - ), - ), - migrations.AlterField( - model_name="document", - name="archive_checksum", - field=models.CharField( - blank=True, - editable=False, - help_text="The checksum of the archived document.", - max_length=32, - null=True, - verbose_name="archive checksum", - ), - ), - migrations.AlterField( - model_name="document", - name="archive_serial_number", - field=models.IntegerField( - blank=True, - db_index=True, - help_text="The position of this document in your physical document archive.", - null=True, - unique=True, - verbose_name="archive serial number", - ), - ), - migrations.AlterField( - model_name="document", - name="checksum", - field=models.CharField( - editable=False, - help_text="The checksum of the original document.", - max_length=32, - unique=True, - verbose_name="checksum", - ), - ), - migrations.AlterField( - model_name="document", - name="content", - field=models.TextField( - blank=True, - help_text="The raw, text-only data of the document. This field is primarily used for searching.", - verbose_name="content", - ), - ), - migrations.AlterField( - model_name="document", - name="correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.correspondent", - verbose_name="correspondent", - ), - ), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - ), - migrations.AlterField( - model_name="document", - name="document_type", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.documenttype", - verbose_name="document type", - ), - ), - migrations.AlterField( - model_name="document", - name="filename", - field=models.FilePathField( - default=None, - editable=False, - help_text="Current filename in storage", - max_length=1024, - null=True, - verbose_name="filename", - ), - ), - migrations.AlterField( - model_name="document", - name="mime_type", - field=models.CharField( - editable=False, - max_length=256, - verbose_name="mime type", - ), - ), - migrations.AlterField( - model_name="document", - name="modified", - field=models.DateTimeField( - auto_now=True, - db_index=True, - verbose_name="modified", - ), - ), - migrations.AlterField( - model_name="document", - name="storage_type", - field=models.CharField( - choices=[ - ("unencrypted", "Unencrypted"), - ("gpg", "Encrypted with GNU Privacy Guard"), - ], - default="unencrypted", - editable=False, - max_length=11, - verbose_name="storage type", - ), - ), - migrations.AlterField( - model_name="document", - name="tags", - field=models.ManyToManyField( - blank=True, - related_name="documents", - to="documents.Tag", - verbose_name="tags", - ), - ), - migrations.AlterField( - model_name="document", - name="title", - field=models.CharField( - blank=True, - db_index=True, - max_length=128, - verbose_name="title", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="documenttype", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="documenttype", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - migrations.AlterField( - model_name="log", - name="created", - field=models.DateTimeField(auto_now_add=True, verbose_name="created"), - ), - migrations.AlterField( - model_name="log", - name="group", - field=models.UUIDField(blank=True, null=True, verbose_name="group"), - ), - migrations.AlterField( - model_name="log", - name="level", - field=models.PositiveIntegerField( - choices=[ - (10, "debug"), - (20, "information"), - (30, "warning"), - (40, "error"), - (50, "critical"), - ], - default=20, - verbose_name="level", - ), - ), - migrations.AlterField( - model_name="log", - name="message", - field=models.TextField(verbose_name="message"), - ), - migrations.AlterField( - model_name="savedview", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AlterField( - model_name="savedview", - name="show_in_sidebar", - field=models.BooleanField(verbose_name="show in sidebar"), - ), - migrations.AlterField( - model_name="savedview", - name="show_on_dashboard", - field=models.BooleanField(verbose_name="show on dashboard"), - ), - migrations.AlterField( - model_name="savedview", - name="sort_field", - field=models.CharField(max_length=128, verbose_name="sort field"), - ), - migrations.AlterField( - model_name="savedview", - name="sort_reverse", - field=models.BooleanField(default=False, verbose_name="sort reverse"), - ), - migrations.AlterField( - model_name="savedview", - name="user", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - ], - verbose_name="rule type", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="saved_view", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="filter_rules", - to="documents.savedview", - verbose_name="saved view", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="value", - field=models.CharField( - blank=True, - max_length=128, - null=True, - verbose_name="value", - ), - ), - migrations.AlterField( - model_name="tag", - name="colour", - field=models.PositiveIntegerField( - choices=[ - (1, "#a6cee3"), - (2, "#1f78b4"), - (3, "#b2df8a"), - (4, "#33a02c"), - (5, "#fb9a99"), - (6, "#e31a1c"), - (7, "#fdbf6f"), - (8, "#ff7f00"), - (9, "#cab2d6"), - (10, "#6a3d9a"), - (11, "#b15928"), - (12, "#000000"), - (13, "#cccccc"), - ], - default=1, - verbose_name="color", - ), - ), - migrations.AlterField( - model_name="tag", - name="is_inbox_tag", - field=models.BooleanField( - default=False, - help_text="Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags.", - verbose_name="is inbox tag", - ), - ), - migrations.AlterField( - model_name="tag", - name="is_insensitive", - field=models.BooleanField(default=True, verbose_name="is insensitive"), - ), - migrations.AlterField( - model_name="tag", - name="match", - field=models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="tag", - name="name", - field=models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - ] diff --git a/src/documents/migrations/1012_fix_archive_files.py b/src/documents/migrations/1012_fix_archive_files.py deleted file mode 100644 index a97fa7a80f..0000000000 --- a/src/documents/migrations/1012_fix_archive_files.py +++ /dev/null @@ -1,367 +0,0 @@ -# Generated by Django 3.1.6 on 2021-02-07 22:26 -import datetime -import hashlib -import logging -import os -import shutil -from collections import defaultdict -from pathlib import Path -from time import sleep - -import pathvalidate -from django.conf import settings -from django.db import migrations -from django.db import models -from django.template.defaultfilters import slugify - -logger = logging.getLogger("paperless.migrations") - - -############################################################################### -# This is code copied straight paperless before the change. -############################################################################### -class defaultdictNoStr(defaultdict): - def __str__(self): # pragma: no cover - raise ValueError("Don't use {tags} directly.") - - -def many_to_dictionary(field): # pragma: no cover - # Converts ManyToManyField to dictionary by assuming, that field - # entries contain an _ or - which will be used as a delimiter - mydictionary = dict() - - for index, t in enumerate(field.all()): - # Populate tag names by index - mydictionary[index] = slugify(t.name) - - # Find delimiter - delimiter = t.name.find("_") - - if delimiter == -1: - delimiter = t.name.find("-") - - if delimiter == -1: - continue - - key = t.name[:delimiter] - value = t.name[delimiter + 1 :] - - mydictionary[slugify(key)] = slugify(value) - - return mydictionary - - -def archive_name_from_filename(filename: Path) -> Path: - return Path(filename.stem + ".pdf") - - -def archive_path_old(doc) -> Path: - if doc.filename: - fname = archive_name_from_filename(Path(doc.filename)) - else: - fname = Path(f"{doc.pk:07}.pdf") - - return settings.ARCHIVE_DIR / fname - - -STORAGE_TYPE_GPG = "gpg" - - -def archive_path_new(doc) -> Path | None: - if doc.archive_filename is not None: - return settings.ARCHIVE_DIR / doc.archive_filename - else: - return None - - -def source_path(doc) -> Path: - if doc.filename: - fname = doc.filename - else: - fname = f"{doc.pk:07}{doc.file_type}" - if doc.storage_type == STORAGE_TYPE_GPG: - fname = Path(str(fname) + ".gpg") # pragma: no cover - - return settings.ORIGINALS_DIR / fname - - -def generate_unique_filename(doc, *, archive_filename=False): - if archive_filename: - old_filename = doc.archive_filename - root = settings.ARCHIVE_DIR - else: - old_filename = doc.filename - root = settings.ORIGINALS_DIR - - counter = 0 - - while True: - new_filename = generate_filename( - doc, - counter=counter, - archive_filename=archive_filename, - ) - if new_filename == old_filename: - # still the same as before. - return new_filename - - if (root / new_filename).exists(): - counter += 1 - else: - return new_filename - - -def generate_filename(doc, *, counter=0, append_gpg=True, archive_filename=False): - path = "" - - try: - if settings.FILENAME_FORMAT is not None: - tags = defaultdictNoStr(lambda: slugify(None), many_to_dictionary(doc.tags)) - - tag_list = pathvalidate.sanitize_filename( - ",".join(sorted([tag.name for tag in doc.tags.all()])), - replacement_text="-", - ) - - if doc.correspondent: - correspondent = pathvalidate.sanitize_filename( - doc.correspondent.name, - replacement_text="-", - ) - else: - correspondent = "none" - - if doc.document_type: - document_type = pathvalidate.sanitize_filename( - doc.document_type.name, - replacement_text="-", - ) - else: - document_type = "none" - - path = settings.FILENAME_FORMAT.format( - title=pathvalidate.sanitize_filename(doc.title, replacement_text="-"), - correspondent=correspondent, - document_type=document_type, - created=datetime.date.isoformat(doc.created), - created_year=doc.created.year if doc.created else "none", - created_month=f"{doc.created.month:02}" if doc.created else "none", - created_day=f"{doc.created.day:02}" if doc.created else "none", - added=datetime.date.isoformat(doc.added), - added_year=doc.added.year if doc.added else "none", - added_month=f"{doc.added.month:02}" if doc.added else "none", - added_day=f"{doc.added.day:02}" if doc.added else "none", - tags=tags, - tag_list=tag_list, - ).strip() - - path = path.strip(os.sep) - - except (ValueError, KeyError, IndexError): - logger.warning( - f"Invalid PAPERLESS_FILENAME_FORMAT: " - f"{settings.FILENAME_FORMAT}, falling back to default", - ) - - counter_str = f"_{counter:02}" if counter else "" - - filetype_str = ".pdf" if archive_filename else doc.file_type - - if len(path) > 0: - filename = f"{path}{counter_str}{filetype_str}" - else: - filename = f"{doc.pk:07}{counter_str}{filetype_str}" - - # Append .gpg for encrypted files - if append_gpg and doc.storage_type == STORAGE_TYPE_GPG: - filename += ".gpg" - - return filename - - -############################################################################### -# This code performs bidirection archive file transformation. -############################################################################### - - -def parse_wrapper(parser, path, mime_type, file_name): - # this is here so that I can mock this out for testing. - parser.parse(path, mime_type, file_name) - - -def create_archive_version(doc, retry_count=3): - 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) - for try_num in range(retry_count): - parser: DocumentParser = parser_class(None, None) - try: - parse_wrapper( - parser, - source_path(doc), - doc.mime_type, - Path(doc.filename).name, - ) - doc.content = parser.get_text() - - if parser.get_archive_path() and Path(parser.get_archive_path()).is_file(): - doc.archive_filename = generate_unique_filename( - doc, - archive_filename=True, - ) - with Path(parser.get_archive_path()).open("rb") as f: - doc.archive_checksum = hashlib.md5(f.read()).hexdigest() - archive_path_new(doc).parent.mkdir(parents=True, exist_ok=True) - shutil.copy2(parser.get_archive_path(), archive_path_new(doc)) - else: - doc.archive_checksum = None - logger.error( - f"Parser did not return an archive document for document " - f"ID:{doc.id}. Removing archive document.", - ) - doc.save() - return - except ParseError: - if try_num + 1 == retry_count: - logger.exception( - f"Unable to regenerate archive document for ID:{doc.id}. You " - f"need to invoke the document_archiver management command " - f"manually for that document.", - ) - doc.archive_checksum = None - doc.save() - return - else: - # This is mostly here for the tika parser in docker - # environments. The servers for parsing need to come up first, - # and the docker setup doesn't ensure that tika is running - # before attempting migrations. - logger.error("Parse error, will try again in 5 seconds...") - sleep(5) - finally: - parser.cleanup() - - -def move_old_to_new_locations(apps, schema_editor): - Document = apps.get_model("documents", "Document") - - affected_document_ids = set() - - old_archive_path_to_id = {} - - # check for documents that have incorrect archive versions - for doc in Document.objects.filter(archive_checksum__isnull=False): - old_path = archive_path_old(doc) - - if old_path in old_archive_path_to_id: - affected_document_ids.add(doc.id) - affected_document_ids.add(old_archive_path_to_id[old_path]) - else: - old_archive_path_to_id[old_path] = doc.id - - # check that archive files of all unaffected documents are in place - for doc in Document.objects.filter(archive_checksum__isnull=False): - old_path = archive_path_old(doc) - if doc.id not in affected_document_ids and not old_path.is_file(): - raise ValueError( - f"Archived document ID:{doc.id} does not exist at: {old_path}", - ) - - # check that we can regenerate affected archive versions - for doc_id in affected_document_ids: - from documents.parsers import get_parser_class_for_mime_type - - doc = Document.objects.get(id=doc_id) - parser_class = get_parser_class_for_mime_type(doc.mime_type) - if not parser_class: - raise ValueError( - f"Document ID:{doc.id} has an invalid archived document, " - f"but no parsers are available. Cannot migrate.", - ) - - for doc in Document.objects.filter(archive_checksum__isnull=False): - if doc.id in affected_document_ids: - old_path = archive_path_old(doc) - # remove affected archive versions - if old_path.is_file(): - logger.debug(f"Removing {old_path}") - old_path.unlink() - else: - # Set archive path for unaffected files - doc.archive_filename = archive_name_from_filename(Path(doc.filename)) - Document.objects.filter(id=doc.id).update( - archive_filename=doc.archive_filename, - ) - - # regenerate archive documents - for doc_id in affected_document_ids: - doc = Document.objects.get(id=doc_id) - create_archive_version(doc) - - -def move_new_to_old_locations(apps, schema_editor): - Document = apps.get_model("documents", "Document") - - old_archive_paths = set() - - for doc in Document.objects.filter(archive_checksum__isnull=False): - new_archive_path = archive_path_new(doc) - old_archive_path = archive_path_old(doc) - if old_archive_path in old_archive_paths: - raise ValueError( - f"Cannot migrate: Archive file name {old_archive_path} of " - f"document {doc.filename} would clash with another archive " - f"filename.", - ) - old_archive_paths.add(old_archive_path) - if new_archive_path != old_archive_path and old_archive_path.is_file(): - raise ValueError( - f"Cannot migrate: Cannot move {new_archive_path} to " - f"{old_archive_path}: file already exists.", - ) - - for doc in Document.objects.filter(archive_checksum__isnull=False): - new_archive_path = archive_path_new(doc) - old_archive_path = archive_path_old(doc) - if new_archive_path != old_archive_path: - logger.debug(f"Moving {new_archive_path} to {old_archive_path}") - shutil.move(new_archive_path, old_archive_path) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1011_auto_20210101_2340"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="archive_filename", - field=models.FilePathField( - default=None, - editable=False, - help_text="Current archive filename in storage", - max_length=1024, - null=True, - unique=True, - verbose_name="archive filename", - ), - ), - migrations.AlterField( - model_name="document", - name="filename", - field=models.FilePathField( - default=None, - editable=False, - help_text="Current filename in storage", - max_length=1024, - null=True, - unique=True, - verbose_name="filename", - ), - ), - migrations.RunPython(move_old_to_new_locations, move_new_to_old_locations), - ] diff --git a/src/documents/migrations/1013_migrate_tag_colour.py b/src/documents/migrations/1013_migrate_tag_colour.py deleted file mode 100644 index 6cae10898e..0000000000 --- a/src/documents/migrations/1013_migrate_tag_colour.py +++ /dev/null @@ -1,74 +0,0 @@ -# Generated by Django 3.1.4 on 2020-12-02 21:43 - -from django.db import migrations -from django.db import models - -COLOURS_OLD = { - 1: "#a6cee3", - 2: "#1f78b4", - 3: "#b2df8a", - 4: "#33a02c", - 5: "#fb9a99", - 6: "#e31a1c", - 7: "#fdbf6f", - 8: "#ff7f00", - 9: "#cab2d6", - 10: "#6a3d9a", - 11: "#b15928", - 12: "#000000", - 13: "#cccccc", -} - - -def forward(apps, schema_editor): - Tag = apps.get_model("documents", "Tag") - - for tag in Tag.objects.all(): - colour_old_id = tag.colour_old - rgb = COLOURS_OLD[colour_old_id] - tag.color = rgb - tag.save() - - -def reverse(apps, schema_editor): - Tag = apps.get_model("documents", "Tag") - - def _get_colour_id(rdb): - for idx, rdbx in COLOURS_OLD.items(): - if rdbx == rdb: - return idx - # Return colour 1 if we can't match anything - return 1 - - for tag in Tag.objects.all(): - colour_id = _get_colour_id(tag.color) - tag.colour_old = colour_id - tag.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1012_fix_archive_files"), - ] - - operations = [ - migrations.RenameField( - model_name="tag", - old_name="colour", - new_name="colour_old", - ), - migrations.AddField( - model_name="tag", - name="color", - field=models.CharField( - default="#a6cee3", - max_length=7, - verbose_name="color", - ), - ), - migrations.RunPython(forward, reverse), - migrations.RemoveField( - model_name="tag", - name="colour_old", - ), - ] diff --git a/src/documents/migrations/1014_auto_20210228_1614.py b/src/documents/migrations/1014_auto_20210228_1614.py deleted file mode 100644 index 5785bcb53d..0000000000 --- a/src/documents/migrations/1014_auto_20210228_1614.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.1.7 on 2021-02-28 15:14 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1013_migrate_tag_colour"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1015_remove_null_characters.py b/src/documents/migrations/1015_remove_null_characters.py deleted file mode 100644 index 9872b3a754..0000000000 --- a/src/documents/migrations/1015_remove_null_characters.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.1.7 on 2021-04-04 18:28 -import logging - -from django.db import migrations - -logger = logging.getLogger("paperless.migrations") - - -def remove_null_characters(apps, schema_editor): - Document = apps.get_model("documents", "Document") - - for doc in Document.objects.all(): - content: str = doc.content - if "\0" in content: - logger.info(f"Removing null characters from document {doc}...") - doc.content = content.replace("\0", " ") - doc.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1014_auto_20210228_1614"), - ] - - operations = [ - migrations.RunPython(remove_null_characters, migrations.RunPython.noop), - ] diff --git a/src/documents/migrations/1016_auto_20210317_1351.py b/src/documents/migrations/1016_auto_20210317_1351.py deleted file mode 100644 index 67147fd4c0..0000000000 --- a/src/documents/migrations/1016_auto_20210317_1351.py +++ /dev/null @@ -1,54 +0,0 @@ -# Generated by Django 3.1.7 on 2021-03-17 12:51 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1015_remove_null_characters"), - ] - - operations = [ - migrations.AlterField( - model_name="savedview", - name="sort_field", - field=models.CharField( - blank=True, - max_length=128, - null=True, - verbose_name="sort field", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1016_auto_20210317_1351_squashed_1020_merge_20220518_1839.py b/src/documents/migrations/1016_auto_20210317_1351_squashed_1020_merge_20220518_1839.py deleted file mode 100644 index a7f92e931b..0000000000 --- a/src/documents/migrations/1016_auto_20210317_1351_squashed_1020_merge_20220518_1839.py +++ /dev/null @@ -1,190 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 18:09 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - replaces = [ - ("documents", "1016_auto_20210317_1351"), - ("documents", "1017_alter_savedviewfilterrule_rule_type"), - ("documents", "1018_alter_savedviewfilterrule_value"), - ("documents", "1019_uisettings"), - ("documents", "1019_storagepath_document_storage_path"), - ("documents", "1020_merge_20220518_1839"), - ] - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1015_remove_null_characters"), - ] - - operations = [ - migrations.AlterField( - model_name="savedview", - name="sort_field", - field=models.CharField( - blank=True, - max_length=128, - null=True, - verbose_name="sort field", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - ], - verbose_name="rule type", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - ], - verbose_name="rule type", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="value", - field=models.CharField( - blank=True, - max_length=255, - null=True, - verbose_name="value", - ), - ), - migrations.CreateModel( - name="UiSettings", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("settings", models.JSONField(null=True)), - ( - "user", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="ui_settings", - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - migrations.CreateModel( - name="StoragePath", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "name", - models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - ( - "match", - models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - ( - "matching_algorithm", - models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - ( - "is_insensitive", - models.BooleanField(default=True, verbose_name="is insensitive"), - ), - ("path", models.CharField(max_length=512, verbose_name="path")), - ], - options={ - "verbose_name": "storage path", - "verbose_name_plural": "storage paths", - "ordering": ("name",), - }, - ), - migrations.AddField( - model_name="document", - name="storage_path", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.storagepath", - verbose_name="storage path", - ), - ), - ] diff --git a/src/documents/migrations/1017_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1017_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index ab18f1bc1a..0000000000 --- a/src/documents/migrations/1017_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-17 11:59 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1016_auto_20210317_1351"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1018_alter_savedviewfilterrule_value.py b/src/documents/migrations/1018_alter_savedviewfilterrule_value.py deleted file mode 100644 index 95ef4861d1..0000000000 --- a/src/documents/migrations/1018_alter_savedviewfilterrule_value.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.0.3 on 2022-04-01 22:50 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1017_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="value", - field=models.CharField( - blank=True, - max_length=255, - null=True, - verbose_name="value", - ), - ), - ] diff --git a/src/documents/migrations/1019_storagepath_document_storage_path.py b/src/documents/migrations/1019_storagepath_document_storage_path.py deleted file mode 100644 index b09941bf58..0000000000 --- a/src/documents/migrations/1019_storagepath_document_storage_path.py +++ /dev/null @@ -1,73 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-02 15:56 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1018_alter_savedviewfilterrule_value"), - ] - - operations = [ - migrations.CreateModel( - name="StoragePath", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "name", - models.CharField(max_length=128, unique=True, verbose_name="name"), - ), - ( - "match", - models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - ( - "matching_algorithm", - models.PositiveIntegerField( - choices=[ - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - ( - "is_insensitive", - models.BooleanField(default=True, verbose_name="is insensitive"), - ), - ("path", models.CharField(max_length=512, verbose_name="path")), - ], - options={ - "verbose_name": "storage path", - "verbose_name_plural": "storage paths", - "ordering": ("name",), - }, - ), - migrations.AddField( - model_name="document", - name="storage_path", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="documents", - to="documents.storagepath", - verbose_name="storage path", - ), - ), - ] diff --git a/src/documents/migrations/1019_uisettings.py b/src/documents/migrations/1019_uisettings.py deleted file mode 100644 index e841380771..0000000000 --- a/src/documents/migrations/1019_uisettings.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-07 05:10 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1018_alter_savedviewfilterrule_value"), - ] - - operations = [ - migrations.CreateModel( - name="UiSettings", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("settings", models.JSONField(null=True)), - ( - "user", - models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - related_name="ui_settings", - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - ] diff --git a/src/documents/migrations/1020_merge_20220518_1839.py b/src/documents/migrations/1020_merge_20220518_1839.py deleted file mode 100644 index a766aaa20c..0000000000 --- a/src/documents/migrations/1020_merge_20220518_1839.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-18 18:39 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1019_storagepath_document_storage_path"), - ("documents", "1019_uisettings"), - ] - - operations = [] diff --git a/src/documents/migrations/1021_webp_thumbnail_conversion.py b/src/documents/migrations/1021_webp_thumbnail_conversion.py deleted file mode 100644 index 50b12b156e..0000000000 --- a/src/documents/migrations/1021_webp_thumbnail_conversion.py +++ /dev/null @@ -1,104 +0,0 @@ -# Generated by Django 4.0.5 on 2022-06-11 15:40 -import logging -import multiprocessing.pool -import shutil -import tempfile -import time -from pathlib import Path - -from django.conf import settings -from django.db import migrations - -from documents.parsers import run_convert - -logger = logging.getLogger("paperless.migrations") - - -def _do_convert(work_package): - existing_thumbnail, converted_thumbnail = work_package - try: - logger.info(f"Converting thumbnail: {existing_thumbnail}") - - # Run actual conversion - run_convert( - density=300, - scale="500x5000>", - alpha="remove", - strip=True, - trim=False, - auto_orient=True, - input_file=f"{existing_thumbnail}[0]", - output_file=str(converted_thumbnail), - ) - - # Copy newly created thumbnail to thumbnail directory - shutil.copy(converted_thumbnail, existing_thumbnail.parent) - - # Remove the PNG version - existing_thumbnail.unlink() - - logger.info( - "Conversion to WebP completed, " - f"replaced {existing_thumbnail.name} with {converted_thumbnail.name}", - ) - - except Exception as e: - logger.error(f"Error converting thumbnail (existing file unchanged): {e}") - - -def _convert_thumbnails_to_webp(apps, schema_editor): - start = time.time() - - with tempfile.TemporaryDirectory() as tempdir: - work_packages = [] - - for file in Path(settings.THUMBNAIL_DIR).glob("*.png"): - existing_thumbnail = file.resolve() - - # Change the existing filename suffix from png to webp - converted_thumbnail_name = existing_thumbnail.with_suffix( - ".webp", - ).name - - # Create the expected output filename in the tempdir - converted_thumbnail = ( - Path(tempdir) / Path(converted_thumbnail_name) - ).resolve() - - # Package up the necessary info - work_packages.append( - (existing_thumbnail, converted_thumbnail), - ) - - if work_packages: - logger.info( - "\n\n" - " This is a one-time only migration to convert thumbnails for all of your\n" - " documents into WebP format. If you have a lot of documents though, \n" - " this may take a while, so a coffee break may be in order." - "\n", - ) - - with multiprocessing.pool.Pool( - processes=min(multiprocessing.cpu_count(), 4), - maxtasksperchild=4, - ) as pool: - pool.map(_do_convert, work_packages) - - end = time.time() - duration = end - start - - logger.info(f"Conversion completed in {duration:.3f}s") - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1020_merge_20220518_1839"), - ] - - operations = [ - migrations.RunPython( - code=_convert_thumbnails_to_webp, - reverse_code=migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1022_paperlesstask.py b/src/documents/migrations/1022_paperlesstask.py deleted file mode 100644 index c7b3f7744e..0000000000 --- a/src/documents/migrations/1022_paperlesstask.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-23 07:14 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1021_webp_thumbnail_conversion"), - ] - - operations = [ - migrations.CreateModel( - name="PaperlessTask", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("task_id", models.CharField(max_length=128)), - ("name", models.CharField(max_length=256, null=True)), - ( - "created", - models.DateTimeField(auto_now=True, verbose_name="created"), - ), - ( - "started", - models.DateTimeField(null=True, verbose_name="started"), - ), - ("acknowledged", models.BooleanField(default=False)), - ( - "attempted_task", - models.OneToOneField( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="attempted_task", - # This is a dummy field, 1026 will fix up the column - # This manual change is required, as django doesn't django doesn't really support - # removing an app which has migration deps like this - to="documents.document", - ), - ), - ], - ), - ] diff --git a/src/documents/migrations/1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index dc73a51a2d..0000000000 --- a/src/documents/migrations/1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,668 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 18:10 - -import django.core.validators -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): - replaces = [ - ("documents", "1022_paperlesstask"), - ("documents", "1023_add_comments"), - ("documents", "1024_document_original_filename"), - ("documents", "1025_alter_savedviewfilterrule_rule_type"), - ("documents", "1026_transition_to_celery"), - ("documents", "1027_remove_paperlesstask_attempted_task_and_more"), - ("documents", "1028_remove_paperlesstask_task_args_and_more"), - ("documents", "1029_alter_document_archive_serial_number"), - ("documents", "1030_alter_paperlesstask_task_file_name"), - ("documents", "1031_remove_savedview_user_correspondent_owner_and_more"), - ("documents", "1032_alter_correspondent_matching_algorithm_and_more"), - ("documents", "1033_alter_documenttype_options_alter_tag_options_and_more"), - ("documents", "1034_alter_savedviewfilterrule_rule_type"), - ("documents", "1035_rename_comment_note"), - ("documents", "1036_alter_savedviewfilterrule_rule_type"), - ] - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("django_celery_results", "0011_taskresult_periodic_task_name"), - ("documents", "1021_webp_thumbnail_conversion"), - ] - - operations = [ - migrations.CreateModel( - name="Comment", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "comment", - models.TextField( - blank=True, - help_text="Comment for the document", - verbose_name="content", - ), - ), - ( - "created", - models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - ), - ( - "document", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documents", - to="documents.document", - verbose_name="document", - ), - ), - ( - "user", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="users", - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - ], - options={ - "verbose_name": "comment", - "verbose_name_plural": "comments", - "ordering": ("created",), - }, - ), - migrations.AddField( - model_name="document", - name="original_filename", - field=models.CharField( - default=None, - editable=False, - help_text="The original name of the file when it was uploaded", - max_length=1024, - null=True, - verbose_name="original filename", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - ], - verbose_name="rule type", - ), - ), - migrations.CreateModel( - name="PaperlessTask", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("task_id", models.CharField(max_length=128)), - ("acknowledged", models.BooleanField(default=False)), - ( - "attempted_task", - models.OneToOneField( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="attempted_task", - to="django_celery_results.taskresult", - ), - ), - ], - ), - migrations.RunSQL( - sql="DROP TABLE IF EXISTS django_q_ormq", - reverse_sql="", - ), - migrations.RunSQL( - sql="DROP TABLE IF EXISTS django_q_schedule", - reverse_sql="", - ), - migrations.RunSQL( - sql="DROP TABLE IF EXISTS django_q_task", - reverse_sql="", - ), - migrations.RemoveField( - model_name="paperlesstask", - name="attempted_task", - ), - migrations.AddField( - model_name="paperlesstask", - name="date_created", - field=models.DateTimeField( - default=django.utils.timezone.now, - help_text="Datetime field when the task result was created in UTC", - null=True, - verbose_name="Created DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="date_done", - field=models.DateTimeField( - default=None, - help_text="Datetime field when the task was completed in UTC", - null=True, - verbose_name="Completed DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="date_started", - field=models.DateTimeField( - default=None, - help_text="Datetime field when the task was started in UTC", - null=True, - verbose_name="Started DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="result", - field=models.TextField( - default=None, - help_text="The data returned by the task", - null=True, - verbose_name="Result Data", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="status", - field=models.CharField( - choices=[ - ("FAILURE", "FAILURE"), - ("PENDING", "PENDING"), - ("RECEIVED", "RECEIVED"), - ("RETRY", "RETRY"), - ("REVOKED", "REVOKED"), - ("STARTED", "STARTED"), - ("SUCCESS", "SUCCESS"), - ], - default="PENDING", - help_text="Current state of the task being run", - max_length=30, - verbose_name="Task State", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_name", - field=models.CharField( - help_text="Name of the Task which was run", - max_length=255, - null=True, - verbose_name="Task Name", - ), - ), - migrations.AlterField( - model_name="paperlesstask", - name="acknowledged", - field=models.BooleanField( - default=False, - help_text="If the task is acknowledged via the frontend or API", - verbose_name="Acknowledged", - ), - ), - migrations.AlterField( - model_name="paperlesstask", - name="task_id", - field=models.CharField( - help_text="Celery ID for the Task that was run", - max_length=255, - unique=True, - verbose_name="Task ID", - ), - ), - migrations.AlterField( - model_name="document", - name="archive_serial_number", - field=models.PositiveIntegerField( - blank=True, - db_index=True, - help_text="The position of this document in your physical document archive.", - null=True, - unique=True, - validators=[ - django.core.validators.MaxValueValidator(4294967295), - django.core.validators.MinValueValidator(0), - ], - verbose_name="archive serial number", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_file_name", - field=models.CharField( - help_text="Name of the file which the Task was run for", - max_length=255, - null=True, - verbose_name="Task Filename", - ), - ), - migrations.RenameField( - model_name="savedview", - old_name="user", - new_name="owner", - ), - migrations.AlterField( - model_name="savedview", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="correspondent", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="document", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="documenttype", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="storagepath", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="tag", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="storagepath", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterModelOptions( - name="documenttype", - options={ - "ordering": ("name",), - "verbose_name": "document type", - "verbose_name_plural": "document types", - }, - ), - migrations.AlterModelOptions( - name="tag", - options={ - "ordering": ("name",), - "verbose_name": "tag", - "verbose_name_plural": "tags", - }, - ), - migrations.AlterField( - model_name="correspondent", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AlterField( - model_name="documenttype", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AlterField( - model_name="storagepath", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AlterField( - model_name="tag", - name="name", - field=models.CharField(max_length=128, verbose_name="name"), - ), - migrations.AddConstraint( - model_name="correspondent", - constraint=models.UniqueConstraint( - fields=("name", "owner"), - name="documents_correspondent_unique_name_owner", - ), - ), - migrations.AddConstraint( - model_name="correspondent", - constraint=models.UniqueConstraint( - condition=models.Q(("owner__isnull", True)), - fields=("name",), - name="documents_correspondent_name_uniq", - ), - ), - migrations.AddConstraint( - model_name="documenttype", - constraint=models.UniqueConstraint( - fields=("name", "owner"), - name="documents_documenttype_unique_name_owner", - ), - ), - migrations.AddConstraint( - model_name="documenttype", - constraint=models.UniqueConstraint( - condition=models.Q(("owner__isnull", True)), - fields=("name",), - name="documents_documenttype_name_uniq", - ), - ), - migrations.AddConstraint( - model_name="storagepath", - constraint=models.UniqueConstraint( - fields=("name", "owner"), - name="documents_storagepath_unique_name_owner", - ), - ), - migrations.AddConstraint( - model_name="storagepath", - constraint=models.UniqueConstraint( - condition=models.Q(("owner__isnull", True)), - fields=("name",), - name="documents_storagepath_name_uniq", - ), - ), - migrations.AddConstraint( - model_name="tag", - constraint=models.UniqueConstraint( - fields=("name", "owner"), - name="documents_tag_unique_name_owner", - ), - ), - migrations.AddConstraint( - model_name="tag", - constraint=models.UniqueConstraint( - condition=models.Q(("owner__isnull", True)), - fields=("name",), - name="documents_tag_name_uniq", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - ], - verbose_name="rule type", - ), - ), - migrations.RenameModel( - old_name="Comment", - new_name="Note", - ), - migrations.RenameField( - model_name="note", - old_name="comment", - new_name="note", - ), - migrations.AlterModelOptions( - name="note", - options={ - "ordering": ("created",), - "verbose_name": "note", - "verbose_name_plural": "notes", - }, - ), - migrations.AlterField( - model_name="note", - name="document", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="notes", - to="documents.document", - verbose_name="document", - ), - ), - migrations.AlterField( - model_name="note", - name="note", - field=models.TextField( - blank=True, - help_text="Note for the document", - verbose_name="content", - ), - ), - migrations.AlterField( - model_name="note", - name="user", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="notes", - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1023_add_comments.py b/src/documents/migrations/1023_add_comments.py deleted file mode 100644 index 0b26739bc0..0000000000 --- a/src/documents/migrations/1023_add_comments.py +++ /dev/null @@ -1,70 +0,0 @@ -import django.utils.timezone -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1022_paperlesstask"), - ] - - operations = [ - migrations.CreateModel( - name="Comment", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "comment", - models.TextField( - blank=True, - help_text="Comment for the document", - verbose_name="content", - ), - ), - ( - "created", - models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - verbose_name="created", - ), - ), - ( - "document", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="documents", - to="documents.document", - verbose_name="document", - ), - ), - ( - "user", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="users", - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - ], - options={ - "verbose_name": "comment", - "verbose_name_plural": "comments", - "ordering": ("created",), - }, - ), - ] diff --git a/src/documents/migrations/1024_document_original_filename.py b/src/documents/migrations/1024_document_original_filename.py deleted file mode 100644 index 05be7269ee..0000000000 --- a/src/documents/migrations/1024_document_original_filename.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.0.6 on 2022-07-25 06:34 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1023_add_comments"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="original_filename", - field=models.CharField( - default=None, - editable=False, - help_text="The original name of the file when it was uploaded", - max_length=1024, - null=True, - verbose_name="original filename", - ), - ), - ] diff --git a/src/documents/migrations/1025_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1025_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index a2deb95798..0000000000 --- a/src/documents/migrations/1025_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 4.0.5 on 2022-08-26 16:49 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1024_document_original_filename"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1026_transition_to_celery.py b/src/documents/migrations/1026_transition_to_celery.py deleted file mode 100644 index 227188d224..0000000000 --- a/src/documents/migrations/1026_transition_to_celery.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.1.1 on 2022-09-27 19:31 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("django_celery_results", "0011_taskresult_periodic_task_name"), - ("documents", "1025_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.RemoveField( - model_name="paperlesstask", - name="created", - ), - migrations.RemoveField( - model_name="paperlesstask", - name="name", - ), - migrations.RemoveField( - model_name="paperlesstask", - name="started", - ), - # Remove the field from the model - migrations.RemoveField( - model_name="paperlesstask", - name="attempted_task", - ), - # Add the field back, pointing to the correct model - # This resolves a problem where the temporary change in 1022 - # results in a type mismatch - migrations.AddField( - model_name="paperlesstask", - name="attempted_task", - field=models.OneToOneField( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="attempted_task", - to="django_celery_results.taskresult", - ), - ), - # Drop the django-q tables entirely - # Must be done last or there could be references here - migrations.RunSQL( - "DROP TABLE IF EXISTS django_q_ormq", - reverse_sql=migrations.RunSQL.noop, - ), - migrations.RunSQL( - "DROP TABLE IF EXISTS django_q_schedule", - reverse_sql=migrations.RunSQL.noop, - ), - migrations.RunSQL( - "DROP TABLE IF EXISTS django_q_task", - reverse_sql=migrations.RunSQL.noop, - ), - ] diff --git a/src/documents/migrations/1027_remove_paperlesstask_attempted_task_and_more.py b/src/documents/migrations/1027_remove_paperlesstask_attempted_task_and_more.py deleted file mode 100644 index c169c30969..0000000000 --- a/src/documents/migrations/1027_remove_paperlesstask_attempted_task_and_more.py +++ /dev/null @@ -1,134 +0,0 @@ -# Generated by Django 4.1.2 on 2022-10-17 16:31 - -import django.utils.timezone -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1026_transition_to_celery"), - ] - - operations = [ - migrations.RemoveField( - model_name="paperlesstask", - name="attempted_task", - ), - migrations.AddField( - model_name="paperlesstask", - name="date_created", - field=models.DateTimeField( - default=django.utils.timezone.now, - help_text="Datetime field when the task result was created in UTC", - null=True, - verbose_name="Created DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="date_done", - field=models.DateTimeField( - default=None, - help_text="Datetime field when the task was completed in UTC", - null=True, - verbose_name="Completed DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="date_started", - field=models.DateTimeField( - default=None, - help_text="Datetime field when the task was started in UTC", - null=True, - verbose_name="Started DateTime", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="result", - field=models.TextField( - default=None, - help_text="The data returned by the task", - null=True, - verbose_name="Result Data", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="status", - field=models.CharField( - choices=[ - ("FAILURE", "FAILURE"), - ("PENDING", "PENDING"), - ("RECEIVED", "RECEIVED"), - ("RETRY", "RETRY"), - ("REVOKED", "REVOKED"), - ("STARTED", "STARTED"), - ("SUCCESS", "SUCCESS"), - ], - default="PENDING", - help_text="Current state of the task being run", - max_length=30, - verbose_name="Task State", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_args", - field=models.JSONField( - help_text="JSON representation of the positional arguments used with the task", - null=True, - verbose_name="Task Positional Arguments", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_file_name", - field=models.CharField( - help_text="Name of the file which the Task was run for", - max_length=255, - null=True, - verbose_name="Task Name", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_kwargs", - field=models.JSONField( - help_text="JSON representation of the named arguments used with the task", - null=True, - verbose_name="Task Named Arguments", - ), - ), - migrations.AddField( - model_name="paperlesstask", - name="task_name", - field=models.CharField( - help_text="Name of the Task which was run", - max_length=255, - null=True, - verbose_name="Task Name", - ), - ), - migrations.AlterField( - model_name="paperlesstask", - name="acknowledged", - field=models.BooleanField( - default=False, - help_text="If the task is acknowledged via the frontend or API", - verbose_name="Acknowledged", - ), - ), - migrations.AlterField( - model_name="paperlesstask", - name="task_id", - field=models.CharField( - help_text="Celery ID for the Task that was run", - max_length=255, - unique=True, - verbose_name="Task ID", - ), - ), - ] diff --git a/src/documents/migrations/1028_remove_paperlesstask_task_args_and_more.py b/src/documents/migrations/1028_remove_paperlesstask_task_args_and_more.py deleted file mode 100644 index 6e03c124b3..0000000000 --- a/src/documents/migrations/1028_remove_paperlesstask_task_args_and_more.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.1.3 on 2022-11-22 17:50 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1027_remove_paperlesstask_attempted_task_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="paperlesstask", - name="task_args", - ), - migrations.RemoveField( - model_name="paperlesstask", - name="task_kwargs", - ), - ] diff --git a/src/documents/migrations/1029_alter_document_archive_serial_number.py b/src/documents/migrations/1029_alter_document_archive_serial_number.py deleted file mode 100644 index 57848b2dcb..0000000000 --- a/src/documents/migrations/1029_alter_document_archive_serial_number.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 4.1.4 on 2023-01-24 17:56 - -import django.core.validators -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1028_remove_paperlesstask_task_args_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="archive_serial_number", - field=models.PositiveIntegerField( - blank=True, - db_index=True, - help_text="The position of this document in your physical document archive.", - null=True, - unique=True, - validators=[ - django.core.validators.MaxValueValidator(4294967295), - django.core.validators.MinValueValidator(0), - ], - verbose_name="archive serial number", - ), - ), - ] diff --git a/src/documents/migrations/1030_alter_paperlesstask_task_file_name.py b/src/documents/migrations/1030_alter_paperlesstask_task_file_name.py deleted file mode 100644 index 37e918beef..0000000000 --- a/src/documents/migrations/1030_alter_paperlesstask_task_file_name.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.1.5 on 2023-02-03 21:53 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1029_alter_document_archive_serial_number"), - ] - - operations = [ - migrations.AlterField( - model_name="paperlesstask", - name="task_file_name", - field=models.CharField( - help_text="Name of the file which the Task was run for", - max_length=255, - null=True, - verbose_name="Task Filename", - ), - ), - ] diff --git a/src/documents/migrations/1031_remove_savedview_user_correspondent_owner_and_more.py b/src/documents/migrations/1031_remove_savedview_user_correspondent_owner_and_more.py deleted file mode 100644 index 56e4355ef2..0000000000 --- a/src/documents/migrations/1031_remove_savedview_user_correspondent_owner_and_more.py +++ /dev/null @@ -1,87 +0,0 @@ -# Generated by Django 4.1.4 on 2022-02-03 04:24 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1030_alter_paperlesstask_task_file_name"), - ] - - operations = [ - migrations.RenameField( - model_name="savedview", - old_name="user", - new_name="owner", - ), - migrations.AlterField( - model_name="savedview", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="correspondent", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="document", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="documenttype", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="storagepath", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AddField( - model_name="tag", - name="owner", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - ] diff --git a/src/documents/migrations/1032_alter_correspondent_matching_algorithm_and_more.py b/src/documents/migrations/1032_alter_correspondent_matching_algorithm_and_more.py deleted file mode 100644 index 3d1c5658a2..0000000000 --- a/src/documents/migrations/1032_alter_correspondent_matching_algorithm_and_more.py +++ /dev/null @@ -1,81 +0,0 @@ -# Generated by Django 4.1.7 on 2023-02-22 00:45 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1031_remove_savedview_user_correspondent_owner_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="correspondent", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="storagepath", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - migrations.AlterField( - model_name="tag", - name="matching_algorithm", - field=models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - (6, "Automatic"), - ], - default=1, - verbose_name="matching algorithm", - ), - ), - ] diff --git a/src/documents/migrations/1034_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1034_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index b648ac839c..0000000000 --- a/src/documents/migrations/1034_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,54 +0,0 @@ -# Generated by Django 4.1.5 on 2023-03-15 07:10 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1033_alter_documenttype_options_alter_tag_options_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1035_rename_comment_note.py b/src/documents/migrations/1035_rename_comment_note.py deleted file mode 100644 index 9f9aaca941..0000000000 --- a/src/documents/migrations/1035_rename_comment_note.py +++ /dev/null @@ -1,62 +0,0 @@ -# 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 - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1034_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.RenameModel( - old_name="Comment", - new_name="Note", - ), - migrations.RenameField(model_name="note", old_name="comment", new_name="note"), - migrations.AlterModelOptions( - name="note", - options={ - "ordering": ("created",), - "verbose_name": "note", - "verbose_name_plural": "notes", - }, - ), - migrations.AlterField( - model_name="note", - name="document", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="notes", - to="documents.document", - verbose_name="document", - ), - ), - migrations.AlterField( - model_name="note", - name="note", - field=models.TextField( - blank=True, - help_text="Note for the document", - verbose_name="content", - ), - ), - migrations.AlterField( - model_name="note", - name="user", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="notes", - to=settings.AUTH_USER_MODEL, - verbose_name="user", - ), - ), - ] diff --git a/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index e65586ad89..0000000000 --- a/src/documents/migrations/1036_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 4.1.7 on 2023-05-04 04:11 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1035_rename_comment_note"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1037_webp_encrypted_thumbnail_conversion.py b/src/documents/migrations/1037_webp_encrypted_thumbnail_conversion.py deleted file mode 100644 index 13996132fe..0000000000 --- a/src/documents/migrations/1037_webp_encrypted_thumbnail_conversion.py +++ /dev/null @@ -1,164 +0,0 @@ -# Generated by Django 4.1.9 on 2023-06-29 19:29 -import logging -import multiprocessing.pool -import shutil -import tempfile -import time -from pathlib import Path - -import gnupg -from django.conf import settings -from django.db import migrations - -from documents.parsers import run_convert - -logger = logging.getLogger("paperless.migrations") - - -def _do_convert(work_package) -> None: - ( - existing_encrypted_thumbnail, - converted_encrypted_thumbnail, - passphrase, - ) = work_package - - try: - gpg = gnupg.GPG(gnupghome=settings.GNUPG_HOME) - - logger.info(f"Decrypting thumbnail: {existing_encrypted_thumbnail}") - - # Decrypt png - decrypted_thumbnail = existing_encrypted_thumbnail.with_suffix("").resolve() - - with existing_encrypted_thumbnail.open("rb") as existing_encrypted_file: - raw_thumb = gpg.decrypt_file( - existing_encrypted_file, - passphrase=passphrase, - always_trust=True, - ).data - with Path(decrypted_thumbnail).open("wb") as decrypted_file: - decrypted_file.write(raw_thumb) - - converted_decrypted_thumbnail = Path( - str(converted_encrypted_thumbnail).replace("webp.gpg", "webp"), - ).resolve() - - logger.info(f"Converting decrypted thumbnail: {decrypted_thumbnail}") - - # Convert to webp - run_convert( - density=300, - scale="500x5000>", - alpha="remove", - strip=True, - trim=False, - auto_orient=True, - input_file=f"{decrypted_thumbnail}[0]", - output_file=str(converted_decrypted_thumbnail), - ) - - logger.info( - f"Encrypting converted thumbnail: {converted_decrypted_thumbnail}", - ) - - # Encrypt webp - with Path(converted_decrypted_thumbnail).open("rb") as converted_decrypted_file: - encrypted = gpg.encrypt_file( - fileobj_or_path=converted_decrypted_file, - recipients=None, - passphrase=passphrase, - symmetric=True, - always_trust=True, - ).data - - with Path(converted_encrypted_thumbnail).open( - "wb", - ) as converted_encrypted_file: - converted_encrypted_file.write(encrypted) - - # Copy newly created thumbnail to thumbnail directory - shutil.copy(converted_encrypted_thumbnail, existing_encrypted_thumbnail.parent) - - # Remove the existing encrypted PNG version - existing_encrypted_thumbnail.unlink() - - # Remove the decrypted PNG version - decrypted_thumbnail.unlink() - - # Remove the decrypted WebP version - converted_decrypted_thumbnail.unlink() - - logger.info( - "Conversion to WebP completed, " - f"replaced {existing_encrypted_thumbnail.name} with {converted_encrypted_thumbnail.name}", - ) - - except Exception as e: - logger.error(f"Error converting thumbnail (existing file unchanged): {e}") - - -def _convert_encrypted_thumbnails_to_webp(apps, schema_editor) -> None: - start: float = time.time() - - with tempfile.TemporaryDirectory() as tempdir: - work_packages = [] - - if len(list(Path(settings.THUMBNAIL_DIR).glob("*.png.gpg"))) > 0: - passphrase = settings.PASSPHRASE - - if not passphrase: - raise Exception( - "Passphrase not defined, encrypted thumbnails cannot be migrated" - "without this", - ) - - for file in Path(settings.THUMBNAIL_DIR).glob("*.png.gpg"): - existing_thumbnail: Path = file.resolve() - - # Change the existing filename suffix from png to webp - converted_thumbnail_name: str = Path( - str(existing_thumbnail).replace(".png.gpg", ".webp.gpg"), - ).name - - # Create the expected output filename in the tempdir - converted_thumbnail: Path = ( - Path(tempdir) / Path(converted_thumbnail_name) - ).resolve() - - # Package up the necessary info - work_packages.append( - (existing_thumbnail, converted_thumbnail, passphrase), - ) - - if work_packages: - logger.info( - "\n\n" - " This is a one-time only migration to convert thumbnails for all of your\n" - " *encrypted* documents into WebP format. If you have a lot of encrypted documents, \n" - " this may take a while, so a coffee break may be in order." - "\n", - ) - - with multiprocessing.pool.Pool( - processes=min(multiprocessing.cpu_count(), 4), - maxtasksperchild=4, - ) as pool: - pool.map(_do_convert, work_packages) - - end: float = time.time() - duration: float = end - start - - logger.info(f"Conversion completed in {duration:.3f}s") - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1036_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.RunPython( - code=_convert_encrypted_thumbnails_to_webp, - reverse_code=migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1038_sharelink.py b/src/documents/migrations/1038_sharelink.py deleted file mode 100644 index fa2860b6ff..0000000000 --- a/src/documents/migrations/1038_sharelink.py +++ /dev/null @@ -1,126 +0,0 @@ -# Generated by Django 4.1.10 on 2023-08-14 14:51 - -import django.db.models.deletion -import django.utils.timezone -from django.conf import settings -from django.contrib.auth.management import create_permissions -from django.contrib.auth.models import Group -from django.contrib.auth.models import Permission -from django.contrib.auth.models import User -from django.db import migrations -from django.db import models -from django.db.models import Q - - -def add_sharelink_permissions(apps, schema_editor): - # create permissions without waiting for post_migrate signal - for app_config in apps.get_app_configs(): - app_config.models_module = True - create_permissions(app_config, apps=apps, verbosity=0) - app_config.models_module = None - - add_permission = Permission.objects.get(codename="add_document") - sharelink_permissions = Permission.objects.filter(codename__contains="sharelink") - - for user in User.objects.filter(Q(user_permissions=add_permission)).distinct(): - user.user_permissions.add(*sharelink_permissions) - - for group in Group.objects.filter(Q(permissions=add_permission)).distinct(): - group.permissions.add(*sharelink_permissions) - - -def remove_sharelink_permissions(apps, schema_editor): - sharelink_permissions = Permission.objects.filter(codename__contains="sharelink") - - for user in User.objects.all(): - user.user_permissions.remove(*sharelink_permissions) - - for group in Group.objects.all(): - group.permissions.remove(*sharelink_permissions) - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1037_webp_encrypted_thumbnail_conversion"), - ] - - operations = [ - migrations.CreateModel( - name="ShareLink", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - models.DateTimeField( - blank=True, - db_index=True, - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - ( - "expiration", - models.DateTimeField( - blank=True, - db_index=True, - null=True, - verbose_name="expiration", - ), - ), - ( - "slug", - models.SlugField( - blank=True, - editable=False, - unique=True, - verbose_name="slug", - ), - ), - ( - "file_version", - models.CharField( - choices=[("archive", "Archive"), ("original", "Original")], - default="archive", - max_length=50, - ), - ), - ( - "document", - models.ForeignKey( - blank=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="share_links", - to="documents.document", - verbose_name="document", - ), - ), - ( - "owner", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="share_links", - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - ], - options={ - "verbose_name": "share link", - "verbose_name_plural": "share links", - "ordering": ("created",), - }, - ), - migrations.RunPython(add_sharelink_permissions, remove_sharelink_permissions), - ] diff --git a/src/documents/migrations/1039_consumptiontemplate.py b/src/documents/migrations/1039_consumptiontemplate.py deleted file mode 100644 index cf8b9fd917..0000000000 --- a/src/documents/migrations/1039_consumptiontemplate.py +++ /dev/null @@ -1,219 +0,0 @@ -# Generated by Django 4.1.11 on 2023-09-16 18:04 - -import django.db.models.deletion -import multiselectfield.db.fields -from django.conf import settings -from django.contrib.auth.management import create_permissions -from django.contrib.auth.models import Group -from django.contrib.auth.models import Permission -from django.contrib.auth.models import User -from django.db import migrations -from django.db import models -from django.db.models import Q - - -def add_consumptiontemplate_permissions(apps, schema_editor): - # create permissions without waiting for post_migrate signal - for app_config in apps.get_app_configs(): - app_config.models_module = True - create_permissions(app_config, apps=apps, verbosity=0) - app_config.models_module = None - - add_permission = Permission.objects.get(codename="add_document") - consumptiontemplate_permissions = Permission.objects.filter( - codename__contains="consumptiontemplate", - ) - - for user in User.objects.filter(Q(user_permissions=add_permission)).distinct(): - user.user_permissions.add(*consumptiontemplate_permissions) - - for group in Group.objects.filter(Q(permissions=add_permission)).distinct(): - group.permissions.add(*consumptiontemplate_permissions) - - -def remove_consumptiontemplate_permissions(apps, schema_editor): - consumptiontemplate_permissions = Permission.objects.filter( - codename__contains="consumptiontemplate", - ) - - for user in User.objects.all(): - user.user_permissions.remove(*consumptiontemplate_permissions) - - for group in Group.objects.all(): - group.permissions.remove(*consumptiontemplate_permissions) - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("auth", "0012_alter_user_first_name_max_length"), - ("documents", "1038_sharelink"), - ("paperless_mail", "0021_alter_mailaccount_password"), - ] - - operations = [ - migrations.CreateModel( - name="ConsumptionTemplate", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "name", - models.CharField(max_length=256, unique=True, verbose_name="name"), - ), - ("order", models.IntegerField(default=0, verbose_name="order")), - ( - "sources", - multiselectfield.db.fields.MultiSelectField( - choices=[ - (1, "Consume Folder"), - (2, "Api Upload"), - (3, "Mail Fetch"), - ], - default="1,2,3", - max_length=3, - ), - ), - ( - "filter_path", - models.CharField( - blank=True, - help_text="Only consume documents with a path that matches this if specified. Wildcards specified as * are allowed. Case insensitive.", - max_length=256, - null=True, - verbose_name="filter path", - ), - ), - ( - "filter_filename", - models.CharField( - blank=True, - help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", - max_length=256, - null=True, - verbose_name="filter filename", - ), - ), - ( - "filter_mailrule", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="paperless_mail.mailrule", - verbose_name="filter documents from this mail rule", - ), - ), - ( - "assign_change_groups", - models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="grant change permissions to these groups", - ), - ), - ( - "assign_change_users", - models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="grant change permissions to these users", - ), - ), - ( - "assign_correspondent", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.correspondent", - verbose_name="assign this correspondent", - ), - ), - ( - "assign_document_type", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.documenttype", - verbose_name="assign this document type", - ), - ), - ( - "assign_owner", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="assign this owner", - ), - ), - ( - "assign_storage_path", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.storagepath", - verbose_name="assign this storage path", - ), - ), - ( - "assign_tags", - models.ManyToManyField( - blank=True, - to="documents.tag", - verbose_name="assign this tag", - ), - ), - ( - "assign_title", - models.CharField( - blank=True, - help_text="Assign a document title, can include some placeholders, see documentation.", - max_length=256, - null=True, - verbose_name="assign title", - ), - ), - ( - "assign_view_groups", - models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="grant view permissions to these groups", - ), - ), - ( - "assign_view_users", - models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="grant view permissions to these users", - ), - ), - ], - options={ - "verbose_name": "consumption template", - "verbose_name_plural": "consumption templates", - }, - ), - migrations.RunPython( - add_consumptiontemplate_permissions, - remove_consumptiontemplate_permissions, - ), - ] diff --git a/src/documents/migrations/1040_customfield_customfieldinstance_and_more.py b/src/documents/migrations/1040_customfield_customfieldinstance_and_more.py deleted file mode 100644 index ecd715a578..0000000000 --- a/src/documents/migrations/1040_customfield_customfieldinstance_and_more.py +++ /dev/null @@ -1,171 +0,0 @@ -# Generated by Django 4.2.6 on 2023-11-02 17:38 - -import django.db.models.deletion -import django.utils.timezone -from django.contrib.auth.management import create_permissions -from django.contrib.auth.models import Group -from django.contrib.auth.models import Permission -from django.contrib.auth.models import User -from django.db import migrations -from django.db import models -from django.db.models import Q - - -def add_customfield_permissions(apps, schema_editor): - # create permissions without waiting for post_migrate signal - for app_config in apps.get_app_configs(): - app_config.models_module = True - create_permissions(app_config, apps=apps, verbosity=0) - app_config.models_module = None - - add_permission = Permission.objects.get(codename="add_document") - customfield_permissions = Permission.objects.filter( - codename__contains="customfield", - ) - - for user in User.objects.filter(Q(user_permissions=add_permission)).distinct(): - user.user_permissions.add(*customfield_permissions) - - for group in Group.objects.filter(Q(permissions=add_permission)).distinct(): - group.permissions.add(*customfield_permissions) - - -def remove_customfield_permissions(apps, schema_editor): - customfield_permissions = Permission.objects.filter( - codename__contains="customfield", - ) - - for user in User.objects.all(): - user.user_permissions.remove(*customfield_permissions) - - for group in Group.objects.all(): - group.permissions.remove(*customfield_permissions) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1039_consumptiontemplate"), - ] - - operations = [ - migrations.CreateModel( - name="CustomField", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - ("name", models.CharField(max_length=128)), - ( - "data_type", - models.CharField( - choices=[ - ("string", "String"), - ("url", "URL"), - ("date", "Date"), - ("boolean", "Boolean"), - ("integer", "Integer"), - ("float", "Float"), - ("monetary", "Monetary"), - ], - editable=False, - max_length=50, - verbose_name="data type", - ), - ), - ], - options={ - "verbose_name": "custom field", - "verbose_name_plural": "custom fields", - "ordering": ("created",), - }, - ), - migrations.CreateModel( - name="CustomFieldInstance", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "created", - models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - editable=False, - verbose_name="created", - ), - ), - ("value_text", models.CharField(max_length=128, null=True)), - ("value_bool", models.BooleanField(null=True)), - ("value_url", models.URLField(null=True)), - ("value_date", models.DateField(null=True)), - ("value_int", models.IntegerField(null=True)), - ("value_float", models.FloatField(null=True)), - ( - "value_monetary", - models.DecimalField(decimal_places=2, max_digits=12, null=True), - ), - ( - "document", - models.ForeignKey( - editable=False, - on_delete=django.db.models.deletion.CASCADE, - related_name="custom_fields", - to="documents.document", - ), - ), - ( - "field", - models.ForeignKey( - editable=False, - on_delete=django.db.models.deletion.CASCADE, - related_name="fields", - to="documents.customfield", - ), - ), - ], - options={ - "verbose_name": "custom field instance", - "verbose_name_plural": "custom field instances", - "ordering": ("created",), - }, - ), - migrations.AddConstraint( - model_name="customfield", - constraint=models.UniqueConstraint( - fields=("name",), - name="documents_customfield_unique_name", - ), - ), - migrations.AddConstraint( - model_name="customfieldinstance", - constraint=models.UniqueConstraint( - fields=("document", "field"), - name="documents_customfieldinstance_unique_document_field", - ), - ), - migrations.RunPython( - add_customfield_permissions, - remove_customfield_permissions, - ), - ] diff --git a/src/documents/migrations/1041_alter_consumptiontemplate_sources.py b/src/documents/migrations/1041_alter_consumptiontemplate_sources.py deleted file mode 100644 index c96dc53cfb..0000000000 --- a/src/documents/migrations/1041_alter_consumptiontemplate_sources.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.7 on 2023-11-30 14:29 - -import multiselectfield.db.fields -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1040_customfield_customfieldinstance_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="consumptiontemplate", - name="sources", - field=multiselectfield.db.fields.MultiSelectField( - choices=[(1, "Consume Folder"), (2, "Api Upload"), (3, "Mail Fetch")], - default="1,2,3", - max_length=5, - ), - ), - ] diff --git a/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields_and_more.py b/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields_and_more.py deleted file mode 100644 index ffd0dbefa2..0000000000 --- a/src/documents/migrations/1042_consumptiontemplate_assign_custom_fields_and_more.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 4.2.7 on 2023-12-04 04:03 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1041_alter_consumptiontemplate_sources"), - ] - - operations = [ - migrations.AddField( - model_name="consumptiontemplate", - name="assign_custom_fields", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.customfield", - verbose_name="assign these custom fields", - ), - ), - migrations.AddField( - model_name="customfieldinstance", - name="value_document_ids", - field=models.JSONField(null=True), - ), - migrations.AlterField( - model_name="customfield", - name="data_type", - field=models.CharField( - choices=[ - ("string", "String"), - ("url", "URL"), - ("date", "Date"), - ("boolean", "Boolean"), - ("integer", "Integer"), - ("float", "Float"), - ("monetary", "Monetary"), - ("documentlink", "Document Link"), - ], - editable=False, - max_length=50, - verbose_name="data type", - ), - ), - ] diff --git a/src/documents/migrations/1043_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1043_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index bd62673dfc..0000000000 --- a/src/documents/migrations/1043_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.2.7 on 2023-12-09 18:13 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1042_consumptiontemplate_assign_custom_fields_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - (36, "has custom field value"), - (37, "is shared by me"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py b/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py deleted file mode 100644 index 2cdd631bb9..0000000000 --- a/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py +++ /dev/null @@ -1,524 +0,0 @@ -# Generated by Django 4.2.7 on 2023-12-23 22:51 - -import django.db.models.deletion -import multiselectfield.db.fields -from django.conf import settings -from django.contrib.auth.management import create_permissions -from django.db import migrations -from django.db import models -from django.db import transaction -from django.db.models import Q - - -def add_workflow_permissions(apps, schema_editor): - app_name = "auth" - User = apps.get_model(app_label=app_name, model_name="User") - Group = apps.get_model(app_label=app_name, model_name="Group") - Permission = apps.get_model(app_label=app_name, model_name="Permission") - # create permissions without waiting for post_migrate signal - for app_config in apps.get_app_configs(): - app_config.models_module = True - create_permissions(app_config, apps=apps, verbosity=0) - app_config.models_module = None - - add_permission = Permission.objects.get(codename="add_document") - workflow_permissions = Permission.objects.filter( - codename__contains="workflow", - ) - - for user in User.objects.filter(Q(user_permissions=add_permission)).distinct(): - user.user_permissions.add(*workflow_permissions) - - for group in Group.objects.filter(Q(permissions=add_permission)).distinct(): - group.permissions.add(*workflow_permissions) - - -def remove_workflow_permissions(apps, schema_editor): - app_name = "auth" - User = apps.get_model(app_label=app_name, model_name="User") - Group = apps.get_model(app_label=app_name, model_name="Group") - Permission = apps.get_model(app_label=app_name, model_name="Permission") - workflow_permissions = Permission.objects.filter( - codename__contains="workflow", - ) - - for user in User.objects.all(): - user.user_permissions.remove(*workflow_permissions) - - for group in Group.objects.all(): - group.permissions.remove(*workflow_permissions) - - -def migrate_consumption_templates(apps, schema_editor): - """ - Migrate consumption templates to workflows. At this point ConsumptionTemplate still exists - but objects are not returned as their true model so we have to manually do that - """ - app_name = "documents" - - ConsumptionTemplate = apps.get_model( - app_label=app_name, - model_name="ConsumptionTemplate", - ) - Workflow = apps.get_model(app_label=app_name, model_name="Workflow") - WorkflowAction = apps.get_model(app_label=app_name, model_name="WorkflowAction") - WorkflowTrigger = apps.get_model(app_label=app_name, model_name="WorkflowTrigger") - DocumentType = apps.get_model(app_label=app_name, model_name="DocumentType") - Correspondent = apps.get_model(app_label=app_name, model_name="Correspondent") - StoragePath = apps.get_model(app_label=app_name, model_name="StoragePath") - Tag = apps.get_model(app_label=app_name, model_name="Tag") - CustomField = apps.get_model(app_label=app_name, model_name="CustomField") - MailRule = apps.get_model(app_label="paperless_mail", model_name="MailRule") - User = apps.get_model(app_label="auth", model_name="User") - Group = apps.get_model(app_label="auth", model_name="Group") - - with transaction.atomic(): - for template in ConsumptionTemplate.objects.all(): - trigger = WorkflowTrigger( - type=1, # WorkflowTriggerType.CONSUMPTION - sources=template.sources, - filter_path=template.filter_path, - filter_filename=template.filter_filename, - ) - if template.filter_mailrule is not None: - trigger.filter_mailrule = MailRule.objects.get( - id=template.filter_mailrule.id, - ) - trigger.save() - - action = WorkflowAction.objects.create( - assign_title=template.assign_title, - ) - if template.assign_document_type is not None: - action.assign_document_type = DocumentType.objects.get( - id=template.assign_document_type.id, - ) - if template.assign_correspondent is not None: - action.assign_correspondent = Correspondent.objects.get( - id=template.assign_correspondent.id, - ) - if template.assign_storage_path is not None: - action.assign_storage_path = StoragePath.objects.get( - id=template.assign_storage_path.id, - ) - if template.assign_owner is not None: - action.assign_owner = User.objects.get(id=template.assign_owner.id) - if template.assign_tags is not None: - action.assign_tags.set( - Tag.objects.filter( - id__in=[t.id for t in template.assign_tags.all()], - ).all(), - ) - if template.assign_view_users is not None: - action.assign_view_users.set( - User.objects.filter( - id__in=[u.id for u in template.assign_view_users.all()], - ).all(), - ) - if template.assign_view_groups is not None: - action.assign_view_groups.set( - Group.objects.filter( - id__in=[g.id for g in template.assign_view_groups.all()], - ).all(), - ) - if template.assign_change_users is not None: - action.assign_change_users.set( - User.objects.filter( - id__in=[u.id for u in template.assign_change_users.all()], - ).all(), - ) - if template.assign_change_groups is not None: - action.assign_change_groups.set( - Group.objects.filter( - id__in=[g.id for g in template.assign_change_groups.all()], - ).all(), - ) - if template.assign_custom_fields is not None: - action.assign_custom_fields.set( - CustomField.objects.filter( - id__in=[cf.id for cf in template.assign_custom_fields.all()], - ).all(), - ) - action.save() - - workflow = Workflow.objects.create( - name=template.name, - order=template.order, - ) - workflow.triggers.set([trigger]) - workflow.actions.set([action]) - workflow.save() - - -def unmigrate_consumption_templates(apps, schema_editor): - app_name = "documents" - - ConsumptionTemplate = apps.get_model( - app_label=app_name, - model_name="ConsumptionTemplate", - ) - Workflow = apps.get_model(app_label=app_name, model_name="Workflow") - - for workflow in Workflow.objects.all(): - template = ConsumptionTemplate.objects.create( - name=workflow.name, - order=workflow.order, - sources=workflow.triggers.first().sources, - filter_path=workflow.triggers.first().filter_path, - filter_filename=workflow.triggers.first().filter_filename, - filter_mailrule=workflow.triggers.first().filter_mailrule, - assign_title=workflow.actions.first().assign_title, - assign_document_type=workflow.actions.first().assign_document_type, - assign_correspondent=workflow.actions.first().assign_correspondent, - assign_storage_path=workflow.actions.first().assign_storage_path, - assign_owner=workflow.actions.first().assign_owner, - ) - template.assign_tags.set(workflow.actions.first().assign_tags.all()) - template.assign_view_users.set(workflow.actions.first().assign_view_users.all()) - template.assign_view_groups.set( - workflow.actions.first().assign_view_groups.all(), - ) - template.assign_change_users.set( - workflow.actions.first().assign_change_users.all(), - ) - template.assign_change_groups.set( - workflow.actions.first().assign_change_groups.all(), - ) - template.assign_custom_fields.set( - workflow.actions.first().assign_custom_fields.all(), - ) - template.save() - - -def delete_consumption_template_content_type(apps, schema_editor): - with transaction.atomic(): - apps.get_model("contenttypes", "ContentType").objects.filter( - app_label="documents", - model="consumptiontemplate", - ).delete() - - -def undelete_consumption_template_content_type(apps, schema_editor): - apps.get_model("contenttypes", "ContentType").objects.create( - app_label="documents", - model="consumptiontemplate", - ) - - -class Migration(migrations.Migration): - dependencies = [ - ("paperless_mail", "0023_remove_mailrule_filter_attachment_filename_and_more"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("auth", "0012_alter_user_first_name_max_length"), - ("documents", "1043_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.CreateModel( - name="Workflow", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "name", - models.CharField(max_length=256, unique=True, verbose_name="name"), - ), - ("order", models.IntegerField(default=0, verbose_name="order")), - ( - "enabled", - models.BooleanField(default=True, verbose_name="enabled"), - ), - ], - ), - migrations.CreateModel( - name="WorkflowAction", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "type", - models.PositiveIntegerField( - choices=[(1, "Assignment")], - default=1, - verbose_name="Workflow Action Type", - ), - ), - ( - "assign_title", - models.CharField( - blank=True, - help_text="Assign a document title, can include some placeholders, see documentation.", - max_length=256, - null=True, - verbose_name="assign title", - ), - ), - ( - "assign_change_groups", - models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="grant change permissions to these groups", - ), - ), - ( - "assign_change_users", - models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="grant change permissions to these users", - ), - ), - ( - "assign_correspondent", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.correspondent", - verbose_name="assign this correspondent", - ), - ), - ( - "assign_custom_fields", - models.ManyToManyField( - blank=True, - related_name="+", - to="documents.customfield", - verbose_name="assign these custom fields", - ), - ), - ( - "assign_document_type", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.documenttype", - verbose_name="assign this document type", - ), - ), - ( - "assign_owner", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="assign this owner", - ), - ), - ( - "assign_storage_path", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.storagepath", - verbose_name="assign this storage path", - ), - ), - ( - "assign_tags", - models.ManyToManyField( - blank=True, - to="documents.tag", - verbose_name="assign this tag", - ), - ), - ( - "assign_view_groups", - models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="grant view permissions to these groups", - ), - ), - ( - "assign_view_users", - models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="grant view permissions to these users", - ), - ), - ], - options={ - "verbose_name": "workflow action", - "verbose_name_plural": "workflow actions", - }, - ), - migrations.CreateModel( - name="WorkflowTrigger", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "type", - models.PositiveIntegerField( - choices=[ - (1, "Consumption Started"), - (2, "Document Added"), - (3, "Document Updated"), - ], - default=1, - verbose_name="Workflow Trigger Type", - ), - ), - ( - "sources", - multiselectfield.db.fields.MultiSelectField( - choices=[ - (1, "Consume Folder"), - (2, "Api Upload"), - (3, "Mail Fetch"), - ], - default="1,2,3", - max_length=5, - ), - ), - ( - "filter_path", - models.CharField( - blank=True, - help_text="Only consume documents with a path that matches this if specified. Wildcards specified as * are allowed. Case insensitive.", - max_length=256, - null=True, - verbose_name="filter path", - ), - ), - ( - "filter_filename", - models.CharField( - blank=True, - help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", - max_length=256, - null=True, - verbose_name="filter filename", - ), - ), - ( - "filter_mailrule", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="paperless_mail.mailrule", - verbose_name="filter documents from this mail rule", - ), - ), - ( - "matching_algorithm", - models.PositiveIntegerField( - choices=[ - (0, "None"), - (1, "Any word"), - (2, "All words"), - (3, "Exact match"), - (4, "Regular expression"), - (5, "Fuzzy word"), - ], - default=0, - verbose_name="matching algorithm", - ), - ), - ( - "match", - models.CharField(blank=True, max_length=256, verbose_name="match"), - ), - ( - "is_insensitive", - models.BooleanField(default=True, verbose_name="is insensitive"), - ), - ( - "filter_has_tags", - models.ManyToManyField( - blank=True, - to="documents.tag", - verbose_name="has these tag(s)", - ), - ), - ( - "filter_has_document_type", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.documenttype", - verbose_name="has this document type", - ), - ), - ( - "filter_has_correspondent", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.correspondent", - verbose_name="has this correspondent", - ), - ), - ], - options={ - "verbose_name": "workflow trigger", - "verbose_name_plural": "workflow triggers", - }, - ), - migrations.RunPython( - add_workflow_permissions, - remove_workflow_permissions, - ), - migrations.AddField( - model_name="workflow", - name="actions", - field=models.ManyToManyField( - related_name="workflows", - to="documents.workflowaction", - verbose_name="actions", - ), - ), - migrations.AddField( - model_name="workflow", - name="triggers", - field=models.ManyToManyField( - related_name="workflows", - to="documents.workflowtrigger", - verbose_name="triggers", - ), - ), - migrations.RunPython( - migrate_consumption_templates, - unmigrate_consumption_templates, - ), - migrations.DeleteModel("ConsumptionTemplate"), - migrations.RunPython( - delete_consumption_template_content_type, - undelete_consumption_template_content_type, - ), - ] diff --git a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py b/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py deleted file mode 100644 index 597fbb7f93..0000000000 --- a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.10 on 2024-02-22 03:52 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1044_workflow_workflowaction_workflowtrigger_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="customfieldinstance", - name="value_monetary", - field=models.CharField(max_length=128, null=True), - ), - ] diff --git a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary_squashed_1049_document_deleted_at_document_restored_at.py b/src/documents/migrations/1045_alter_customfieldinstance_value_monetary_squashed_1049_document_deleted_at_document_restored_at.py deleted file mode 100644 index 2987e4812c..0000000000 --- a/src/documents/migrations/1045_alter_customfieldinstance_value_monetary_squashed_1049_document_deleted_at_document_restored_at.py +++ /dev/null @@ -1,331 +0,0 @@ -# Generated by Django 4.2.13 on 2024-06-28 19:39 - -import django.core.validators -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - replaces = [ - ("documents", "1045_alter_customfieldinstance_value_monetary"), - ("documents", "1046_workflowaction_remove_all_correspondents_and_more"), - ("documents", "1047_savedview_display_mode_and_more"), - ("documents", "1048_alter_savedviewfilterrule_rule_type"), - ("documents", "1049_document_deleted_at_document_restored_at"), - ] - - dependencies = [ - ("documents", "1044_workflow_workflowaction_workflowtrigger_and_more"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("auth", "0012_alter_user_first_name_max_length"), - ] - - operations = [ - migrations.AlterField( - model_name="customfieldinstance", - name="value_monetary", - field=models.CharField(max_length=128, null=True), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_correspondents", - field=models.BooleanField( - default=False, - verbose_name="remove all correspondents", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_custom_fields", - field=models.BooleanField( - default=False, - verbose_name="remove all custom fields", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_document_types", - field=models.BooleanField( - default=False, - verbose_name="remove all document types", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_owners", - field=models.BooleanField(default=False, verbose_name="remove all owners"), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_permissions", - field=models.BooleanField( - default=False, - verbose_name="remove all permissions", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_storage_paths", - field=models.BooleanField( - default=False, - verbose_name="remove all storage paths", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_tags", - field=models.BooleanField(default=False, verbose_name="remove all tags"), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_change_groups", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="remove change permissions for these groups", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_change_users", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove change permissions for these users", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_correspondents", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.correspondent", - verbose_name="remove these correspondent(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_custom_fields", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.customfield", - verbose_name="remove these custom fields", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_document_types", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.documenttype", - verbose_name="remove these document type(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_owners", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove these owner(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_storage_paths", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.storagepath", - verbose_name="remove these storage path(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_tags", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.tag", - verbose_name="remove these tag(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_view_groups", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="remove view permissions for these groups", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_view_users", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove view permissions for these users", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.correspondent", - verbose_name="assign this correspondent", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_document_type", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.documenttype", - verbose_name="assign this document type", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_storage_path", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.storagepath", - verbose_name="assign this storage path", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_tags", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.tag", - verbose_name="assign this tag", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="type", - field=models.PositiveIntegerField( - choices=[(1, "Assignment"), (2, "Removal")], - default=1, - verbose_name="Workflow Action Type", - ), - ), - migrations.AddField( - model_name="savedview", - name="display_mode", - field=models.CharField( - blank=True, - choices=[ - ("table", "Table"), - ("smallCards", "Small Cards"), - ("largeCards", "Large Cards"), - ], - max_length=128, - null=True, - verbose_name="View display mode", - ), - ), - migrations.AddField( - model_name="savedview", - name="page_size", - field=models.PositiveIntegerField( - blank=True, - null=True, - validators=[django.core.validators.MinValueValidator(1)], - verbose_name="View page size", - ), - ), - migrations.AddField( - model_name="savedview", - name="display_fields", - field=models.JSONField( - blank=True, - null=True, - verbose_name="Document display fields", - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - (36, "has custom field value"), - (37, "is shared by me"), - (38, "has custom fields"), - (39, "has custom field in"), - (40, "does not have custom field in"), - (41, "does not have custom field"), - ], - verbose_name="rule type", - ), - ), - migrations.AddField( - model_name="document", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="document", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py b/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py deleted file mode 100644 index 3ab010a3ce..0000000000 --- a/src/documents/migrations/1046_workflowaction_remove_all_correspondents_and_more.py +++ /dev/null @@ -1,222 +0,0 @@ -# Generated by Django 4.2.10 on 2024-02-21 21:19 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("auth", "0012_alter_user_first_name_max_length"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1045_alter_customfieldinstance_value_monetary"), - ] - - operations = [ - migrations.AddField( - model_name="workflowaction", - name="remove_all_correspondents", - field=models.BooleanField( - default=False, - verbose_name="remove all correspondents", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_custom_fields", - field=models.BooleanField( - default=False, - verbose_name="remove all custom fields", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_document_types", - field=models.BooleanField( - default=False, - verbose_name="remove all document types", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_owners", - field=models.BooleanField(default=False, verbose_name="remove all owners"), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_permissions", - field=models.BooleanField( - default=False, - verbose_name="remove all permissions", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_storage_paths", - field=models.BooleanField( - default=False, - verbose_name="remove all storage paths", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_all_tags", - field=models.BooleanField(default=False, verbose_name="remove all tags"), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_change_groups", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="remove change permissions for these groups", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_change_users", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove change permissions for these users", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_correspondents", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.correspondent", - verbose_name="remove these correspondent(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_custom_fields", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.customfield", - verbose_name="remove these custom fields", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_document_types", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.documenttype", - verbose_name="remove these document type(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_owners", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove these owner(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_storage_paths", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.storagepath", - verbose_name="remove these storage path(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_tags", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.tag", - verbose_name="remove these tag(s)", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_view_groups", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="auth.group", - verbose_name="remove view permissions for these groups", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="remove_view_users", - field=models.ManyToManyField( - blank=True, - related_name="+", - to=settings.AUTH_USER_MODEL, - verbose_name="remove view permissions for these users", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_correspondent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.correspondent", - verbose_name="assign this correspondent", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_document_type", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.documenttype", - verbose_name="assign this document type", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_storage_path", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="+", - to="documents.storagepath", - verbose_name="assign this storage path", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_tags", - field=models.ManyToManyField( - blank=True, - related_name="+", - to="documents.tag", - verbose_name="assign this tag", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="type", - field=models.PositiveIntegerField( - choices=[(1, "Assignment"), (2, "Removal")], - default=1, - verbose_name="Workflow Action Type", - ), - ), - ] diff --git a/src/documents/migrations/1047_savedview_display_mode_and_more.py b/src/documents/migrations/1047_savedview_display_mode_and_more.py deleted file mode 100644 index 904f86bb1d..0000000000 --- a/src/documents/migrations/1047_savedview_display_mode_and_more.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 4.2.11 on 2024-04-16 18:35 - -import django.core.validators -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1046_workflowaction_remove_all_correspondents_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="savedview", - name="display_mode", - field=models.CharField( - blank=True, - choices=[ - ("table", "Table"), - ("smallCards", "Small Cards"), - ("largeCards", "Large Cards"), - ], - max_length=128, - null=True, - verbose_name="View display mode", - ), - ), - migrations.AddField( - model_name="savedview", - name="page_size", - field=models.PositiveIntegerField( - blank=True, - null=True, - validators=[django.core.validators.MinValueValidator(1)], - verbose_name="View page size", - ), - ), - migrations.AddField( - model_name="savedview", - name="display_fields", - field=models.JSONField( - blank=True, - null=True, - verbose_name="Document display fields", - ), - ), - ] diff --git a/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index 904ad242c7..0000000000 --- a/src/documents/migrations/1048_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 4.2.11 on 2024-04-24 04:58 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1047_savedview_display_mode_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - (36, "has custom field value"), - (37, "is shared by me"), - (38, "has custom fields"), - (39, "has custom field in"), - (40, "does not have custom field in"), - (41, "does not have custom field"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1049_document_deleted_at_document_restored_at.py b/src/documents/migrations/1049_document_deleted_at_document_restored_at.py deleted file mode 100644 index 39fb413534..0000000000 --- a/src/documents/migrations/1049_document_deleted_at_document_restored_at.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.11 on 2024-04-23 07:56 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1048_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="document", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/src/documents/migrations/1050_customfield_extra_data_and_more.py b/src/documents/migrations/1050_customfield_extra_data_and_more.py deleted file mode 100644 index 0c6a77cccf..0000000000 --- a/src/documents/migrations/1050_customfield_extra_data_and_more.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 4.2.13 on 2024-07-04 01:02 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1049_document_deleted_at_document_restored_at"), - ] - - operations = [ - migrations.AddField( - model_name="customfield", - name="extra_data", - field=models.JSONField( - blank=True, - help_text="Extra data for the custom field, such as select options", - null=True, - verbose_name="extra data", - ), - ), - migrations.AddField( - model_name="customfieldinstance", - name="value_select", - field=models.PositiveSmallIntegerField(null=True), - ), - migrations.AlterField( - model_name="customfield", - name="data_type", - field=models.CharField( - choices=[ - ("string", "String"), - ("url", "URL"), - ("date", "Date"), - ("boolean", "Boolean"), - ("integer", "Integer"), - ("float", "Float"), - ("monetary", "Monetary"), - ("documentlink", "Document Link"), - ("select", "Select"), - ], - editable=False, - max_length=50, - verbose_name="data type", - ), - ), - ] diff --git a/src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py b/src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py deleted file mode 100644 index e8f0bb97c6..0000000000 --- a/src/documents/migrations/1051_alter_correspondent_owner_alter_document_owner_and_more.py +++ /dev/null @@ -1,88 +0,0 @@ -# Generated by Django 4.2.13 on 2024-07-09 16:39 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("documents", "1050_customfield_extra_data_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="correspondent", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="document", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="documenttype", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="savedview", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="storagepath", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - migrations.AlterField( - model_name="tag", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - ] diff --git a/src/documents/migrations/1052_document_transaction_id.py b/src/documents/migrations/1052_document_transaction_id.py deleted file mode 100644 index 5eb8e2ef9a..0000000000 --- a/src/documents/migrations/1052_document_transaction_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.15 on 2024-08-20 02:41 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1051_alter_correspondent_owner_alter_document_owner_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="transaction_id", - field=models.UUIDField(blank=True, null=True), - ), - ] diff --git a/src/documents/migrations/1053_document_page_count.py b/src/documents/migrations/1053_document_page_count.py deleted file mode 100644 index 3a8bc5d797..0000000000 --- a/src/documents/migrations/1053_document_page_count.py +++ /dev/null @@ -1,67 +0,0 @@ -# Generated by Django 5.1.1 on 2024-09-28 04:42 - -from pathlib import Path - -import pikepdf -from django.conf import settings -from django.core.validators import MinValueValidator -from django.db import migrations -from django.db import models -from django.utils.termcolors import colorize as colourise - - -def source_path(self): - if self.filename: - fname = str(self.filename) - - return Path(settings.ORIGINALS_DIR / fname).resolve() - - -def add_number_of_pages_to_page_count(apps, schema_editor): - Document = apps.get_model("documents", "Document") - - if not Document.objects.all().exists(): - return - - for doc in Document.objects.filter(mime_type="application/pdf"): - print( - " {} {} {}".format( - colourise("*", fg="green"), - colourise("Calculating number of pages for", fg="white"), - colourise(doc.filename, fg="cyan"), - ), - ) - - try: - with pikepdf.Pdf.open(source_path(doc)) as pdf: - if pdf.pages is not None: - doc.page_count = len(pdf.pages) - doc.save() - except Exception as e: # pragma: no cover - print(f"Error retrieving number of pages for {doc.filename}: {e}") - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1052_document_transaction_id"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="page_count", - field=models.PositiveIntegerField( - blank=False, - help_text="The number of pages of the document.", - null=True, - unique=False, - validators=[MinValueValidator(1)], - verbose_name="page count", - db_index=False, - ), - ), - migrations.RunPython( - add_number_of_pages_to_page_count, - migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1054_customfieldinstance_value_monetary_amount_and_more.py b/src/documents/migrations/1054_customfieldinstance_value_monetary_amount_and_more.py deleted file mode 100644 index 92d45de33e..0000000000 --- a/src/documents/migrations/1054_customfieldinstance_value_monetary_amount_and_more.py +++ /dev/null @@ -1,95 +0,0 @@ -# Generated by Django 5.1.1 on 2024-09-29 16:26 - -import django.db.models.functions.comparison -import django.db.models.functions.text -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1053_document_page_count"), - ] - - operations = [ - migrations.AddField( - model_name="customfieldinstance", - name="value_monetary_amount", - field=models.GeneratedField( - db_persist=True, - expression=models.Case( - models.When( - then=django.db.models.functions.comparison.Cast( - django.db.models.functions.text.Substr("value_monetary", 1), - output_field=models.DecimalField( - decimal_places=2, - max_digits=65, - ), - ), - value_monetary__regex="^\\d+", - ), - default=django.db.models.functions.comparison.Cast( - django.db.models.functions.text.Substr("value_monetary", 4), - output_field=models.DecimalField( - decimal_places=2, - max_digits=65, - ), - ), - output_field=models.DecimalField(decimal_places=2, max_digits=65), - ), - output_field=models.DecimalField(decimal_places=2, max_digits=65), - ), - ), - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - (36, "has custom field value"), - (37, "is shared by me"), - (38, "has custom fields"), - (39, "has custom field in"), - (40, "does not have custom field in"), - (41, "does not have custom field"), - (42, "custom fields query"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1055_alter_storagepath_path.py b/src/documents/migrations/1055_alter_storagepath_path.py deleted file mode 100644 index 1421bf824b..0000000000 --- a/src/documents/migrations/1055_alter_storagepath_path.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 5.1.1 on 2024-10-03 14:47 - -from django.conf import settings -from django.db import migrations -from django.db import models -from django.db import transaction -from filelock import FileLock - -from documents.templating.utils import convert_format_str_to_template_format - - -def convert_from_format_to_template(apps, schema_editor): - StoragePath = apps.get_model("documents", "StoragePath") - - with transaction.atomic(), FileLock(settings.MEDIA_LOCK): - for storage_path in StoragePath.objects.all(): - storage_path.path = convert_format_str_to_template_format(storage_path.path) - storage_path.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1054_customfieldinstance_value_monetary_amount_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="storagepath", - name="path", - field=models.TextField(verbose_name="path"), - ), - migrations.RunPython( - convert_from_format_to_template, - migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1056_customfieldinstance_deleted_at_and_more.py b/src/documents/migrations/1056_customfieldinstance_deleted_at_and_more.py deleted file mode 100644 index eba1e4281d..0000000000 --- a/src/documents/migrations/1056_customfieldinstance_deleted_at_and_more.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 5.1.2 on 2024-10-28 01:55 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1055_alter_storagepath_path"), - ] - - operations = [ - migrations.AddField( - model_name="customfieldinstance", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="customfieldinstance", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="customfieldinstance", - name="transaction_id", - field=models.UUIDField(blank=True, null=True), - ), - migrations.AddField( - model_name="note", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="note", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="note", - name="transaction_id", - field=models.UUIDField(blank=True, null=True), - ), - migrations.AddField( - model_name="sharelink", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="sharelink", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="sharelink", - name="transaction_id", - field=models.UUIDField(blank=True, null=True), - ), - ] diff --git a/src/documents/migrations/1057_paperlesstask_owner.py b/src/documents/migrations/1057_paperlesstask_owner.py deleted file mode 100644 index e9f108d3a1..0000000000 --- a/src/documents/migrations/1057_paperlesstask_owner.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 5.1.1 on 2024-11-04 21:56 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1056_customfieldinstance_deleted_at_and_more"), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name="paperlesstask", - name="owner", - field=models.ForeignKey( - blank=True, - default=None, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to=settings.AUTH_USER_MODEL, - verbose_name="owner", - ), - ), - ] diff --git a/src/documents/migrations/1058_workflowtrigger_schedule_date_custom_field_and_more.py b/src/documents/migrations/1058_workflowtrigger_schedule_date_custom_field_and_more.py deleted file mode 100644 index 05d38578a0..0000000000 --- a/src/documents/migrations/1058_workflowtrigger_schedule_date_custom_field_and_more.py +++ /dev/null @@ -1,143 +0,0 @@ -# Generated by Django 5.1.1 on 2024-11-05 05:19 - -import django.core.validators -import django.db.models.deletion -import django.utils.timezone -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1057_paperlesstask_owner"), - ] - - operations = [ - migrations.AddField( - model_name="workflowtrigger", - name="schedule_date_custom_field", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.customfield", - verbose_name="schedule date custom field", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="schedule_date_field", - field=models.CharField( - choices=[ - ("added", "Added"), - ("created", "Created"), - ("modified", "Modified"), - ("custom_field", "Custom Field"), - ], - default="added", - help_text="The field to check for a schedule trigger.", - max_length=20, - verbose_name="schedule date field", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="schedule_is_recurring", - field=models.BooleanField( - default=False, - help_text="If the schedule should be recurring.", - verbose_name="schedule is recurring", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="schedule_offset_days", - field=models.PositiveIntegerField( - default=0, - help_text="The number of days to offset the schedule trigger by.", - verbose_name="schedule offset days", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="schedule_recurring_interval_days", - field=models.PositiveIntegerField( - default=1, - help_text="The number of days between recurring schedule triggers.", - validators=[django.core.validators.MinValueValidator(1)], - verbose_name="schedule recurring delay in days", - ), - ), - migrations.AlterField( - model_name="workflowtrigger", - name="type", - field=models.PositiveIntegerField( - choices=[ - (1, "Consumption Started"), - (2, "Document Added"), - (3, "Document Updated"), - (4, "Scheduled"), - ], - default=1, - verbose_name="Workflow Trigger Type", - ), - ), - migrations.CreateModel( - name="WorkflowRun", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "type", - models.PositiveIntegerField( - choices=[ - (1, "Consumption Started"), - (2, "Document Added"), - (3, "Document Updated"), - (4, "Scheduled"), - ], - null=True, - verbose_name="workflow trigger type", - ), - ), - ( - "run_at", - models.DateTimeField( - db_index=True, - default=django.utils.timezone.now, - verbose_name="date run", - ), - ), - ( - "document", - models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="workflow_runs", - to="documents.document", - verbose_name="document", - ), - ), - ( - "workflow", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="runs", - to="documents.workflow", - verbose_name="workflow", - ), - ), - ], - options={ - "verbose_name": "workflow run", - "verbose_name_plural": "workflow runs", - }, - ), - ] diff --git a/src/documents/migrations/1059_workflowactionemail_workflowactionwebhook_and_more.py b/src/documents/migrations/1059_workflowactionemail_workflowactionwebhook_and_more.py deleted file mode 100644 index d944702854..0000000000 --- a/src/documents/migrations/1059_workflowactionemail_workflowactionwebhook_and_more.py +++ /dev/null @@ -1,154 +0,0 @@ -# Generated by Django 5.1.3 on 2024-11-26 04:07 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1058_workflowtrigger_schedule_date_custom_field_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="WorkflowActionEmail", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "subject", - models.CharField( - help_text="The subject of the email, can include some placeholders, see documentation.", - max_length=256, - verbose_name="email subject", - ), - ), - ( - "body", - models.TextField( - help_text="The body (message) of the email, can include some placeholders, see documentation.", - verbose_name="email body", - ), - ), - ( - "to", - models.TextField( - help_text="The destination email addresses, comma separated.", - verbose_name="emails to", - ), - ), - ( - "include_document", - models.BooleanField( - default=False, - verbose_name="include document in email", - ), - ), - ], - ), - migrations.CreateModel( - name="WorkflowActionWebhook", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "url", - models.URLField( - help_text="The destination URL for the notification.", - verbose_name="webhook url", - ), - ), - ( - "use_params", - models.BooleanField(default=True, verbose_name="use parameters"), - ), - ( - "params", - models.JSONField( - blank=True, - help_text="The parameters to send with the webhook URL if body not used.", - null=True, - verbose_name="webhook parameters", - ), - ), - ( - "body", - models.TextField( - blank=True, - help_text="The body to send with the webhook URL if parameters not used.", - null=True, - verbose_name="webhook body", - ), - ), - ( - "headers", - models.JSONField( - blank=True, - help_text="The headers to send with the webhook URL.", - null=True, - verbose_name="webhook headers", - ), - ), - ( - "include_document", - models.BooleanField( - default=False, - verbose_name="include document in webhook", - ), - ), - ], - ), - migrations.AlterField( - model_name="workflowaction", - name="type", - field=models.PositiveIntegerField( - choices=[ - (1, "Assignment"), - (2, "Removal"), - (3, "Email"), - (4, "Webhook"), - ], - default=1, - verbose_name="Workflow Action Type", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="email", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="action", - to="documents.workflowactionemail", - verbose_name="email", - ), - ), - migrations.AddField( - model_name="workflowaction", - name="webhook", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="action", - to="documents.workflowactionwebhook", - verbose_name="webhook", - ), - ), - ] diff --git a/src/documents/migrations/1060_alter_customfieldinstance_value_select.py b/src/documents/migrations/1060_alter_customfieldinstance_value_select.py deleted file mode 100644 index 21f3f8b416..0000000000 --- a/src/documents/migrations/1060_alter_customfieldinstance_value_select.py +++ /dev/null @@ -1,79 +0,0 @@ -# Generated by Django 5.1.1 on 2024-11-13 05:14 - -from django.db import migrations -from django.db import models -from django.db import transaction -from django.utils.crypto import get_random_string - - -def migrate_customfield_selects(apps, schema_editor): - """ - Migrate the custom field selects from a simple list of strings to a list of dictionaries with - label and id. Then update all instances of the custom field to use the new format. - """ - CustomFieldInstance = apps.get_model("documents", "CustomFieldInstance") - CustomField = apps.get_model("documents", "CustomField") - - with transaction.atomic(): - for custom_field in CustomField.objects.filter( - data_type="select", - ): # CustomField.FieldDataType.SELECT - old_select_options = custom_field.extra_data["select_options"] - custom_field.extra_data["select_options"] = [ - {"id": get_random_string(16), "label": value} - for value in old_select_options - ] - custom_field.save() - - for instance in CustomFieldInstance.objects.filter(field=custom_field): - if instance.value_select: - instance.value_select = custom_field.extra_data["select_options"][ - int(instance.value_select) - ]["id"] - instance.save() - - -def reverse_migrate_customfield_selects(apps, schema_editor): - """ - Reverse the migration of the custom field selects from a list of dictionaries with label and id - to a simple list of strings. Then update all instances of the custom field to use the old format, - which is just the index of the selected option. - """ - CustomFieldInstance = apps.get_model("documents", "CustomFieldInstance") - CustomField = apps.get_model("documents", "CustomField") - - with transaction.atomic(): - for custom_field in CustomField.objects.all(): - if custom_field.data_type == "select": # CustomField.FieldDataType.SELECT - old_select_options = custom_field.extra_data["select_options"] - custom_field.extra_data["select_options"] = [ - option["label"] - for option in custom_field.extra_data["select_options"] - ] - custom_field.save() - - for instance in CustomFieldInstance.objects.filter(field=custom_field): - instance.value_select = next( - index - for index, option in enumerate(old_select_options) - if option.get("id") == instance.value_select - ) - instance.save() - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1059_workflowactionemail_workflowactionwebhook_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="customfieldinstance", - name="value_select", - field=models.CharField(max_length=16, null=True), - ), - migrations.RunPython( - migrate_customfield_selects, - reverse_migrate_customfield_selects, - ), - ] diff --git a/src/documents/migrations/1061_workflowactionwebhook_as_json.py b/src/documents/migrations/1061_workflowactionwebhook_as_json.py deleted file mode 100644 index f1945cfc17..0000000000 --- a/src/documents/migrations/1061_workflowactionwebhook_as_json.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.4 on 2025-01-18 19:35 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1060_alter_customfieldinstance_value_select"), - ] - - operations = [ - migrations.AddField( - model_name="workflowactionwebhook", - name="as_json", - field=models.BooleanField(default=False, verbose_name="send as JSON"), - ), - ] diff --git a/src/documents/migrations/1062_alter_savedviewfilterrule_rule_type.py b/src/documents/migrations/1062_alter_savedviewfilterrule_rule_type.py deleted file mode 100644 index c5a6bb90ea..0000000000 --- a/src/documents/migrations/1062_alter_savedviewfilterrule_rule_type.py +++ /dev/null @@ -1,70 +0,0 @@ -# Generated by Django 5.1.4 on 2025-02-06 05:54 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1061_workflowactionwebhook_as_json"), - ] - - operations = [ - migrations.AlterField( - model_name="savedviewfilterrule", - name="rule_type", - field=models.PositiveIntegerField( - choices=[ - (0, "title contains"), - (1, "content contains"), - (2, "ASN is"), - (3, "correspondent is"), - (4, "document type is"), - (5, "is in inbox"), - (6, "has tag"), - (7, "has any tag"), - (8, "created before"), - (9, "created after"), - (10, "created year is"), - (11, "created month is"), - (12, "created day is"), - (13, "added before"), - (14, "added after"), - (15, "modified before"), - (16, "modified after"), - (17, "does not have tag"), - (18, "does not have ASN"), - (19, "title or content contains"), - (20, "fulltext query"), - (21, "more like this"), - (22, "has tags in"), - (23, "ASN greater than"), - (24, "ASN less than"), - (25, "storage path is"), - (26, "has correspondent in"), - (27, "does not have correspondent in"), - (28, "has document type in"), - (29, "does not have document type in"), - (30, "has storage path in"), - (31, "does not have storage path in"), - (32, "owner is"), - (33, "has owner in"), - (34, "does not have owner"), - (35, "does not have owner in"), - (36, "has custom field value"), - (37, "is shared by me"), - (38, "has custom fields"), - (39, "has custom field in"), - (40, "does not have custom field in"), - (41, "does not have custom field"), - (42, "custom fields query"), - (43, "created to"), - (44, "created from"), - (45, "added to"), - (46, "added from"), - (47, "mime type is"), - ], - verbose_name="rule type", - ), - ), - ] diff --git a/src/documents/migrations/1063_paperlesstask_type_alter_paperlesstask_task_name_and_more.py b/src/documents/migrations/1063_paperlesstask_type_alter_paperlesstask_task_name_and_more.py deleted file mode 100644 index aeedbd6a02..0000000000 --- a/src/documents/migrations/1063_paperlesstask_type_alter_paperlesstask_task_name_and_more.py +++ /dev/null @@ -1,92 +0,0 @@ -# Generated by Django 5.1.6 on 2025-02-21 16:34 - -import multiselectfield.db.fields -from django.db import migrations -from django.db import models - - -# WebUI source was added, so all existing APIUpload sources should be updated to include WebUI -def update_workflow_sources(apps, schema_editor): - WorkflowTrigger = apps.get_model("documents", "WorkflowTrigger") - for trigger in WorkflowTrigger.objects.all(): - sources = list(trigger.sources) - if 2 in sources: - sources.append(4) - trigger.sources = sources - trigger.save() - - -def make_existing_tasks_consume_auto(apps, schema_editor): - PaperlessTask = apps.get_model("documents", "PaperlessTask") - PaperlessTask.objects.all().update(type="auto_task", task_name="consume_file") - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1062_alter_savedviewfilterrule_rule_type"), - ] - - operations = [ - migrations.AddField( - model_name="paperlesstask", - name="type", - field=models.CharField( - choices=[ - ("auto_task", "Auto Task"), - ("scheduled_task", "Scheduled Task"), - ("manual_task", "Manual Task"), - ], - default="auto_task", - help_text="The type of task that was run", - max_length=30, - verbose_name="Task Type", - ), - ), - migrations.AlterField( - model_name="paperlesstask", - name="task_name", - field=models.CharField( - choices=[ - ("consume_file", "Consume File"), - ("train_classifier", "Train Classifier"), - ("check_sanity", "Check Sanity"), - ("index_optimize", "Index Optimize"), - ], - help_text="Name of the task that was run", - max_length=255, - null=True, - verbose_name="Task Name", - ), - ), - migrations.RunPython( - code=make_existing_tasks_consume_auto, - reverse_code=migrations.RunPython.noop, - ), - migrations.AlterField( - model_name="workflowactionwebhook", - name="url", - field=models.CharField( - help_text="The destination URL for the notification.", - max_length=256, - verbose_name="webhook url", - ), - ), - migrations.AlterField( - model_name="workflowtrigger", - name="sources", - field=multiselectfield.db.fields.MultiSelectField( - choices=[ - (1, "Consume Folder"), - (2, "Api Upload"), - (3, "Mail Fetch"), - (4, "Web UI"), - ], - default="1,2,3,4", - max_length=7, - ), - ), - migrations.RunPython( - code=update_workflow_sources, - reverse_code=migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1064_delete_log.py b/src/documents/migrations/1064_delete_log.py deleted file mode 100644 index ec0830a918..0000000000 --- a/src/documents/migrations/1064_delete_log.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 5.1.6 on 2025-02-28 15:19 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1063_paperlesstask_type_alter_paperlesstask_task_name_and_more"), - ] - - operations = [ - migrations.DeleteModel( - name="Log", - ), - ] diff --git a/src/documents/migrations/1065_workflowaction_assign_custom_fields_values.py b/src/documents/migrations/1065_workflowaction_assign_custom_fields_values.py deleted file mode 100644 index 35fae02bef..0000000000 --- a/src/documents/migrations/1065_workflowaction_assign_custom_fields_values.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.1.6 on 2025-03-01 18:10 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1064_delete_log"), - ] - - operations = [ - migrations.AddField( - model_name="workflowaction", - name="assign_custom_fields_values", - field=models.JSONField( - blank=True, - help_text="Optional values to assign to the custom fields.", - null=True, - verbose_name="custom field values", - default=dict, - ), - ), - ] diff --git a/src/documents/migrations/1066_alter_workflowtrigger_schedule_offset_days.py b/src/documents/migrations/1066_alter_workflowtrigger_schedule_offset_days.py deleted file mode 100644 index eaf23ad64d..0000000000 --- a/src/documents/migrations/1066_alter_workflowtrigger_schedule_offset_days.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.1.7 on 2025-04-15 19:18 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1065_workflowaction_assign_custom_fields_values"), - ] - - operations = [ - migrations.AlterField( - model_name="workflowtrigger", - name="schedule_offset_days", - field=models.IntegerField( - default=0, - help_text="The number of days to offset the schedule trigger by.", - verbose_name="schedule offset days", - ), - ), - ] diff --git a/src/documents/migrations/1067_alter_document_created.py b/src/documents/migrations/1067_alter_document_created.py deleted file mode 100644 index 0f96bce3db..0000000000 --- a/src/documents/migrations/1067_alter_document_created.py +++ /dev/null @@ -1,76 +0,0 @@ -# Generated by Django 5.1.7 on 2025-04-04 01:08 - - -import datetime - -from django.db import migrations -from django.db import models -from django.utils.timezone import localtime - - -def migrate_date(apps, schema_editor): - Document = apps.get_model("documents", "Document") - - # Batch to avoid loading all objects into memory at once, - # which would be problematic for large datasets. - batch_size = 500 - updates = [] - total_updated = 0 - total_checked = 0 - - for doc in Document.objects.only("id", "created").iterator(chunk_size=batch_size): - total_checked += 1 - if doc.created: - doc.created_date = localtime(doc.created).date() - updates.append(doc) - - if len(updates) >= batch_size: - Document.objects.bulk_update(updates, ["created_date"]) - total_updated += len(updates) - print( - f"[1067_alter_document_created] {total_updated} of {total_checked} processed...", - ) - updates.clear() - - if updates: - Document.objects.bulk_update(updates, ["created_date"]) - total_updated += len(updates) - print( - f"[1067_alter_document_created] {total_updated} of {total_checked} processed...", - ) - - if total_checked > 0: - print(f"[1067_alter_document_created] completed for {total_checked} documents.") - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1066_alter_workflowtrigger_schedule_offset_days"), - ] - - operations = [ - migrations.AddField( - model_name="document", - name="created_date", - field=models.DateField(null=True), - ), - migrations.RunPython(migrate_date, reverse_code=migrations.RunPython.noop), - migrations.RemoveField( - model_name="document", - name="created", - ), - migrations.RenameField( - model_name="document", - old_name="created_date", - new_name="created", - ), - migrations.AlterField( - model_name="document", - name="created", - field=models.DateField( - db_index=True, - default=datetime.datetime.today, - verbose_name="created", - ), - ), - ] diff --git a/src/documents/migrations/1068_alter_document_created.py b/src/documents/migrations/1068_alter_document_created.py deleted file mode 100644 index b673f6584b..0000000000 --- a/src/documents/migrations/1068_alter_document_created.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-23 05:50 - -import datetime - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1067_alter_document_created"), - ] - - operations = [ - migrations.AlterField( - model_name="document", - name="created", - field=models.DateField( - db_index=True, - default=datetime.date.today, - verbose_name="created", - ), - ), - ] diff --git a/src/documents/migrations/1069_workflowtrigger_filter_has_storage_path_and_more.py b/src/documents/migrations/1069_workflowtrigger_filter_has_storage_path_and_more.py deleted file mode 100644 index 47db2fd910..0000000000 --- a/src/documents/migrations/1069_workflowtrigger_filter_has_storage_path_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.2.6 on 2025-09-11 17:29 - -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1068_alter_document_created"), - ] - - operations = [ - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_storage_path", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="documents.storagepath", - verbose_name="has this storage path", - ), - ), - migrations.AlterField( - model_name="workflowaction", - name="assign_title", - field=models.TextField( - blank=True, - help_text="Assign a document title, must be a Jinja2 template, see documentation.", - null=True, - verbose_name="assign title", - ), - ), - ] diff --git a/src/documents/migrations/1070_customfieldinstance_value_long_text_and_more.py b/src/documents/migrations/1070_customfieldinstance_value_long_text_and_more.py deleted file mode 100644 index 69c77d29a1..0000000000 --- a/src/documents/migrations/1070_customfieldinstance_value_long_text_and_more.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 5.2.6 on 2025-09-13 17:11 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1069_workflowtrigger_filter_has_storage_path_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="customfieldinstance", - name="value_long_text", - field=models.TextField(null=True), - ), - migrations.AlterField( - model_name="customfield", - name="data_type", - field=models.CharField( - choices=[ - ("string", "String"), - ("url", "URL"), - ("date", "Date"), - ("boolean", "Boolean"), - ("integer", "Integer"), - ("float", "Float"), - ("monetary", "Monetary"), - ("documentlink", "Document Link"), - ("select", "Select"), - ("longtext", "Long Text"), - ], - editable=False, - max_length=50, - verbose_name="data type", - ), - ), - ] diff --git a/src/documents/migrations/1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more.py b/src/documents/migrations/1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more.py deleted file mode 100644 index 3e097620e6..0000000000 --- a/src/documents/migrations/1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more.py +++ /dev/null @@ -1,159 +0,0 @@ -# Generated by Django 5.2.6 on 2025-09-12 18:42 - -import django.core.validators -import django.db.models.deletion -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1070_customfieldinstance_value_long_text_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="tag", - name="tn_ancestors_count", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Ancestors count", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_ancestors_pks", - field=models.TextField( - blank=True, - default="", - editable=False, - verbose_name="Ancestors pks", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_children_count", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Children count", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_children_pks", - field=models.TextField( - blank=True, - default="", - editable=False, - verbose_name="Children pks", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_depth", - field=models.PositiveIntegerField( - default=0, - editable=False, - validators=[ - django.core.validators.MinValueValidator(0), - django.core.validators.MaxValueValidator(10), - ], - verbose_name="Depth", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_descendants_count", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Descendants count", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_descendants_pks", - field=models.TextField( - blank=True, - default="", - editable=False, - verbose_name="Descendants pks", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_index", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Index", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_level", - field=models.PositiveIntegerField( - default=1, - editable=False, - validators=[ - django.core.validators.MinValueValidator(1), - django.core.validators.MaxValueValidator(10), - ], - verbose_name="Level", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_order", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Order", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_parent", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="tn_children", - to="documents.tag", - verbose_name="Parent", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_priority", - field=models.PositiveIntegerField( - default=0, - validators=[ - django.core.validators.MinValueValidator(0), - django.core.validators.MaxValueValidator(9999999999), - ], - verbose_name="Priority", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_siblings_count", - field=models.PositiveIntegerField( - default=0, - editable=False, - verbose_name="Siblings count", - ), - ), - migrations.AddField( - model_name="tag", - name="tn_siblings_pks", - field=models.TextField( - blank=True, - default="", - editable=False, - verbose_name="Siblings pks", - ), - ), - ] diff --git a/src/documents/migrations/1072_workflowtrigger_filter_custom_field_query_and_more.py b/src/documents/migrations/1072_workflowtrigger_filter_custom_field_query_and_more.py deleted file mode 100644 index 1a22f6b4f2..0000000000 --- a/src/documents/migrations/1072_workflowtrigger_filter_custom_field_query_and_more.py +++ /dev/null @@ -1,73 +0,0 @@ -# Generated by Django 5.2.6 on 2025-10-07 18:52 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1071_tag_tn_ancestors_count_tag_tn_ancestors_pks_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="workflowtrigger", - name="filter_custom_field_query", - field=models.TextField( - blank=True, - help_text="JSON-encoded custom field query expression.", - null=True, - verbose_name="filter custom field query", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_all_tags", - field=models.ManyToManyField( - blank=True, - related_name="workflowtriggers_has_all", - to="documents.tag", - verbose_name="has all of these tag(s)", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_not_correspondents", - field=models.ManyToManyField( - blank=True, - related_name="workflowtriggers_has_not_correspondent", - to="documents.correspondent", - verbose_name="does not have these correspondent(s)", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_not_document_types", - field=models.ManyToManyField( - blank=True, - related_name="workflowtriggers_has_not_document_type", - to="documents.documenttype", - verbose_name="does not have these document type(s)", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_not_storage_paths", - field=models.ManyToManyField( - blank=True, - related_name="workflowtriggers_has_not_storage_path", - to="documents.storagepath", - verbose_name="does not have these storage path(s)", - ), - ), - migrations.AddField( - model_name="workflowtrigger", - name="filter_has_not_tags", - field=models.ManyToManyField( - blank=True, - related_name="workflowtriggers_has_not", - to="documents.tag", - verbose_name="does not have these tag(s)", - ), - ), - ] diff --git a/src/documents/migrations/1073_migrate_workflow_title_jinja.py b/src/documents/migrations/1073_migrate_workflow_title_jinja.py deleted file mode 100644 index 9d80a277fd..0000000000 --- a/src/documents/migrations/1073_migrate_workflow_title_jinja.py +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by Django 5.2.5 on 2025-08-27 22:02 -import logging - -from django.db import migrations -from django.db import models - -from documents.templating.utils import convert_format_str_to_template_format - -logger = logging.getLogger("paperless.migrations") - - -def convert_from_format_to_template(apps, schema_editor): - WorkflowAction = apps.get_model("documents", "WorkflowAction") - - batch_size = 500 - actions_to_update = [] - - queryset = ( - WorkflowAction.objects.filter(assign_title__isnull=False) - .exclude(assign_title="") - .only("id", "assign_title") - ) - - for action in queryset: - action.assign_title = convert_format_str_to_template_format( - action.assign_title, - ) - logger.debug( - "Converted WorkflowAction id %d title to template format: %s", - action.id, - action.assign_title, - ) - actions_to_update.append(action) - - if actions_to_update: - WorkflowAction.objects.bulk_update( - actions_to_update, - ["assign_title"], - batch_size=batch_size, - ) - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1072_workflowtrigger_filter_custom_field_query_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="workflowaction", - name="assign_title", - field=models.TextField( - blank=True, - help_text="Assign a document title, must be a Jinja2 template, see documentation.", - null=True, - verbose_name="assign title", - ), - ), - migrations.RunPython( - convert_from_format_to_template, - migrations.RunPython.noop, - ), - ] diff --git a/src/documents/migrations/1074_workflowrun_deleted_at_workflowrun_restored_at_and_more.py b/src/documents/migrations/1074_workflowrun_deleted_at_workflowrun_restored_at_and_more.py deleted file mode 100644 index 4381eabb1e..0000000000 --- a/src/documents/migrations/1074_workflowrun_deleted_at_workflowrun_restored_at_and_more.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 5.2.6 on 2025-10-27 15:11 - -from django.db import migrations -from django.db import models - - -class Migration(migrations.Migration): - dependencies = [ - ("documents", "1073_migrate_workflow_title_jinja"), - ] - - operations = [ - migrations.AddField( - model_name="workflowrun", - name="deleted_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="workflowrun", - name="restored_at", - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name="workflowrun", - name="transaction_id", - field=models.UUIDField(blank=True, null=True), - ), - ] diff --git a/src/documents/models.py b/src/documents/models.py index 12dab2b6df..6147ac001e 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -20,7 +20,9 @@ from auditlog.registry import auditlog from django.db.models import Case +from django.db.models import PositiveIntegerField from django.db.models.functions import Cast +from django.db.models.functions import Length from django.db.models.functions import Substr from django_softdelete.models import SoftDeleteModel @@ -65,7 +67,7 @@ class MatchingModel(ModelWithOwner): match = models.CharField(_("match"), max_length=256, blank=True) - matching_algorithm = models.PositiveIntegerField( + matching_algorithm = models.PositiveSmallIntegerField( _("matching algorithm"), choices=MATCHING_ALGORITHMS, default=MATCH_ANY, @@ -73,7 +75,7 @@ class MatchingModel(ModelWithOwner): is_insensitive = models.BooleanField(_("is insensitive"), default=True) - class Meta: + class Meta(ModelWithOwner.Meta): abstract = True ordering = ("name",) constraints = [ @@ -116,7 +118,7 @@ class Meta(MatchingModel.Meta, TreeNodeModel.Meta): verbose_name = _("tag") verbose_name_plural = _("tags") - def clean(self): + def clean(self) -> None: # Prevent self-parenting and assigning a descendant as parent parent = self.get_parent() if parent == self: @@ -153,13 +155,8 @@ class Meta(MatchingModel.Meta): verbose_name_plural = _("storage paths") -class Document(SoftDeleteModel, ModelWithOwner): - STORAGE_TYPE_UNENCRYPTED = "unencrypted" - STORAGE_TYPE_GPG = "gpg" - STORAGE_TYPES = ( - (STORAGE_TYPE_UNENCRYPTED, _("Unencrypted")), - (STORAGE_TYPE_GPG, _("Encrypted with GNU Privacy Guard")), - ) +class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager-missing] + MAX_STORED_FILENAME_LENGTH: Final[int] = 1024 correspondent = models.ForeignKey( Correspondent, @@ -199,6 +196,15 @@ class Document(SoftDeleteModel, ModelWithOwner): ), ) + content_length = models.GeneratedField( + expression=Length("content"), + output_field=PositiveIntegerField(default=0), + db_persist=True, + null=False, + serialize=False, + help_text="Length of the content field in characters. Automatically maintained by the database for faster statistics computation.", + ) + mime_type = models.CharField(_("mime type"), max_length=256, editable=False) tags = models.ManyToManyField( @@ -212,7 +218,6 @@ class Document(SoftDeleteModel, ModelWithOwner): _("checksum"), max_length=32, editable=False, - unique=True, help_text=_("The checksum of the original document."), ) @@ -250,14 +255,6 @@ class Document(SoftDeleteModel, ModelWithOwner): db_index=True, ) - storage_type = models.CharField( - _("storage type"), - max_length=11, - choices=STORAGE_TYPES, - default=STORAGE_TYPE_UNENCRYPTED, - editable=False, - ) - added = models.DateTimeField( _("added"), default=timezone.now, @@ -267,7 +264,7 @@ class Document(SoftDeleteModel, ModelWithOwner): filename = models.FilePathField( _("filename"), - max_length=1024, + max_length=MAX_STORED_FILENAME_LENGTH, editable=False, default=None, unique=True, @@ -277,7 +274,7 @@ class Document(SoftDeleteModel, ModelWithOwner): archive_filename = models.FilePathField( _("archive filename"), - max_length=1024, + max_length=MAX_STORED_FILENAME_LENGTH, editable=False, default=None, unique=True, @@ -287,7 +284,7 @@ class Document(SoftDeleteModel, ModelWithOwner): original_filename = models.CharField( _("original filename"), - max_length=1024, + max_length=MAX_STORED_FILENAME_LENGTH, editable=False, default=None, unique=False, @@ -313,10 +310,45 @@ class Document(SoftDeleteModel, ModelWithOwner): ), ) + root_document = models.ForeignKey( + "self", + blank=True, + null=True, + related_name="versions", + on_delete=models.CASCADE, + verbose_name=_("root document for this version"), + ) + + version_index = models.PositiveIntegerField( + _("version index"), + blank=True, + null=True, + db_index=True, + help_text=_("Index of this version within the root document."), + ) + + version_label = models.CharField( + _("version label"), + max_length=64, + blank=True, + null=True, + help_text=_("Optional short label for a document version."), + ) + class Meta: ordering = ("-created",) verbose_name = _("document") verbose_name_plural = _("documents") + constraints = [ + models.UniqueConstraint( + fields=["root_document", "version_index"], + condition=models.Q( + root_document__isnull=False, + version_index__isnull=False, + ), + name="documents_document_root_version_index_uniq", + ), + ] def __str__(self) -> str: created = self.created.isoformat() @@ -329,6 +361,42 @@ def __str__(self) -> str: res += f" {self.title}" return res + def get_effective_content(self) -> str | None: + """ + Returns the effective content for the document. + + For root documents, this is the latest version's content when available. + For version documents, this is always the document's own content. + If the queryset already annotated ``effective_content``, that value is used. + """ + if hasattr(self, "effective_content"): + return getattr(self, "effective_content") + + if self.root_document_id is not None or self.pk is None: + return self.content + + prefetched_cache = getattr(self, "_prefetched_objects_cache", None) + prefetched_versions = ( + prefetched_cache.get("versions") + if isinstance(prefetched_cache, dict) + else None + ) + if prefetched_versions: + latest_prefetched = max(prefetched_versions, key=lambda doc: doc.id) + return latest_prefetched.content + + latest_version_content = ( + Document.objects.filter(root_document=self) + .order_by("-id") + .values_list("content", flat=True) + .first() + ) + return ( + latest_version_content + if latest_version_content is not None + else self.content + ) + @property def suggestion_content(self): """ @@ -341,24 +409,25 @@ def suggestion_content(self): This improves processing speed for large documents while keeping enough context for accurate suggestions. """ - if not self.content or len(self.content) <= 1200000: - return self.content + effective_content = self.get_effective_content() + if not effective_content or len(effective_content) <= 1200000: + return effective_content else: # Use 80% from the start and 20% from the end # to preserve both opening and closing context. head_len = 800000 tail_len = 200000 - return " ".join((self.content[:head_len], self.content[-tail_len:])) + return " ".join( + ( + effective_content[:head_len], + effective_content[-tail_len:], + ), + ) @property def source_path(self) -> Path: - if self.filename: - fname = str(self.filename) - else: - fname = f"{self.pk:07}{self.file_type}" - if self.storage_type == self.STORAGE_TYPE_GPG: - fname += ".gpg" # pragma: no cover + fname = str(self.filename) if self.filename else f"{self.pk:07}{self.file_type}" return (settings.ORIGINALS_DIR / Path(fname)).resolve() @@ -407,8 +476,6 @@ def file_type(self): @property def thumbnail_path(self) -> Path: webp_file_name = f"{self.pk:07}.webp" - if self.storage_type == self.STORAGE_TYPE_GPG: - webp_file_name += ".gpg" webp_file_path = settings.THUMBNAIL_DIR / Path(webp_file_name) @@ -422,7 +489,7 @@ def thumbnail_file(self): def created_date(self): return self.created - def add_nested_tags(self, tags): + def add_nested_tags(self, tags) -> None: tag_ids = set() for tag in tags: tag_ids.add(tag.id) @@ -431,6 +498,19 @@ def add_nested_tags(self, tags): tags_to_add = self.tags.model.objects.filter(id__in=tag_ids) self.tags.add(*tags_to_add) + def delete( + self, + *args, + **kwargs, + ): + # If deleting a root document, move all its versions to trash as well. + if self.root_document_id is None: + Document.objects.filter(root_document=self).delete() + return super().delete( + *args, + **kwargs, + ) + class SavedView(ModelWithOwner): class DisplayMode(models.TextChoices): @@ -455,13 +535,6 @@ class DisplayFields(models.TextChoices): name = models.CharField(_("name"), max_length=128) - show_on_dashboard = models.BooleanField( - _("show on dashboard"), - ) - show_in_sidebar = models.BooleanField( - _("show in sidebar"), - ) - sort_field = models.CharField( _("sort field"), max_length=128, @@ -559,7 +632,7 @@ class SavedViewFilterRule(models.Model): verbose_name=_("saved view"), ) - rule_type = models.PositiveIntegerField(_("rule type"), choices=RULE_TYPES) + rule_type = models.PositiveSmallIntegerField(_("rule type"), choices=RULE_TYPES) value = models.CharField(_("value"), max_length=255, blank=True, null=True) @@ -598,6 +671,7 @@ class TaskName(models.TextChoices): TRAIN_CLASSIFIER = ("train_classifier", _("Train Classifier")) CHECK_SANITY = ("check_sanity", _("Check Sanity")) INDEX_OPTIMIZE = ("index_optimize", _("Index Optimize")) + LLMINDEX_UPDATE = ("llmindex_update", _("LLM Index Update")) task_id = models.CharField( max_length=255, @@ -777,6 +851,114 @@ def __str__(self): return f"Share Link for {self.document.title}" +class ShareLinkBundle(models.Model): + class Status(models.TextChoices): + PENDING = ("pending", _("Pending")) + PROCESSING = ("processing", _("Processing")) + READY = ("ready", _("Ready")) + FAILED = ("failed", _("Failed")) + + created = models.DateTimeField( + _("created"), + default=timezone.now, + db_index=True, + blank=True, + editable=False, + ) + + expiration = models.DateTimeField( + _("expiration"), + blank=True, + null=True, + db_index=True, + ) + + slug = models.SlugField( + _("slug"), + db_index=True, + unique=True, + blank=True, + editable=False, + ) + + owner = models.ForeignKey( + User, + blank=True, + null=True, + related_name="share_link_bundles", + on_delete=models.SET_NULL, + verbose_name=_("owner"), + ) + + file_version = models.CharField( + max_length=50, + choices=ShareLink.FileVersion.choices, + default=ShareLink.FileVersion.ARCHIVE, + ) + + status = models.CharField( + max_length=50, + choices=Status.choices, + default=Status.PENDING, + ) + + size_bytes = models.PositiveIntegerField( + _("size (bytes)"), + blank=True, + null=True, + ) + + last_error = models.JSONField( + _("last error"), + blank=True, + null=True, + default=None, + ) + + file_path = models.CharField( + _("file path"), + max_length=512, + blank=True, + ) + + built_at = models.DateTimeField( + _("built at"), + null=True, + blank=True, + ) + + documents = models.ManyToManyField( + "documents.Document", + related_name="share_link_bundles", + verbose_name=_("documents"), + ) + + class Meta: + ordering = ("-created",) + verbose_name = _("share link bundle") + verbose_name_plural = _("share link bundles") + + def __str__(self): + return _("Share link bundle %(slug)s") % {"slug": self.slug} + + @property + def absolute_file_path(self) -> Path | None: + if not self.file_path: + return None + return (settings.SHARE_LINK_BUNDLE_DIR / Path(self.file_path)).resolve() + + def remove_file(self) -> None: + if self.absolute_file_path is not None and self.absolute_file_path.exists(): + try: + self.absolute_file_path.unlink() + except OSError: + pass + + def delete(self, using=None, *, keep_parents=False): + self.remove_file() + return super().delete(using=using, keep_parents=keep_parents) + + class CustomField(models.Model): """ Defines the name and type of a custom field @@ -967,7 +1149,7 @@ def value(self): auditlog.register( Document, m2m_fields={"tags"}, - exclude_fields=["modified"], + exclude_fields=["content_length", "modified"], ) auditlog.register(Correspondent) auditlog.register(Tag) @@ -1005,7 +1187,7 @@ class ScheduleDateField(models.TextChoices): MODIFIED = "modified", _("Modified") CUSTOM_FIELD = "custom_field", _("Custom Field") - type = models.PositiveIntegerField( + type = models.PositiveSmallIntegerField( _("Workflow Trigger Type"), choices=WorkflowTriggerType.choices, default=WorkflowTriggerType.CONSUMPTION, @@ -1051,7 +1233,7 @@ class ScheduleDateField(models.TextChoices): match = models.CharField(_("match"), max_length=256, blank=True) - matching_algorithm = models.PositiveIntegerField( + matching_algorithm = models.PositiveSmallIntegerField( _("matching algorithm"), choices=WorkflowTriggerMatching.choices, default=WorkflowTriggerMatching.NONE, @@ -1087,6 +1269,13 @@ class ScheduleDateField(models.TextChoices): verbose_name=_("has this document type"), ) + filter_has_any_document_types = models.ManyToManyField( + DocumentType, + blank=True, + related_name="workflowtriggers_has_any_document_type", + verbose_name=_("has one of these document types"), + ) + filter_has_not_document_types = models.ManyToManyField( DocumentType, blank=True, @@ -1109,6 +1298,13 @@ class ScheduleDateField(models.TextChoices): verbose_name=_("does not have these correspondent(s)"), ) + filter_has_any_correspondents = models.ManyToManyField( + Correspondent, + blank=True, + related_name="workflowtriggers_has_any_correspondent", + verbose_name=_("has one of these correspondents"), + ) + filter_has_storage_path = models.ForeignKey( StoragePath, null=True, @@ -1117,6 +1313,13 @@ class ScheduleDateField(models.TextChoices): verbose_name=_("has this storage path"), ) + filter_has_any_storage_paths = models.ManyToManyField( + StoragePath, + blank=True, + related_name="workflowtriggers_has_any_storage_path", + verbose_name=_("has one of these storage paths"), + ) + filter_has_not_storage_paths = models.ManyToManyField( StoragePath, blank=True, @@ -1131,7 +1334,7 @@ class ScheduleDateField(models.TextChoices): help_text=_("JSON-encoded custom field query expression."), ) - schedule_offset_days = models.IntegerField( + schedule_offset_days = models.SmallIntegerField( _("schedule offset days"), default=0, help_text=_( @@ -1147,7 +1350,7 @@ class ScheduleDateField(models.TextChoices): ), ) - schedule_recurring_interval_days = models.PositiveIntegerField( + schedule_recurring_interval_days = models.PositiveSmallIntegerField( _("schedule recurring delay in days"), default=1, validators=[MinValueValidator(1)], @@ -1287,13 +1490,23 @@ class WorkflowActionType(models.IntegerChoices): 4, _("Webhook"), ) + PASSWORD_REMOVAL = ( + 5, + _("Password removal"), + ) + MOVE_TO_TRASH = ( + 6, + _("Move to trash"), + ) - type = models.PositiveIntegerField( + type = models.PositiveSmallIntegerField( _("Workflow Action Type"), choices=WorkflowActionType.choices, default=WorkflowActionType.ASSIGNMENT, ) + order = models.PositiveSmallIntegerField(_("order"), default=0) + assign_title = models.TextField( _("assign title"), null=True, @@ -1514,6 +1727,15 @@ class WorkflowActionType(models.IntegerChoices): verbose_name=_("webhook"), ) + passwords = models.JSONField( + _("passwords"), + null=True, + blank=True, + help_text=_( + "Passwords to try when removing PDF protection. Separate with commas or new lines.", + ), + ) + class Meta: verbose_name = _("workflow action") verbose_name_plural = _("workflow actions") @@ -1525,7 +1747,7 @@ def __str__(self): class Workflow(models.Model): name = models.CharField(_("name"), max_length=256, unique=True) - order = models.IntegerField(_("order"), default=0) + order = models.SmallIntegerField(_("order"), default=0) triggers = models.ManyToManyField( WorkflowTrigger, @@ -1555,7 +1777,7 @@ class WorkflowRun(SoftDeleteModel): verbose_name=_("workflow"), ) - type = models.PositiveIntegerField( + type = models.PositiveSmallIntegerField( _("workflow trigger type"), choices=WorkflowTrigger.WorkflowTriggerType.choices, null=True, @@ -1579,5 +1801,5 @@ class Meta: verbose_name = _("workflow run") verbose_name_plural = _("workflow runs") - def __str__(self): + def __str__(self) -> str: return f"WorkflowRun of {self.workflow} at {self.run_at} on {self.document}" diff --git a/src/documents/parsers.py b/src/documents/parsers.py index f6417e285b..372cf0491e 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -9,22 +9,17 @@ import tempfile from functools import lru_cache from pathlib import Path -from re import Match from typing import TYPE_CHECKING from django.conf import settings -from django.utils import timezone from documents.loggers import LoggingMixin from documents.signals import document_consumer_declaration from documents.utils import copy_file_with_basic_stats from documents.utils import run_subprocess -from paperless.config import OcrConfig -from paperless.utils import ocr_to_dateparser_languages if TYPE_CHECKING: import datetime - from collections.abc import Iterator # This regular expression will try to find dates in the document at # hand and will match the following formats: @@ -155,7 +150,15 @@ def run_convert( ) -> None: environment = os.environ.copy() if settings.CONVERT_MEMORY_LIMIT: + # MAGICK_MEMORY_LIMIT sets the maximum amount of RAM the pixel cache can use. + # MAGICK_MAP_LIMIT sets the maximum amount of memory-mapped I/O allowed. + # + # For large-format documents ImageMagick will hit the RAM limit and + # immediately try to "map" the remaining data. If MAGICK_MAP_LIMIT isn't + # also set, the process may trigger an OOM kill because the default + # system/policy map limit is often too restrictive for these massive bitmaps. environment["MAGICK_MEMORY_LIMIT"] = settings.CONVERT_MEMORY_LIMIT + environment["MAGICK_MAP_LIMIT"] = settings.CONVERT_MEMORY_LIMIT if settings.CONVERT_TMPDIR: environment["MAGICK_TMPDIR"] = settings.CONVERT_TMPDIR @@ -259,75 +262,6 @@ def make_thumbnail_from_pdf(in_path: Path, temp_dir: Path, logging_group=None) - return out_path -def parse_date(filename, text) -> datetime.datetime | None: - return next(parse_date_generator(filename, text), None) - - -def parse_date_generator(filename, text) -> Iterator[datetime.datetime]: - """ - Returns the date of the document. - """ - - def __parser(ds: str, date_order: str) -> datetime.datetime: - """ - Call dateparser.parse with a particular date ordering - """ - import dateparser - - ocr_config = OcrConfig() - languages = settings.DATE_PARSER_LANGUAGES or ocr_to_dateparser_languages( - ocr_config.language, - ) - - return dateparser.parse( - ds, - settings={ - "DATE_ORDER": date_order, - "PREFER_DAY_OF_MONTH": "first", - "RETURN_AS_TIMEZONE_AWARE": True, - "TIMEZONE": settings.TIME_ZONE, - }, - locales=languages, - ) - - def __filter(date: datetime.datetime) -> datetime.datetime | None: - if ( - date is not None - and date.year > 1900 - and date <= timezone.now() - and date.date() not in settings.IGNORE_DATES - ): - return date - return None - - def __process_match( - match: Match[str], - date_order: str, - ) -> datetime.datetime | None: - date_string = match.group(0) - - try: - date = __parser(date_string, date_order) - except Exception: - # Skip all matches that do not parse to a proper date - date = None - - return __filter(date) - - def __process_content(content: str, date_order: str) -> Iterator[datetime.datetime]: - for m in re.finditer(DATE_REGEX, content): - date = __process_match(m, date_order) - if date is not None: - yield date - - # if filename date parsing is enabled, search there first: - if settings.FILENAME_DATE_ORDER: - yield from __process_content(filename, settings.FILENAME_DATE_ORDER) - - # Iterate through all regex matches in text and try to parse the date - yield from __process_content(text, settings.DATE_ORDER) - - class ParseError(Exception): pass @@ -340,7 +274,7 @@ class DocumentParser(LoggingMixin): logging_name = "paperless.parsing" - def __init__(self, logging_group, progress_callback=None): + def __init__(self, logging_group, progress_callback=None) -> None: super().__init__() self.renew_logging_group() self.logging_group = logging_group @@ -355,7 +289,7 @@ def __init__(self, logging_group, progress_callback=None): self.date: datetime.datetime | None = None self.progress_callback = progress_callback - def progress(self, current_progress, max_progress): + def progress(self, current_progress, max_progress) -> None: if self.progress_callback: self.progress_callback(current_progress, max_progress) @@ -380,7 +314,7 @@ def read_file_handle_unicode_errors(self, filepath: Path) -> str: def extract_metadata(self, document_path, mime_type): return [] - def get_page_count(self, document_path, mime_type): + def get_page_count(self, document_path, mime_type) -> None: return None def parse(self, document_path, mime_type, file_name=None): @@ -401,6 +335,6 @@ def get_text(self): def get_date(self) -> datetime.datetime | None: return self.date - def cleanup(self): + def cleanup(self) -> None: self.log.debug(f"Deleting directory {self.tempdir}") shutil.rmtree(self.tempdir) diff --git a/src/documents/permissions.py b/src/documents/permissions.py index cf6a9aa35c..140293887e 100644 --- a/src/documents/permissions.py +++ b/src/documents/permissions.py @@ -1,11 +1,20 @@ +from typing import Any + from django.contrib.auth.models import Group from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType +from django.db.models import Count +from django.db.models import IntegerField +from django.db.models import OuterRef from django.db.models import Q from django.db.models import QuerySet +from django.db.models import Subquery +from django.db.models.functions import Cast +from django.db.models.functions import Coalesce from guardian.core import ObjectPermissionChecker from guardian.models import GroupObjectPermission +from guardian.models import UserObjectPermission from guardian.shortcuts import assign_perm from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_users_with_perms @@ -61,21 +70,27 @@ def get_groups_with_only_permission(obj, codename): return Group.objects.filter(id__in=group_object_perm_group_ids).distinct() -def set_permissions_for_object(permissions: list[str], object, *, merge: bool = False): +def set_permissions_for_object( + permissions: dict, + object, + *, + merge: bool = False, +) -> None: """ - Set permissions for an object. The permissions are given as a list of strings - in the format "action_modelname", e.g. "view_document". + Set permissions for an object. The permissions are given as a mapping of actions + to a dict of user / group id lists, e.g. + {"view": {"users": [1], "groups": [2]}, "change": {"users": [], "groups": []}}. If merge is True, the permissions are merged with the existing permissions and no users or groups are removed. If False, the permissions are set to exactly the given list of users and groups. """ - for action in permissions: + for action, entry in permissions.items(): permission = f"{action}_{object.__class__.__name__.lower()}" - if "users" in permissions[action]: + if "users" in entry: # users - users_to_add = User.objects.filter(id__in=permissions[action]["users"]) + users_to_add = User.objects.filter(id__in=entry["users"]) users_to_remove = ( get_users_with_perms( object, @@ -85,12 +100,12 @@ def set_permissions_for_object(permissions: list[str], object, *, merge: bool = if not merge else User.objects.none() ) - if len(users_to_add) > 0 and len(users_to_remove) > 0: + if users_to_add.exists() and users_to_remove.exists(): users_to_remove = users_to_remove.exclude(id__in=users_to_add) - if len(users_to_remove) > 0: + if users_to_remove.exists(): for user in users_to_remove: remove_perm(permission, user, object) - if len(users_to_add) > 0: + if users_to_add.exists(): for user in users_to_add: assign_perm(permission, user, object) if action == "change": @@ -100,9 +115,9 @@ def set_permissions_for_object(permissions: list[str], object, *, merge: bool = user, object, ) - if "groups" in permissions[action]: + if "groups" in entry: # groups - groups_to_add = Group.objects.filter(id__in=permissions[action]["groups"]) + groups_to_add = Group.objects.filter(id__in=entry["groups"]) groups_to_remove = ( get_groups_with_only_permission( object, @@ -111,12 +126,12 @@ def set_permissions_for_object(permissions: list[str], object, *, merge: bool = if not merge else Group.objects.none() ) - if len(groups_to_add) > 0 and len(groups_to_remove) > 0: + if groups_to_add.exists() and groups_to_remove.exists(): groups_to_remove = groups_to_remove.exclude(id__in=groups_to_add) - if len(groups_to_remove) > 0: + if groups_to_remove.exists(): for group in groups_to_remove: remove_perm(permission, group, object) - if len(groups_to_add) > 0: + if groups_to_add.exists(): for group in groups_to_add: assign_perm(permission, group, object) if action == "change": @@ -128,32 +143,121 @@ def set_permissions_for_object(permissions: list[str], object, *, merge: bool = ) +def _permitted_document_ids(user): + """ + Return a queryset of document IDs the user may view, limited to non-deleted + documents. This intentionally avoids ``get_objects_for_user`` to keep the + subquery small and index-friendly. + """ + + base_docs = Document.objects.filter(deleted_at__isnull=True).only("id", "owner") + + if user is None or not getattr(user, "is_authenticated", False): + # Just Anonymous user e.g. for drf-spectacular + return base_docs.filter(owner__isnull=True).values_list("id", flat=True) + + if getattr(user, "is_superuser", False): + return base_docs.values_list("id", flat=True) + + document_ct = ContentType.objects.get_for_model(Document) + perm_filter = { + "permission__codename": "view_document", + "permission__content_type": document_ct, + } + + user_perm_docs = ( + UserObjectPermission.objects.filter(user=user, **perm_filter) + .annotate(object_pk_int=Cast("object_pk", IntegerField())) + .values_list("object_pk_int", flat=True) + ) + + group_perm_docs = ( + GroupObjectPermission.objects.filter(group__user=user, **perm_filter) + .annotate(object_pk_int=Cast("object_pk", IntegerField())) + .values_list("object_pk_int", flat=True) + ) + + permitted_documents = user_perm_docs.union(group_perm_docs) + + return base_docs.filter( + Q(owner=user) | Q(owner__isnull=True) | Q(id__in=permitted_documents), + ).values_list("id", flat=True) + + def get_document_count_filter_for_user(user): """ Return the Q object used to filter document counts for the given user. + + The filter is expressed as an ``id__in`` against a small subquery of permitted + document IDs to keep the generated SQL simple and avoid large OR clauses. """ - if user is None or not getattr(user, "is_authenticated", False): - return Q(documents__deleted_at__isnull=True, documents__owner__isnull=True) if getattr(user, "is_superuser", False): + # Superuser: no permission filtering needed return Q(documents__deleted_at__isnull=True) - return Q( - documents__deleted_at__isnull=True, - documents__id__in=get_objects_for_user_owner_aware( - user, - "documents.view_document", - Document, - ).values_list("id", flat=True), + + permitted_ids = _permitted_document_ids(user) + return Q(documents__id__in=permitted_ids) + + +def annotate_document_count_for_related_queryset( + queryset: QuerySet[Any], + through_model: Any, + related_object_field: str, + target_field: str = "document_id", + user: User | None = None, +) -> QuerySet[Any]: + """ + Annotate a queryset with permissions-aware document counts using a subquery + against a relation table. + + Args: + queryset: base queryset to annotate (must contain pk) + through_model: model representing the relation (e.g., Document.tags.through + or CustomFieldInstance) + source_field: field on the relation pointing back to queryset pk + target_field: field on the relation pointing to Document id + user: the user for whom to filter permitted document ids + """ + + permitted_ids = _permitted_document_ids(user) + counts = ( + through_model.objects.filter( + **{ + related_object_field: OuterRef("pk"), + f"{target_field}__in": permitted_ids, + }, + ) + .values(related_object_field) + .annotate(c=Count(target_field)) + .values("c") ) + return queryset.annotate(document_count=Coalesce(Subquery(counts[:1]), 0)) + +def get_objects_for_user_owner_aware( + user: User | None, + perms: str | list[str], + Model: Any, + *, + include_deleted: bool = False, +) -> QuerySet: + """ + Returns objects the user owns, are unowned, or has explicit perms. + When include_deleted is True, soft-deleted items are also included. + """ + manager = ( + Model.global_objects + if include_deleted and hasattr(Model, "global_objects") + else Model.objects + ) -def get_objects_for_user_owner_aware(user, perms, Model) -> QuerySet: - objects_owned = Model.objects.filter(owner=user) - objects_unowned = Model.objects.filter(owner__isnull=True) + objects_owned = manager.filter(owner=user) + objects_unowned = manager.filter(owner__isnull=True) objects_with_perms = get_objects_for_user( user=user, perms=perms, - klass=Model, + klass=manager.all(), accept_global_perms=False, ) return objects_owned | objects_unowned | objects_with_perms @@ -212,7 +316,7 @@ class AcknowledgeTasksPermissions(BasePermission): "POST": ["documents.change_paperlesstask"], } - def has_permission(self, request, view): + def has_permission(self, request: Any, view: Any) -> bool: if not request.user or not request.user.is_authenticated: # pragma: no cover return False diff --git a/src/documents/plugins/date_parsing/__init__.py b/src/documents/plugins/date_parsing/__init__.py new file mode 100644 index 0000000000..2eec1e2425 --- /dev/null +++ b/src/documents/plugins/date_parsing/__init__.py @@ -0,0 +1,101 @@ +import logging +from functools import lru_cache +from importlib.metadata import EntryPoint +from importlib.metadata import entry_points +from typing import Final + +from django.conf import settings +from django.utils import timezone + +from documents.plugins.date_parsing.base import DateParserConfig +from documents.plugins.date_parsing.base import DateParserPluginBase +from documents.plugins.date_parsing.regex_parser import RegexDateParserPlugin +from paperless.config import OcrConfig +from paperless.utils import ocr_to_dateparser_languages + +logger = logging.getLogger(__name__) + +DATE_PARSER_ENTRY_POINT_GROUP: Final = "paperless_ngx.date_parsers" + + +@lru_cache(maxsize=1) +def _discover_parser_class() -> type[DateParserPluginBase]: + """ + Discovers the date parser plugin class to use. + + - If one or more plugins are found, sorts them by name and returns the first. + - If no plugins are found, returns the default RegexDateParser. + """ + + eps: tuple[EntryPoint, ...] + try: + eps = entry_points(group=DATE_PARSER_ENTRY_POINT_GROUP) + except Exception as e: + # Log a warning + logger.warning(f"Could not query entry points for date parsers: {e}") + eps = () + + valid_plugins: list[EntryPoint] = [] + for ep in eps: + try: + plugin_class = ep.load() + if plugin_class and issubclass(plugin_class, DateParserPluginBase): + valid_plugins.append(ep) + else: + logger.warning(f"Plugin {ep.name} does not subclass DateParser.") + except Exception as e: + logger.error(f"Unable to load date parser plugin {ep.name}: {e}") + + if not valid_plugins: + return RegexDateParserPlugin + + valid_plugins.sort(key=lambda ep: ep.name) + + if len(valid_plugins) > 1: + logger.warning( + f"Multiple date parsers found: " + f"{[ep.name for ep in valid_plugins]}. " + f"Using the first one by name: '{valid_plugins[0].name}'.", + ) + + return valid_plugins[0].load() + + +def get_date_parser() -> DateParserPluginBase: + """ + Factory function to get an initialized date parser instance. + + This function is responsible for: + 1. Discovering the correct parser class (plugin or default). + 2. Loading configuration from Django settings. + 3. Instantiating the parser with the configuration. + """ + # 1. Discover the class (this is cached) + parser_class = _discover_parser_class() + + # 2. Load configuration from settings + # TODO: Get the language from the settings and/or configuration object, depending + ocr_config = OcrConfig() + languages = settings.DATE_PARSER_LANGUAGES or ocr_to_dateparser_languages( + ocr_config.language, + ) + + config = DateParserConfig( + languages=languages, + timezone_str=settings.TIME_ZONE, + ignore_dates=settings.IGNORE_DATES, + reference_time=timezone.now(), + filename_date_order=settings.FILENAME_DATE_ORDER, + content_date_order=settings.DATE_ORDER, + ) + + # 3. Instantiate the discovered class with the config + return parser_class(config=config) + + +__all__ = [ + "DateParserConfig", + "DateParserPluginBase", + "RegexDateParserPlugin", + "get_date_parser", +] diff --git a/src/documents/plugins/date_parsing/base.py b/src/documents/plugins/date_parsing/base.py new file mode 100644 index 0000000000..9605fe8084 --- /dev/null +++ b/src/documents/plugins/date_parsing/base.py @@ -0,0 +1,120 @@ +import datetime +import logging +from abc import ABC +from abc import abstractmethod +from collections.abc import Iterator +from dataclasses import dataclass +from types import TracebackType +from typing import Self + +import dateparser + +logger = logging.getLogger(__name__) + + +@dataclass(frozen=True, slots=True) +class DateParserConfig: + """ + Configuration for a DateParser instance. + + This object is created by the factory and passed to the + parser's constructor, decoupling the parser from settings. + """ + + languages: list[str] + timezone_str: str + ignore_dates: set[datetime.date] + + # A "now" timestamp for filtering future dates. + # Passed in by the factory. + reference_time: datetime.datetime + + # Settings for the default RegexDateParser + # Other plugins should use or consider these, but it is not required + filename_date_order: str | None + content_date_order: str + + +class DateParserPluginBase(ABC): + """ + Abstract base class for date parsing strategies. + + Instances are configured via a DateParserConfig object. + """ + + def __init__(self, config: DateParserConfig): + """ + Initializes the parser with its configuration. + """ + self.config = config + + def __enter__(self) -> Self: + """ + Enter the runtime context related to this object. + + Subclasses can override this to acquire resources (connections, handles). + """ + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + """ + Exit the runtime context related to this object. + + Subclasses can override this to release resources. + """ + # Default implementation does nothing. + # Returning None implies exceptions are propagated. + + def _parse_string( + self, + date_string: str, + date_order: str, + ) -> datetime.datetime | None: + """ + Helper method to parse a single date string using dateparser. + + Uses configuration from `self.config`. + """ + try: + return dateparser.parse( + date_string, + settings={ + "DATE_ORDER": date_order, + "PREFER_DAY_OF_MONTH": "first", + "RETURN_AS_TIMEZONE_AWARE": True, + "TIMEZONE": self.config.timezone_str, + }, + locales=self.config.languages, + ) + except Exception as e: + logger.error(f"Error while parsing date string '{date_string}': {e}") + return None + + def _filter_date( + self, + date: datetime.datetime | None, + ) -> datetime.datetime | None: + """ + Helper method to validate a parsed datetime object. + + Uses configuration from `self.config`. + """ + if ( + date is not None + and date.year > 1900 + and date <= self.config.reference_time + and date.date() not in self.config.ignore_dates + ): + return date + return None + + @abstractmethod + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + """ + Parses a document's filename and content, yielding valid datetime objects. + """ diff --git a/src/documents/plugins/date_parsing/regex_parser.py b/src/documents/plugins/date_parsing/regex_parser.py new file mode 100644 index 0000000000..2df8f92955 --- /dev/null +++ b/src/documents/plugins/date_parsing/regex_parser.py @@ -0,0 +1,65 @@ +import datetime +import re +from collections.abc import Iterator +from re import Match + +from documents.plugins.date_parsing.base import DateParserPluginBase + + +class RegexDateParserPlugin(DateParserPluginBase): + """ + The default date parser, using a series of regular expressions. + + It is configured entirely by the DateParserConfig object + passed to its constructor. + """ + + DATE_REGEX = re.compile( + r"(\b|(?!=([_-])))(\d{1,2})[\.\/-](\d{1,2})[\.\/-](\d{4}|\d{2})(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))(\d{4}|\d{2})[\.\/-](\d{1,2})[\.\/-](\d{1,2})(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))(\d{1,2}[\. ]+[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{4}|[a-zéûäëčžúřěáíóńźçŞğü]{3,9} \d{1,2}, \d{4})(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))([^\W\d_]{3,9} \d{1,2}, (\d{4}))(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))([^\W\d_]{3,9} \d{4})(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))(\d{1,2}[^ 0-9]{2}[\. ]+[^ ]{3,9}[ \.\/-]\d{4})(\b|(?=([_-])))|" + r"(\b|(?!=([_-])))(\b\d{1,2}[ \.\/-][a-zéûäëčžúřěáíóńźçŞğü]{3}[ \.\/-]\d{4})(\b|(?=([_-])))", + re.IGNORECASE, + ) + + def _process_match( + self, + match: Match[str], + date_order: str, + ) -> datetime.datetime | None: + """ + Processes a single regex match using the base class helpers. + """ + date_string = match.group(0) + date = self._parse_string(date_string, date_order) + return self._filter_date(date) + + def _process_content( + self, + content: str, + date_order: str, + ) -> Iterator[datetime.datetime]: + """ + Finds all regex matches in content and yields valid dates. + """ + for m in re.finditer(self.DATE_REGEX, content): + date = self._process_match(m, date_order) + if date is not None: + yield date + + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + """ + Implementation of the abstract parse method. + + Reads its configuration from `self.config`. + """ + if self.config.filename_date_order: + yield from self._process_content( + filename, + self.config.filename_date_order, + ) + + yield from self._process_content(content, self.config.content_date_order) diff --git a/src/documents/plugins/helpers.py b/src/documents/plugins/helpers.py index 3315ec60ee..e5cfde3b81 100644 --- a/src/documents/plugins/helpers.py +++ b/src/documents/plugins/helpers.py @@ -1,4 +1,5 @@ import enum +from collections.abc import Mapping from typing import TYPE_CHECKING from asgiref.sync import async_to_sync @@ -8,7 +9,7 @@ from channels_redis.pubsub import RedisPubSubChannelLayer -class ProgressStatusOptions(str, enum.Enum): +class ProgressStatusOptions(enum.StrEnum): STARTED = "STARTED" WORKING = "WORKING" SUCCESS = "SUCCESS" @@ -47,7 +48,7 @@ def close(self) -> None: async_to_sync(self._channel.flush) self._channel = None - def send(self, payload: dict[str, str | int | None]) -> None: + def send(self, payload: Mapping[str, object]) -> None: # Ensure the layer is open self.open() @@ -73,26 +74,28 @@ def send_progress( max_progress: int, extra_args: dict[str, str | int | None] | None = None, ) -> None: - payload = { - "type": "status_update", - "data": { - "filename": self.filename, - "task_id": self.task_id, - "current_progress": current_progress, - "max_progress": max_progress, - "status": status, - "message": message, - }, + data: dict[str, object] = { + "filename": self.filename, + "task_id": self.task_id, + "current_progress": current_progress, + "max_progress": max_progress, + "status": status, + "message": message, } if extra_args is not None: - payload["data"].update(extra_args) + data.update(extra_args) + + payload: dict[str, object] = { + "type": "status_update", + "data": data, + } self.send(payload) class DocumentsStatusManager(BaseStatusManager): def send_documents_deleted(self, documents: list[int]) -> None: - payload = { + payload: dict[str, object] = { "type": "documents_deleted", "data": { "documents": documents, @@ -100,3 +103,25 @@ def send_documents_deleted(self, documents: list[int]) -> None: } self.send(payload) + + def send_document_updated( + self, + *, + document_id: int, + modified: str, + owner_id: int | None = None, + users_can_view: list[int] | None = None, + groups_can_view: list[int] | None = None, + ) -> None: + payload: dict[str, object] = { + "type": "document_updated", + "data": { + "document_id": document_id, + "modified": modified, + "owner_id": owner_id, + "users_can_view": users_can_view or [], + "groups_can_view": groups_can_view or [], + }, + } + + self.send(payload) diff --git a/src/documents/regex.py b/src/documents/regex.py new file mode 100644 index 0000000000..35acc5af0f --- /dev/null +++ b/src/documents/regex.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import logging +import textwrap + +import regex +from django.conf import settings + +logger = logging.getLogger("paperless.regex") + +REGEX_TIMEOUT_SECONDS: float = getattr(settings, "MATCH_REGEX_TIMEOUT_SECONDS", 0.1) + + +def validate_regex_pattern(pattern: str) -> None: + """ + Validate user provided regex for basic compile errors. + Raises ValueError on validation failure. + """ + + try: + regex.compile(pattern) + except regex.error as exc: + raise ValueError(exc.msg) from exc + + +def safe_regex_search(pattern: str, text: str, *, flags: int = 0): + """ + Run a regex search with a timeout. Returns a match object or None. + Validation errors and timeouts are logged and treated as no match. + """ + + try: + validate_regex_pattern(pattern) + compiled = regex.compile(pattern, flags=flags) + except (regex.error, ValueError) as exc: + logger.error( + "Error while processing regular expression %s: %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + exc, + ) + return None + + try: + return compiled.search(text, timeout=REGEX_TIMEOUT_SECONDS) + except TimeoutError: + logger.warning( + "Regular expression matching timed out for pattern %s", + textwrap.shorten(pattern, width=80, placeholder="…"), + ) + return None diff --git a/src/documents/sanity_checker.py b/src/documents/sanity_checker.py index 5e5510971d..ef0d37e7d5 100644 --- a/src/documents/sanity_checker.py +++ b/src/documents/sanity_checker.py @@ -1,80 +1,174 @@ +""" +Sanity checker for the Paperless-ngx document archive. + +Verifies that all documents have valid files, correct checksums, +and consistent metadata. Reports orphaned files in the media directory. + +Progress display is the caller's responsibility -- pass an ``iter_wrapper`` +to wrap the document queryset (e.g., with a progress bar). The default +is an identity function that adds no overhead. +""" + +from __future__ import annotations + import hashlib import logging import uuid from collections import defaultdict +from collections.abc import Callable +from collections.abc import Iterable +from collections.abc import Iterator from pathlib import Path +from typing import TYPE_CHECKING from typing import Final +from typing import TypedDict +from typing import TypeVar from celery import states from django.conf import settings from django.utils import timezone -from tqdm import tqdm from documents.models import Document from documents.models import PaperlessTask from paperless.config import GeneralConfig +logger = logging.getLogger("paperless.sanity_checker") + +_T = TypeVar("_T") +IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] + + +class MessageEntry(TypedDict): + """A single sanity check message with its severity level.""" + + level: int + message: str + + +def _identity(iterable: Iterable[_T]) -> Iterable[_T]: + """Pass through an iterable unchanged (default iter_wrapper).""" + return iterable + class SanityCheckMessages: - def __init__(self): - self._messages: dict[int, list[dict]] = defaultdict(list) - self.has_error = False - self.has_warning = False + """Collects sanity check messages grouped by document primary key. + + Messages are categorized as error, warning, or info. ``None`` is used + as the key for messages not associated with a specific document + (e.g., orphaned files). + """ + + def __init__(self) -> None: + self._messages: dict[int | None, list[MessageEntry]] = defaultdict(list) + self.has_error: bool = False + self.has_warning: bool = False + self.has_info: bool = False + self.document_count: int = 0 + self.document_error_count: int = 0 + self.document_warning_count: int = 0 + self.document_info_count: int = 0 + self.global_warning_count: int = 0 - def error(self, doc_pk, message): + # -- Recording ---------------------------------------------------------- + + def error(self, doc_pk: int | None, message: str) -> None: self._messages[doc_pk].append({"level": logging.ERROR, "message": message}) self.has_error = True + if doc_pk is not None: + self.document_count += 1 + self.document_error_count += 1 - def warning(self, doc_pk, message): + def warning(self, doc_pk: int | None, message: str) -> None: self._messages[doc_pk].append({"level": logging.WARNING, "message": message}) self.has_warning = True - def info(self, doc_pk, message): + if doc_pk is not None: + self.document_count += 1 + self.document_warning_count += 1 + else: + # This is the only type of global message we do right now + self.global_warning_count += 1 + + def info(self, doc_pk: int | None, message: str) -> None: self._messages[doc_pk].append({"level": logging.INFO, "message": message}) + self.has_info = True + + if doc_pk is not None: + self.document_count += 1 + self.document_info_count += 1 + + # -- Iteration / query -------------------------------------------------- + + def document_pks(self) -> list[int | None]: + """Return all document PKs (including None for global messages).""" + return list(self._messages.keys()) - def log_messages(self): - logger = logging.getLogger("paperless.sanity_checker") + def iter_messages(self) -> Iterator[tuple[int | None, list[MessageEntry]]]: + """Iterate over (doc_pk, messages) pairs.""" + yield from self._messages.items() + def __getitem__(self, item: int | None) -> list[MessageEntry]: + return self._messages[item] + + # -- Summarize Helpers -------------------------------------------------- + + @property + def has_global_issues(self) -> bool: + return None in self._messages + + @property + def total_issue_count(self) -> int: + """Total number of error and warning messages across all documents and global.""" + return ( + self.document_error_count + + self.document_warning_count + + self.global_warning_count + ) + + # -- Logging output (used by Celery task path) -------------------------- + + def log_messages(self) -> None: + """Write all messages to the ``paperless.sanity_checker`` logger. + + This is the output path for headless / Celery execution. + Management commands use Rich rendering instead. + """ if len(self._messages) == 0: logger.info("Sanity checker detected no issues.") - else: - # Query once - all_docs = Document.global_objects.all() - - for doc_pk in self._messages: - if doc_pk is not None: - doc = all_docs.get(pk=doc_pk) - logger.info( - f"Detected following issue(s) with document #{doc.pk}," - f" titled {doc.title}", - ) - for msg in self._messages[doc_pk]: - logger.log(msg["level"], msg["message"]) - - def __len__(self): - return len(self._messages) - - def __getitem__(self, item): - return self._messages[item] + return + + doc_pks = [pk for pk in self._messages if pk is not None] + titles: dict[int, str] = {} + if doc_pks: + titles = dict( + Document.global_objects.filter(pk__in=doc_pks) + .only("pk", "title") + .values_list("pk", "title"), + ) + + for doc_pk, entries in self._messages.items(): + if doc_pk is not None: + title = titles.get(doc_pk, "Unknown") + logger.info( + "Detected following issue(s) with document #%s, titled %s", + doc_pk, + title, + ) + for msg in entries: + logger.log(msg["level"], msg["message"]) class SanityCheckFailedException(Exception): pass -def check_sanity(*, progress=False, scheduled=True) -> SanityCheckMessages: - paperless_task = PaperlessTask.objects.create( - task_id=uuid.uuid4(), - type=PaperlessTask.TaskType.SCHEDULED_TASK - if scheduled - else PaperlessTask.TaskType.MANUAL_TASK, - task_name=PaperlessTask.TaskName.CHECK_SANITY, - status=states.STARTED, - date_created=timezone.now(), - date_started=timezone.now(), - ) - messages = SanityCheckMessages() +# --------------------------------------------------------------------------- +# Internal helpers +# --------------------------------------------------------------------------- + +def _build_present_files() -> set[Path]: + """Collect all files in MEDIA_ROOT, excluding directories and ignorable files.""" present_files = { x.resolve() for x in Path(settings.MEDIA_ROOT).glob("**/*") @@ -82,95 +176,178 @@ def check_sanity(*, progress=False, scheduled=True) -> SanityCheckMessages: } lockfile = Path(settings.MEDIA_LOCK).resolve() - if lockfile in present_files: - present_files.remove(lockfile) + present_files.discard(lockfile) general_config = GeneralConfig() app_logo = general_config.app_logo or settings.APP_LOGO if app_logo: logo_file = Path(settings.MEDIA_ROOT / Path(app_logo.lstrip("/"))).resolve() - if logo_file in present_files: - present_files.remove(logo_file) - - for doc in tqdm(Document.global_objects.all(), disable=not progress): - # Check sanity of the thumbnail - thumbnail_path: Final[Path] = Path(doc.thumbnail_path).resolve() - if not thumbnail_path.exists() or not thumbnail_path.is_file(): - messages.error(doc.pk, "Thumbnail of document does not exist.") - else: - if thumbnail_path in present_files: - present_files.remove(thumbnail_path) - try: - _ = thumbnail_path.read_bytes() - except OSError as e: - messages.error(doc.pk, f"Cannot read thumbnail file of document: {e}") - - # Check sanity of the original file - # TODO: extract method - source_path: Final[Path] = Path(doc.source_path).resolve() - if not source_path.exists() or not source_path.is_file(): - messages.error(doc.pk, "Original of document does not exist.") - else: - if source_path in present_files: - present_files.remove(source_path) - try: - checksum = hashlib.md5(source_path.read_bytes()).hexdigest() - except OSError as e: - messages.error(doc.pk, f"Cannot read original file of document: {e}") - else: - if checksum != doc.checksum: - messages.error( - doc.pk, - "Checksum mismatch. " - f"Stored: {doc.checksum}, actual: {checksum}.", - ) - - # Check sanity of the archive file. - if doc.archive_checksum is not None and doc.archive_filename is None: + present_files.discard(logo_file) + + return present_files + + +def _check_thumbnail( + doc: Document, + messages: SanityCheckMessages, + present_files: set[Path], +) -> None: + """Verify the thumbnail exists and is readable.""" + thumbnail_path: Final[Path] = Path(doc.thumbnail_path).resolve() + if not thumbnail_path.exists() or not thumbnail_path.is_file(): + messages.error(doc.pk, "Thumbnail of document does not exist.") + return + + present_files.discard(thumbnail_path) + try: + _ = thumbnail_path.read_bytes() + except OSError as e: + messages.error(doc.pk, f"Cannot read thumbnail file of document: {e}") + + +def _check_original( + doc: Document, + messages: SanityCheckMessages, + present_files: set[Path], +) -> None: + """Verify the original file exists, is readable, and has matching checksum.""" + source_path: Final[Path] = Path(doc.source_path).resolve() + if not source_path.exists() or not source_path.is_file(): + messages.error(doc.pk, "Original of document does not exist.") + return + + present_files.discard(source_path) + try: + checksum = hashlib.md5(source_path.read_bytes()).hexdigest() + except OSError as e: + messages.error(doc.pk, f"Cannot read original file of document: {e}") + else: + if checksum != doc.checksum: messages.error( doc.pk, - "Document has an archive file checksum, but no archive filename.", + f"Checksum mismatch. Stored: {doc.checksum}, actual: {checksum}.", ) - elif doc.archive_checksum is None and doc.archive_filename is not None: + + +def _check_archive( + doc: Document, + messages: SanityCheckMessages, + present_files: set[Path], +) -> None: + """Verify archive file consistency: checksum/filename pairing and file integrity.""" + if doc.archive_checksum is not None and doc.archive_filename is None: + messages.error( + doc.pk, + "Document has an archive file checksum, but no archive filename.", + ) + elif doc.archive_checksum is None and doc.archive_filename is not None: + messages.error( + doc.pk, + "Document has an archive file, but its checksum is missing.", + ) + elif doc.has_archive_version: + if TYPE_CHECKING: + assert isinstance(doc.archive_path, Path) + archive_path: Final[Path] = Path(doc.archive_path).resolve() + if not archive_path.exists() or not archive_path.is_file(): + messages.error(doc.pk, "Archived version of document does not exist.") + return + + present_files.discard(archive_path) + try: + checksum = hashlib.md5(archive_path.read_bytes()).hexdigest() + except OSError as e: messages.error( doc.pk, - "Document has an archive file, but its checksum is missing.", + f"Cannot read archive file of document: {e}", ) - elif doc.has_archive_version: - archive_path: Final[Path] = Path(doc.archive_path).resolve() - if not archive_path.exists() or not archive_path.is_file(): - messages.error(doc.pk, "Archived version of document does not exist.") - else: - if archive_path in present_files: - present_files.remove(archive_path) - try: - checksum = hashlib.md5(archive_path.read_bytes()).hexdigest() - except OSError as e: - messages.error( - doc.pk, - f"Cannot read archive file of document : {e}", - ) - else: - if checksum != doc.archive_checksum: - messages.error( - doc.pk, - "Checksum mismatch of archived document. " - f"Stored: {doc.archive_checksum}, " - f"actual: {checksum}.", - ) - - # other document checks - if not doc.content: - messages.info(doc.pk, "Document contains no OCR data") + else: + if checksum != doc.archive_checksum: + messages.error( + doc.pk, + "Checksum mismatch of archived document. " + f"Stored: {doc.archive_checksum}, actual: {checksum}.", + ) + + +def _check_content(doc: Document, messages: SanityCheckMessages) -> None: + """Flag documents with no OCR content.""" + if not doc.content: + messages.info(doc.pk, "Document contains no OCR data") + + +def _check_document( + doc: Document, + messages: SanityCheckMessages, + present_files: set[Path], +) -> None: + """Run all checks for a single document.""" + _check_thumbnail(doc, messages, present_files) + _check_original(doc, messages, present_files) + _check_archive(doc, messages, present_files) + _check_content(doc, messages) + + +# --------------------------------------------------------------------------- +# Public entry point +# --------------------------------------------------------------------------- + + +def check_sanity( + *, + scheduled: bool = True, + iter_wrapper: IterWrapper[Document] = _identity, +) -> SanityCheckMessages: + """Run a full sanity check on the document archive. + + Args: + scheduled: Whether this is a scheduled (automatic) or manual check. + Controls the task type recorded in the database. + iter_wrapper: A callable that wraps the document iterable, e.g., + for progress bar display. Defaults to identity (no wrapping). + + Returns: + A SanityCheckMessages instance containing all detected issues. + """ + paperless_task = PaperlessTask.objects.create( + task_id=uuid.uuid4(), + type=( + PaperlessTask.TaskType.SCHEDULED_TASK + if scheduled + else PaperlessTask.TaskType.MANUAL_TASK + ), + task_name=PaperlessTask.TaskName.CHECK_SANITY, + status=states.STARTED, + date_created=timezone.now(), + date_started=timezone.now(), + ) + + messages = SanityCheckMessages() + present_files = _build_present_files() + + documents = Document.global_objects.all() + for doc in iter_wrapper(documents): + _check_document(doc, messages, present_files) for extra_file in present_files: messages.warning(None, f"Orphaned file in media dir: {extra_file}") paperless_task.status = states.SUCCESS if not messages.has_error else states.FAILURE - # result is concatenated messages - paperless_task.result = f"{len(messages)} issues found." - if messages.has_error: - paperless_task.result += " Check logs for details." + if messages.total_issue_count == 0: + paperless_task.result = "No issues found." + else: + parts: list[str] = [] + if messages.document_error_count: + parts.append(f"{messages.document_error_count} document(s) with errors") + if messages.document_warning_count: + parts.append(f"{messages.document_warning_count} document(s) with warnings") + if messages.global_warning_count: + parts.append(f"{messages.global_warning_count} global warning(s)") + paperless_task.result = ", ".join(parts) + " found." + if messages.has_error: + paperless_task.result += " Check logs for details." + paperless_task.date_done = timezone.now() paperless_task.save(update_fields=["status", "result", "date_done"]) + return messages diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index f04bb70daa..7361ca70b5 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -4,9 +4,12 @@ import math import re from datetime import datetime +from datetime import timedelta from decimal import Decimal from typing import TYPE_CHECKING +from typing import Any from typing import Literal +from typing import TypedDict import magic from celery import states @@ -18,9 +21,14 @@ from django.core.validators import DecimalValidator from django.core.validators import EmailValidator from django.core.validators import MaxLengthValidator +from django.core.validators import MaxValueValidator +from django.core.validators import MinValueValidator from django.core.validators import RegexValidator from django.core.validators import integer_validator from django.db.models import Count +from django.db.models import Q +from django.db.models.functions import Lower +from django.utils import timezone from django.utils.crypto import get_random_string from django.utils.dateparse import parse_datetime from django.utils.text import slugify @@ -37,7 +45,9 @@ from guardian.utils import get_user_obj_perms_model from rest_framework import fields from rest_framework import serializers +from rest_framework.exceptions import PermissionDenied from rest_framework.fields import SerializerMethodField +from rest_framework.filters import OrderingFilter if settings.AUDIT_LOG_ENABLED: from auditlog.context import set_actor @@ -57,6 +67,7 @@ from documents.models import SavedView from documents.models import SavedViewFilterRule from documents.models import ShareLink +from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag from documents.models import UiSettings @@ -68,7 +79,10 @@ from documents.parsers import is_mime_type_supported from documents.permissions import get_document_count_filter_for_user from documents.permissions import get_groups_with_only_permission +from documents.permissions import get_objects_for_user_owner_aware +from documents.permissions import has_perms_owner_aware from documents.permissions import set_permissions_for_object +from documents.regex import validate_regex_pattern from documents.templating.filepath import validate_filepath_template_and_render from documents.templating.utils import convert_format_str_to_template_format from documents.validators import uri_validator @@ -77,6 +91,11 @@ if TYPE_CHECKING: from collections.abc import Iterable + from django.db.models.query import QuerySet + from rest_framework.relations import ManyRelatedField + from rest_framework.relations import RelatedField + + logger = logging.getLogger("paperless.serializers") @@ -87,7 +106,7 @@ class DynamicFieldsModelSerializer(serializers.ModelSerializer): controls which fields should be displayed. """ - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: # Don't pass the 'fields' arg up to the superclass fields = kwargs.pop("fields", None) @@ -139,10 +158,11 @@ def validate_match(self, match): and self.initial_data["matching_algorithm"] == MatchingModel.MATCH_REGEX ): try: - re.compile(match) - except re.error as e: + validate_regex_pattern(match) + except ValueError as e: + logger.debug(f"Invalid regular expression: {e!s}") raise serializers.ValidationError( - _("Invalid regular expression: %(error)s") % {"error": str(e.msg)}, + "Invalid regular expression, see log for details.", ) return match @@ -190,12 +210,12 @@ def validate_set_permissions(self, set_permissions=None): del permissions_dict[action] return permissions_dict - def _set_permissions(self, permissions, object): + def _set_permissions(self, permissions, object) -> None: set_permissions_for_object(permissions, object) class SerializerWithPerms(serializers.Serializer): - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: self.user = kwargs.pop("user", None) self.full_perms = kwargs.pop("full_perms", False) self.all_fields = kwargs.pop("all_fields", False) @@ -244,7 +264,7 @@ class OwnedObjectSerializer( serializers.ModelSerializer, SetPermissionsMixin, ): - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) if not self.all_fields: @@ -394,7 +414,7 @@ def get_is_shared_by_requester(self, obj: Document) -> bool: ) # other methods in mixin - def validate_unique_together(self, validated_data, instance=None): + def validate_unique_together(self, validated_data, instance=None) -> None: # workaround for https://github.com/encode/django-rest-framework/issues/9358 if "owner" in validated_data and "name" in self.Meta.fields: name = validated_data.get("name", instance.name if instance else None) @@ -430,6 +450,19 @@ def create(self, validated_data): return instance def update(self, instance, validated_data): + user = getattr(self, "user", None) + is_superuser = user.is_superuser if user is not None else False + is_owner = instance.owner == user if user is not None else False + is_unowned = instance.owner is None + + if ( + ("owner" in validated_data and validated_data["owner"] != instance.owner) + or "set_permissions" in validated_data + ) and not (is_superuser or is_owner or is_unowned): + raise PermissionDenied( + _("Insufficient permissions."), + ) + if "set_permissions" in validated_data: self._set_permissions(validated_data["set_permissions"], instance) self.validate_unique_together(validated_data, instance) @@ -520,28 +553,6 @@ def to_representation(self, value): return 1 -class TagSerializerVersion1(MatchingModelSerializer, OwnedObjectSerializer): - colour = ColorField(source="color", default="#a6cee3") - - class Meta: - model = Tag - fields = ( - "id", - "slug", - "name", - "colour", - "match", - "matching_algorithm", - "is_insensitive", - "is_inbox_tag", - "document_count", - "owner", - "permissions", - "user_can_change", - "set_permissions", - ) - - class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer): def get_text_color(self, obj) -> str: try: @@ -574,17 +585,38 @@ def get_text_color(self, obj) -> str: ), ) def get_children(self, obj): - filter_q = self.context.get("document_count_filter") - if filter_q is None: + children_map = self.context.get("children_map") + if children_map is not None: + children = children_map.get(obj.pk, []) + else: + filter_q = self.context.get("document_count_filter") request = self.context.get("request") - user = getattr(request, "user", None) if request else None - filter_q = get_document_count_filter_for_user(user) - self.context["document_count_filter"] = filter_q + if filter_q is None: + user = getattr(request, "user", None) if request else None + filter_q = get_document_count_filter_for_user(user) + self.context["document_count_filter"] = filter_q + + children = ( + obj.get_children_queryset() + .select_related("owner") + .annotate(document_count=Count("documents", filter=filter_q)) + ) + + view = self.context.get("view") + ordering = ( + OrderingFilter().get_ordering(request, children, view) + if request and view + else None + ) + ordering = ordering or (Lower("name"),) + children = children.order_by(*ordering) + serializer = TagSerializer( - obj.get_children_queryset() - .select_related("owner") - .annotate(document_count=Count("documents", filter=filter_q)), + children, many=True, + user=self.user, + full_perms=self.full_perms, + all_fields=self.all_fields, context=self.context, ) return serializer.data @@ -671,15 +703,6 @@ def get_queryset(self): class CustomFieldSerializer(serializers.ModelSerializer): - def __init__(self, *args, **kwargs): - context = kwargs.get("context") - self.api_version = int( - context.get("request").version - if context and context.get("request") - else settings.REST_FRAMEWORK["DEFAULT_VERSION"], - ) - super().__init__(*args, **kwargs) - data_type = serializers.ChoiceField( choices=CustomField.FieldDataType, read_only=False, @@ -759,45 +782,13 @@ def validate(self, attrs): ) return super().validate(attrs) - def to_internal_value(self, data): - ret = super().to_internal_value(data) - - if ( - self.api_version < 7 - and ret.get("data_type", "") == CustomField.FieldDataType.SELECT - and isinstance(ret.get("extra_data", {}).get("select_options"), list) - ): - ret["extra_data"]["select_options"] = [ - { - "label": option, - "id": get_random_string(length=16), - } - for option in ret["extra_data"]["select_options"] - ] - - return ret - - def to_representation(self, instance): - ret = super().to_representation(instance) - - if ( - self.api_version < 7 - and instance.data_type == CustomField.FieldDataType.SELECT - ): - # Convert the select options with ids to a list of strings - ret["extra_data"]["select_options"] = [ - option["label"] for option in ret["extra_data"]["select_options"] - ] - - return ret - class ReadWriteSerializerMethodField(serializers.SerializerMethodField): """ Based on https://stackoverflow.com/a/62579804 """ - def __init__(self, method_name=None, *args, **kwargs): + def __init__(self, method_name=None, *args, **kwargs) -> None: self.method_name = method_name kwargs["source"] = "*" super(serializers.SerializerMethodField, self).__init__(*args, **kwargs) @@ -854,6 +845,13 @@ def validate(self, data): uri_validator(data["value"]) elif field.data_type == CustomField.FieldDataType.INT: integer_validator(data["value"]) + try: + value_int = int(data["value"]) + except (TypeError, ValueError): + raise serializers.ValidationError("Enter a valid integer.") + # Keep values within the PostgreSQL integer range + MinValueValidator(-2147483648)(value_int) + MaxValueValidator(2147483647)(value_int) elif ( field.data_type == CustomField.FieldDataType.MONETARY and data["value"] != "" @@ -898,50 +896,6 @@ def validate(self, data): return data - def get_api_version(self): - return int( - self.context.get("request").version - if self.context.get("request") - else settings.REST_FRAMEWORK["DEFAULT_VERSION"], - ) - - def to_internal_value(self, data): - ret = super().to_internal_value(data) - - if ( - self.get_api_version() < 7 - and ret.get("field").data_type == CustomField.FieldDataType.SELECT - and ret.get("value") is not None - ): - # Convert the index of the option in the field.extra_data["select_options"] - # list to the options unique id - ret["value"] = ret.get("field").extra_data["select_options"][ret["value"]][ - "id" - ] - - return ret - - def to_representation(self, instance): - ret = super().to_representation(instance) - - if ( - self.get_api_version() < 7 - and instance.field.data_type == CustomField.FieldDataType.SELECT - ): - # return the index of the option in the field.extra_data["select_options"] list - ret["value"] = next( - ( - idx - for idx, option in enumerate( - instance.field.extra_data["select_options"], - ) - if option["id"] == instance.value - ), - None, - ) - - return ret - class Meta: model = CustomFieldInstance fields = [ @@ -965,19 +919,48 @@ class Meta: fields = ["id", "note", "created", "user"] ordering = ["-created"] - def to_representation(self, instance): - ret = super().to_representation(instance) - request = self.context.get("request") - api_version = int( - request.version if request else settings.REST_FRAMEWORK["DEFAULT_VERSION"], - ) +def _get_viewable_duplicates( + document: Document, + user: User | None, +) -> QuerySet[Document]: + checksums = {document.checksum} + if document.archive_checksum: + checksums.add(document.archive_checksum) + duplicates = Document.global_objects.filter( + Q(checksum__in=checksums) | Q(archive_checksum__in=checksums), + ).exclude(pk=document.pk) + duplicates = duplicates.filter(root_document__isnull=True) + duplicates = duplicates.order_by("-created") + allowed = get_objects_for_user_owner_aware( + user, + "documents.view_document", + Document, + include_deleted=True, + ) + return duplicates.filter(id__in=allowed) - if api_version < 8 and "user" in ret: - user_id = ret["user"]["id"] - ret["user"] = user_id - return ret +class DuplicateDocumentSummarySerializer(serializers.Serializer): + 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 + version_label: str | None + checksum: str | None + is_root: bool @extend_schema_serializer( @@ -997,8 +980,13 @@ class DocumentSerializer( archived_file_name = SerializerMethodField() created_date = serializers.DateField(required=False) page_count = SerializerMethodField() + duplicate_documents = SerializerMethodField() notes = NotesSerializer(many=True, required=False, read_only=True) + root_document: RelatedField[Document, Document, Any] | ManyRelatedField = ( + serializers.PrimaryKeyRelatedField(read_only=True) + ) + versions = SerializerMethodField() custom_fields = CustomFieldInstanceSerializer( many=True, @@ -1022,6 +1010,54 @@ class DocumentSerializer( def get_page_count(self, obj) -> int | None: return obj.page_count + @extend_schema_field(DuplicateDocumentSummarySerializer(many=True)) + def get_duplicate_documents(self, obj): + view = self.context.get("view") + if view and getattr(view, "action", None) != "retrieve": + return [] + request = self.context.get("request") + user = request.user if request else None + duplicates = _get_viewable_duplicates(obj, user) + return list(duplicates.values("id", "title", "deleted_at")) + + @extend_schema_field(DocumentVersionInfoSerializer(many=True)) + def get_versions(self, obj): + root_doc = obj if obj.root_document_id is None else obj.root_document + if root_doc is None: + return [] + + prefetched_cache = getattr(obj, "_prefetched_objects_cache", None) + prefetched_versions = ( + prefetched_cache.get("versions") + if isinstance(prefetched_cache, dict) + else None + ) + + versions: list[Document] + if prefetched_versions is not None: + versions = [*prefetched_versions, root_doc] + else: + versions_qs = Document.objects.filter(root_document=root_doc).only( + "id", + "added", + "checksum", + "version_label", + ) + versions = [*versions_qs, root_doc] + + def build_info(doc: Document) -> _DocumentVersionInfo: + return { + "id": doc.id, + "added": doc.added, + "version_label": doc.version_label, + "checksum": doc.checksum, + "is_root": doc.id == root_doc.id, + } + + info = [build_info(doc) for doc in versions] + info.sort(key=lambda item: item["id"], reverse=True) + return info + def get_original_file_name(self, obj) -> str | None: return obj.original_filename @@ -1033,24 +1069,10 @@ def get_archived_file_name(self, obj) -> str | None: def to_representation(self, instance): doc = super().to_representation(instance) + if "content" in self.fields and hasattr(instance, "effective_content"): + doc["content"] = getattr(instance, "effective_content") or "" if self.truncate_content and "content" in self.fields: doc["content"] = doc.get("content")[0:550] - - request = self.context.get("request") - api_version = int( - request.version if request else settings.REST_FRAMEWORK["DEFAULT_VERSION"], - ) - - if api_version < 9 and "created" in self.fields: - # provide created as a datetime for backwards compatibility - from django.utils import timezone - - doc["created"] = timezone.make_aware( - datetime.combine( - instance.created, - datetime.min.time(), - ), - ).isoformat() return doc def to_internal_value(self, data): @@ -1168,7 +1190,7 @@ def update(self, instance: Document, validated_data): CustomFieldInstance.deleted_objects.filter(document=instance).delete() return instance - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: self.truncate_content = kwargs.pop("truncate_content", False) # return full permissions if we're doing a PATCH or PUT @@ -1199,6 +1221,7 @@ class Meta: "archive_serial_number", "original_file_name", "archived_file_name", + "duplicate_documents", "owner", "permissions", "user_can_change", @@ -1209,6 +1232,8 @@ class Meta: "remove_inbox_tags", "page_count", "mime_type", + "root_document", + "versions", ) list_serializer_class = OwnedObjectListSerializer @@ -1288,8 +1313,6 @@ class Meta: fields = [ "id", "name", - "show_on_dashboard", - "show_in_sidebar", "sort_field", "sort_reverse", "filter_rules", @@ -1299,8 +1322,127 @@ class Meta: "owner", "permissions", "user_can_change", + "set_permissions", ] + def _get_api_version(self) -> int: + request = self.context.get("request") + return int( + request.version if request else settings.REST_FRAMEWORK["DEFAULT_VERSION"], + ) + + def _update_legacy_visibility_preferences( + self, + saved_view_id: int, + *, + show_on_dashboard: bool | None, + show_in_sidebar: bool | None, + ) -> UiSettings | None: + if show_on_dashboard is None and show_in_sidebar is None: + return None + + request = self.context.get("request") + user = request.user if request else self.user + if user is None: + return None + + ui_settings, _ = UiSettings.objects.get_or_create( + user=user, + defaults={"settings": {}}, + ) + current_settings = ( + ui_settings.settings if isinstance(ui_settings.settings, dict) else {} + ) + current_settings = dict(current_settings) + + saved_views_settings = current_settings.get("saved_views") + if isinstance(saved_views_settings, dict): + saved_views_settings = dict(saved_views_settings) + else: + saved_views_settings = {} + + dashboard_ids = { + int(raw_id) + for raw_id in saved_views_settings.get("dashboard_views_visible_ids", []) + if str(raw_id).isdigit() + } + sidebar_ids = { + int(raw_id) + for raw_id in saved_views_settings.get("sidebar_views_visible_ids", []) + if str(raw_id).isdigit() + } + + if show_on_dashboard is not None: + if show_on_dashboard: + dashboard_ids.add(saved_view_id) + else: + dashboard_ids.discard(saved_view_id) + if show_in_sidebar is not None: + if show_in_sidebar: + sidebar_ids.add(saved_view_id) + else: + sidebar_ids.discard(saved_view_id) + + saved_views_settings["dashboard_views_visible_ids"] = sorted(dashboard_ids) + saved_views_settings["sidebar_views_visible_ids"] = sorted(sidebar_ids) + current_settings["saved_views"] = saved_views_settings + ui_settings.settings = current_settings + ui_settings.save(update_fields=["settings"]) + return ui_settings + + def to_representation(self, instance): + # TODO: remove this and related backwards compatibility code when API v9 is dropped + ret = super().to_representation(instance) + request = self.context.get("request") + api_version = self._get_api_version() + + if api_version < 10: + dashboard_ids = set() + sidebar_ids = set() + user = request.user if request else None + if user is not None and hasattr(user, "ui_settings"): + ui_settings = user.ui_settings.settings or None + saved_views = None + if isinstance(ui_settings, dict): + saved_views = ui_settings.get("saved_views", {}) + if isinstance(saved_views, dict): + dashboard_ids = set( + saved_views.get("dashboard_views_visible_ids", []), + ) + sidebar_ids = set( + saved_views.get("sidebar_views_visible_ids", []), + ) + ret["show_on_dashboard"] = instance.id in dashboard_ids + ret["show_in_sidebar"] = instance.id in sidebar_ids + + return ret + + def to_internal_value(self, data): + # TODO: remove this and related backwards compatibility code when API v9 is dropped + api_version = self._get_api_version() + if api_version >= 10: + return super().to_internal_value(data) + + normalized_data = data.copy() + legacy_visibility_fields = {} + boolean_field = serializers.BooleanField() + + for field_name in ("show_on_dashboard", "show_in_sidebar"): + if field_name in normalized_data: + try: + legacy_visibility_fields[field_name] = ( + boolean_field.to_internal_value( + normalized_data.get(field_name), + ) + ) + except serializers.ValidationError as exc: + raise serializers.ValidationError({field_name: exc.detail}) + del normalized_data[field_name] + + ret = super().to_internal_value(normalized_data) + ret.update(legacy_visibility_fields) + return ret + def validate(self, attrs): attrs = super().validate(attrs) if "display_fields" in attrs and attrs["display_fields"] is not None: @@ -1320,6 +1462,9 @@ def validate(self, attrs): return attrs def update(self, instance, validated_data): + request = self.context.get("request") + show_on_dashboard = validated_data.pop("show_on_dashboard", None) + show_in_sidebar = validated_data.pop("show_in_sidebar", None) if "filter_rules" in validated_data: rules_data = validated_data.pop("filter_rules") else: @@ -1336,21 +1481,38 @@ def update(self, instance, validated_data): and len(validated_data["display_fields"]) == 0 ): validated_data["display_fields"] = None - super().update(instance, validated_data) + instance = super().update(instance, validated_data) if rules_data is not None: SavedViewFilterRule.objects.filter(saved_view=instance).delete() for rule_data in rules_data: SavedViewFilterRule.objects.create(saved_view=instance, **rule_data) + ui_settings = self._update_legacy_visibility_preferences( + instance.id, + show_on_dashboard=show_on_dashboard, + show_in_sidebar=show_in_sidebar, + ) + if request is not None and ui_settings is not None: + request.user.ui_settings = ui_settings return instance def create(self, validated_data): + request = self.context.get("request") + show_on_dashboard = validated_data.pop("show_on_dashboard", None) + show_in_sidebar = validated_data.pop("show_in_sidebar", None) rules_data = validated_data.pop("filter_rules") if "user" in validated_data: # backwards compatibility validated_data["owner"] = validated_data.pop("user") - saved_view = SavedView.objects.create(**validated_data) + saved_view = super().create(validated_data) for rule_data in rules_data: SavedViewFilterRule.objects.create(saved_view=saved_view, **rule_data) + ui_settings = self._update_legacy_visibility_preferences( + saved_view.id, + show_on_dashboard=show_on_dashboard, + show_in_sidebar=show_in_sidebar, + ) + if request is not None and ui_settings is not None: + request.user.ui_settings = ui_settings return saved_view @@ -1362,7 +1524,7 @@ class DocumentListSerializer(serializers.Serializer): child=serializers.IntegerField(), ) - def _validate_document_id_list(self, documents, name="documents"): + def _validate_document_id_list(self, documents, name="documents") -> None: if not isinstance(documents, list): raise serializers.ValidationError(f"{name} must be a list") if not all(isinstance(i, int) for i in documents): @@ -1378,11 +1540,124 @@ def validate_documents(self, documents): return documents +class SourceModeValidationMixin: + def validate_source_mode(self, source_mode: str) -> str: + if source_mode not in bulk_edit.SourceModeChoices.__dict__.values(): + raise serializers.ValidationError("Invalid source_mode") + return source_mode + + +class RotateDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin): + degrees = serializers.IntegerField(required=True) + source_mode = serializers.CharField( + required=False, + default=bulk_edit.SourceModeChoices.LATEST_VERSION, + ) + + +class MergeDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin): + metadata_document_id = serializers.IntegerField( + required=False, + allow_null=True, + ) + delete_originals = serializers.BooleanField(required=False, default=False) + archive_fallback = serializers.BooleanField(required=False, default=False) + source_mode = serializers.CharField( + required=False, + default=bulk_edit.SourceModeChoices.LATEST_VERSION, + ) + + +class EditPdfDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin): + operations = serializers.ListField(required=True) + delete_original = serializers.BooleanField(required=False, default=False) + update_document = serializers.BooleanField(required=False, default=False) + include_metadata = serializers.BooleanField(required=False, default=True) + source_mode = serializers.CharField( + required=False, + default=bulk_edit.SourceModeChoices.LATEST_VERSION, + ) + + def validate(self, attrs): + documents = attrs["documents"] + if len(documents) > 1: + raise serializers.ValidationError( + "Edit PDF method only supports one document", + ) + + operations = attrs["operations"] + if not isinstance(operations, list): + raise serializers.ValidationError("operations must be a list") + + for op in operations: + if not isinstance(op, dict): + raise serializers.ValidationError("invalid operation entry") + if "page" not in op or not isinstance(op["page"], int): + raise serializers.ValidationError("page must be an integer") + if "rotate" in op and not isinstance(op["rotate"], int): + raise serializers.ValidationError("rotate must be an integer") + if "doc" in op and not isinstance(op["doc"], int): + raise serializers.ValidationError("doc must be an integer") + + if attrs["update_document"]: + max_idx = max(op.get("doc", 0) for op in operations) + if max_idx > 0: + raise serializers.ValidationError( + "update_document only allowed with a single output document", + ) + + doc = Document.objects.get(id=documents[0]) + if doc.page_count: + for op in operations: + if op["page"] < 1 or op["page"] > doc.page_count: + raise serializers.ValidationError( + f"Page {op['page']} is out of bounds for document with {doc.page_count} pages.", + ) + return attrs + + +class RemovePasswordDocumentsSerializer( + DocumentListSerializer, + SourceModeValidationMixin, +): + password = serializers.CharField(required=True) + update_document = serializers.BooleanField(required=False, default=False) + delete_original = serializers.BooleanField(required=False, default=False) + include_metadata = serializers.BooleanField(required=False, default=True) + source_mode = serializers.CharField( + required=False, + default=bulk_edit.SourceModeChoices.LATEST_VERSION, + ) + + +class DeleteDocumentsSerializer(DocumentListSerializer): + pass + + +class ReprocessDocumentsSerializer(DocumentListSerializer): + pass + + class BulkEditSerializer( SerializerWithPerms, DocumentListSerializer, SetPermissionsMixin, + SourceModeValidationMixin, ): + # TODO: remove this and related backwards compatibility code when API v9 is dropped + # split, delete_pages can be removed entirely + MOVED_DOCUMENT_ACTION_ENDPOINTS = { + "delete": "/api/documents/delete/", + "reprocess": "/api/documents/reprocess/", + "rotate": "/api/documents/rotate/", + "merge": "/api/documents/merge/", + "edit_pdf": "/api/documents/edit_pdf/", + "remove_password": "/api/documents/remove_password/", + "split": "/api/documents/edit_pdf/", + "delete_pages": "/api/documents/edit_pdf/", + } + LEGACY_DOCUMENT_ACTION_METHODS = tuple(MOVED_DOCUMENT_ACTION_ENDPOINTS.keys()) + method = serializers.ChoiceField( choices=[ "set_correspondent", @@ -1392,14 +1667,8 @@ class BulkEditSerializer( "remove_tag", "modify_tags", "modify_custom_fields", - "delete", - "reprocess", "set_permissions", - "rotate", - "merge", - "split", - "delete_pages", - "edit_pdf", + *LEGACY_DOCUMENT_ACTION_METHODS, ], label="Method", write_only=True, @@ -1407,7 +1676,7 @@ class BulkEditSerializer( parameters = serializers.DictField(allow_empty=True, default={}, write_only=True) - def _validate_tag_id_list(self, tags, name="tags"): + def _validate_tag_id_list(self, tags, name="tags") -> None: if not isinstance(tags, list): raise serializers.ValidationError(f"{name} must be a list") if not all(isinstance(i, int) for i in tags): @@ -1422,7 +1691,7 @@ def _validate_custom_field_id_list_or_dict( self, custom_fields, name="custom_fields", - ): + ) -> None: ids = custom_fields if isinstance(custom_fields, dict): try: @@ -1475,11 +1744,12 @@ def validate_method(self, method): return bulk_edit.delete_pages elif method == "edit_pdf": return bulk_edit.edit_pdf - else: # pragma: no cover - # This will never happen as it is handled by the ChoiceField + elif method == "remove_password": + return bulk_edit.remove_password + else: raise serializers.ValidationError("Unsupported method.") - def _validate_parameters_tags(self, parameters): + def _validate_parameters_tags(self, parameters) -> None: if "tag" in parameters: tag_id = parameters["tag"] try: @@ -1489,7 +1759,7 @@ def _validate_parameters_tags(self, parameters): else: raise serializers.ValidationError("tag not specified") - def _validate_parameters_document_type(self, parameters): + def _validate_parameters_document_type(self, parameters) -> None: if "document_type" in parameters: document_type_id = parameters["document_type"] if document_type_id is None: @@ -1502,7 +1772,7 @@ def _validate_parameters_document_type(self, parameters): else: raise serializers.ValidationError("document_type not specified") - def _validate_parameters_correspondent(self, parameters): + def _validate_parameters_correspondent(self, parameters) -> None: if "correspondent" in parameters: correspondent_id = parameters["correspondent"] if correspondent_id is None: @@ -1514,7 +1784,7 @@ def _validate_parameters_correspondent(self, parameters): else: raise serializers.ValidationError("correspondent not specified") - def _validate_storage_path(self, parameters): + def _validate_storage_path(self, parameters) -> None: if "storage_path" in parameters: storage_path_id = parameters["storage_path"] if storage_path_id is None: @@ -1528,7 +1798,7 @@ def _validate_storage_path(self, parameters): else: raise serializers.ValidationError("storage path not specified") - def _validate_parameters_modify_tags(self, parameters): + def _validate_parameters_modify_tags(self, parameters) -> None: if "add_tags" in parameters: self._validate_tag_id_list(parameters["add_tags"], "add_tags") else: @@ -1539,7 +1809,7 @@ def _validate_parameters_modify_tags(self, parameters): else: raise serializers.ValidationError("remove_tags not specified") - def _validate_parameters_modify_custom_fields(self, parameters): + def _validate_parameters_modify_custom_fields(self, parameters) -> None: if "add_custom_fields" in parameters: self._validate_custom_field_id_list_or_dict( parameters["add_custom_fields"], @@ -1562,7 +1832,7 @@ def _validate_owner(self, owner): raise serializers.ValidationError("Specified owner cannot be found") return ownerUser - def _validate_parameters_set_permissions(self, parameters): + def _validate_parameters_set_permissions(self, parameters) -> None: parameters["set_permissions"] = self.validate_set_permissions( parameters["set_permissions"], ) @@ -1571,7 +1841,7 @@ def _validate_parameters_set_permissions(self, parameters): if "merge" not in parameters: parameters["merge"] = False - def _validate_parameters_rotate(self, parameters): + def _validate_parameters_rotate(self, parameters) -> None: try: if ( "degrees" not in parameters @@ -1581,7 +1851,14 @@ def _validate_parameters_rotate(self, parameters): except ValueError: raise serializers.ValidationError("invalid rotation degrees") - def _validate_parameters_split(self, parameters): + def _validate_source_mode(self, parameters) -> None: + source_mode = parameters.get( + "source_mode", + bulk_edit.SourceModeChoices.LATEST_VERSION, + ) + parameters["source_mode"] = self.validate_source_mode(source_mode) + + def _validate_parameters_split(self, parameters) -> None: if "pages" not in parameters: raise serializers.ValidationError("pages not specified") try: @@ -1610,7 +1887,7 @@ def _validate_parameters_split(self, parameters): else: parameters["delete_originals"] = False - def _validate_parameters_delete_pages(self, parameters): + def _validate_parameters_delete_pages(self, parameters) -> None: if "pages" not in parameters: raise serializers.ValidationError("pages not specified") if not isinstance(parameters["pages"], list): @@ -1618,7 +1895,7 @@ def _validate_parameters_delete_pages(self, parameters): if not all(isinstance(i, int) for i in parameters["pages"]): raise serializers.ValidationError("pages must be a list of integers") - def _validate_parameters_merge(self, parameters): + def _validate_parameters_merge(self, parameters) -> None: if "delete_originals" in parameters: if not isinstance(parameters["delete_originals"], bool): raise serializers.ValidationError("delete_originals must be a boolean") @@ -1630,7 +1907,7 @@ def _validate_parameters_merge(self, parameters): else: parameters["archive_fallback"] = False - def _validate_parameters_edit_pdf(self, parameters, document_id): + def _validate_parameters_edit_pdf(self, parameters, document_id) -> None: if "operations" not in parameters: raise serializers.ValidationError("operations not specified") if not isinstance(parameters["operations"], list): @@ -1671,10 +1948,19 @@ def _validate_parameters_edit_pdf(self, parameters, document_id): f"Page {op['page']} is out of bounds for document with {doc.page_count} pages.", ) + def validate_parameters_remove_password(self, parameters): + if "password" not in parameters: + raise serializers.ValidationError("password not specified") + if not isinstance(parameters["password"], str): + raise serializers.ValidationError("password must be a string") + def validate(self, attrs): method = attrs["method"] parameters = attrs["parameters"] + if "source_mode" in parameters: + self._validate_source_mode(parameters) + if method == bulk_edit.set_correspondent: self._validate_parameters_correspondent(parameters) elif method == bulk_edit.set_document_type: @@ -1711,6 +1997,8 @@ def validate(self, attrs): "Edit PDF method only supports one document", ) self._validate_parameters_edit_pdf(parameters, attrs["documents"][0]) + elif method == bulk_edit.remove_password: + self.validate_parameters_remove_password(parameters) return attrs @@ -1892,6 +2180,38 @@ def validate_created(self, created): return created.date() +class DocumentVersionSerializer(serializers.Serializer): + document = serializers.FileField( + label="Document", + write_only=True, + ) + version_label = serializers.CharField( + label="Version label", + required=False, + allow_blank=True, + allow_null=True, + max_length=64, + ) + + validate_document = PostDocumentSerializer().validate_document + + +class DocumentVersionLabelSerializer(serializers.Serializer): + version_label = serializers.CharField( + label="Version label", + required=True, + allow_blank=True, + allow_null=True, + max_length=64, + ) + + def validate_version_label(self, value): + if value is None: + return None + normalized = value.strip() + return normalized or None + + class BulkDownloadSerializer(DocumentListSerializer): content = serializers.ChoiceField( choices=["archive", "originals", "both"], @@ -2049,10 +2369,12 @@ class Meta: "result", "acknowledged", "related_document", + "duplicate_documents", "owner", ) related_document = serializers.SerializerMethodField() + duplicate_documents = serializers.SerializerMethodField() created_doc_re = re.compile(r"New document id (\d+) created") duplicate_doc_re = re.compile(r"It is a duplicate of .* \(#(\d+)\)") @@ -2077,8 +2399,19 @@ def get_related_document(self, obj) -> str | None: return result + @extend_schema_field(DuplicateDocumentSummarySerializer(many=True)) + def get_duplicate_documents(self, obj): + related_document = self.get_related_document(obj) + request = self.context.get("request") + user = request.user if request else None + document = Document.global_objects.filter(pk=related_document).first() + if not related_document or not user or not document: + return [] + duplicates = _get_viewable_duplicates(document, user) + return list(duplicates.values("id", "title", "deleted_at")) + -class RunTaskViewSerializer(serializers.Serializer): +class RunTaskViewSerializer(serializers.Serializer[dict[str, Any]]): task_name = serializers.ChoiceField( choices=PaperlessTask.TaskName.choices, label="Task Name", @@ -2086,7 +2419,7 @@ class RunTaskViewSerializer(serializers.Serializer): ) -class AcknowledgeTasksViewSerializer(serializers.Serializer): +class AcknowledgeTasksViewSerializer(serializers.Serializer[dict[str, Any]]): tasks = serializers.ListField( required=True, label="Tasks", @@ -2094,7 +2427,7 @@ class AcknowledgeTasksViewSerializer(serializers.Serializer): child=serializers.IntegerField(), ) - def _validate_task_id_list(self, tasks, name="tasks"): + def _validate_task_id_list(self, tasks, name="tasks") -> None: if not isinstance(tasks, list): raise serializers.ValidationError(f"{name} must be a list") if not all(isinstance(i, int) for i in tasks): @@ -2126,6 +2459,115 @@ def create(self, validated_data): validated_data["slug"] = get_random_string(50) return super().create(validated_data) + def validate_document(self, document): + if self.user is not None and has_perms_owner_aware( + self.user, + "view_document", + document, + ): + return document + raise PermissionDenied( + _("Insufficient permissions."), + ) + + +class ShareLinkBundleSerializer(OwnedObjectSerializer): + document_ids = serializers.ListField( + child=serializers.IntegerField(min_value=1), + allow_empty=False, + write_only=True, + ) + expiration_days = serializers.IntegerField( + required=False, + allow_null=True, + min_value=1, + write_only=True, + ) + documents = serializers.PrimaryKeyRelatedField( + many=True, + read_only=True, + ) + document_count = SerializerMethodField() + + class Meta: + model = ShareLinkBundle + fields = ( + "id", + "created", + "expiration", + "expiration_days", + "slug", + "file_version", + "status", + "size_bytes", + "last_error", + "built_at", + "documents", + "document_ids", + "document_count", + ) + read_only_fields = ( + "id", + "created", + "expiration", + "slug", + "status", + "size_bytes", + "last_error", + "built_at", + "documents", + "document_count", + ) + + def validate_document_ids(self, value): + unique_ids = set(value) + if len(unique_ids) != len(value): + raise serializers.ValidationError( + _("Duplicate document identifiers are not allowed."), + ) + return value + + def create(self, validated_data): + document_ids = validated_data.pop("document_ids") + expiration_days = validated_data.pop("expiration_days", None) + validated_data["slug"] = get_random_string(50) + if expiration_days: + validated_data["expiration"] = timezone.now() + timedelta( + days=expiration_days, + ) + else: + validated_data["expiration"] = None + + share_link_bundle = super().create(validated_data) + + documents = list( + Document.objects.filter(pk__in=document_ids).only( + "pk", + ), + ) + documents_by_id = {doc.pk: doc for doc in documents} + missing = [ + str(doc_id) for doc_id in document_ids if doc_id not in documents_by_id + ] + if missing: + raise serializers.ValidationError( + { + "document_ids": _( + "Documents not found: %(ids)s", + ) + % {"ids": ", ".join(missing)}, + }, + ) + + ordered_documents = [documents_by_id[doc_id] for doc_id in document_ids] + share_link_bundle.documents.set(ordered_documents) + share_link_bundle.document_total = len(ordered_documents) + + return share_link_bundle + + def get_document_count(self, obj: ShareLinkBundle) -> int: + return getattr(obj, "document_total") or obj.documents.count() + class BulkEditObjectsSerializer(SerializerWithPerms, SetPermissionsMixin): objects = serializers.ListField( @@ -2201,7 +2643,7 @@ def _validate_objects(self, objects, object_type): ) return objects - def _validate_permissions(self, permissions): + def _validate_permissions(self, permissions) -> None: self.validate_set_permissions( permissions, ) @@ -2254,8 +2696,11 @@ class Meta: "filter_has_all_tags", "filter_has_not_tags", "filter_custom_field_query", + "filter_has_any_correspondents", "filter_has_not_correspondents", + "filter_has_any_document_types", "filter_has_not_document_types", + "filter_has_any_storage_paths", "filter_has_not_storage_paths", "filter_has_correspondent", "filter_has_document_type", @@ -2310,7 +2755,7 @@ def validate(self, attrs): return attrs @staticmethod - def normalize_workflow_trigger_sources(trigger): + def normalize_workflow_trigger_sources(trigger) -> None: """ Convert sources to strings to handle django-multiselectfield v1.0 changes """ @@ -2408,6 +2853,7 @@ class Meta: "remove_change_groups", "email", "webhook", + "passwords", ] def validate(self, attrs): @@ -2464,6 +2910,23 @@ def validate(self, attrs): "Webhook data is required for webhook actions", ) + if ( + "type" in attrs + and attrs["type"] == WorkflowAction.WorkflowActionType.PASSWORD_REMOVAL + ): + passwords = attrs.get("passwords") + # ensure passwords is a non-empty list of non-empty strings + if ( + passwords is None + or not isinstance(passwords, list) + or len(passwords) == 0 + or any(not isinstance(pw, str) for pw in passwords) + or any(len(pw.strip()) == 0 for pw in passwords) + ): + raise serializers.ValidationError( + "Passwords are required for password removal actions", + ) + return attrs @@ -2484,7 +2947,12 @@ class Meta: "actions", ] - def update_triggers_and_actions(self, instance: Workflow, triggers, actions): + def update_triggers_and_actions( + self, + instance: Workflow, + triggers, + actions, + ) -> None: set_triggers = [] set_actions = [] @@ -2493,14 +2961,26 @@ def update_triggers_and_actions(self, instance: Workflow, triggers, actions): filter_has_tags = trigger.pop("filter_has_tags", None) filter_has_all_tags = trigger.pop("filter_has_all_tags", None) filter_has_not_tags = trigger.pop("filter_has_not_tags", None) + filter_has_any_correspondents = trigger.pop( + "filter_has_any_correspondents", + None, + ) filter_has_not_correspondents = trigger.pop( "filter_has_not_correspondents", None, ) + filter_has_any_document_types = trigger.pop( + "filter_has_any_document_types", + None, + ) filter_has_not_document_types = trigger.pop( "filter_has_not_document_types", None, ) + filter_has_any_storage_paths = trigger.pop( + "filter_has_any_storage_paths", + None, + ) filter_has_not_storage_paths = trigger.pop( "filter_has_not_storage_paths", None, @@ -2517,14 +2997,26 @@ def update_triggers_and_actions(self, instance: Workflow, triggers, actions): trigger_instance.filter_has_all_tags.set(filter_has_all_tags) if filter_has_not_tags is not None: trigger_instance.filter_has_not_tags.set(filter_has_not_tags) + if filter_has_any_correspondents is not None: + trigger_instance.filter_has_any_correspondents.set( + filter_has_any_correspondents, + ) if filter_has_not_correspondents is not None: trigger_instance.filter_has_not_correspondents.set( filter_has_not_correspondents, ) + if filter_has_any_document_types is not None: + trigger_instance.filter_has_any_document_types.set( + filter_has_any_document_types, + ) if filter_has_not_document_types is not None: trigger_instance.filter_has_not_document_types.set( filter_has_not_document_types, ) + if filter_has_any_storage_paths is not None: + trigger_instance.filter_has_any_storage_paths.set( + filter_has_any_storage_paths, + ) if filter_has_not_storage_paths is not None: trigger_instance.filter_has_not_storage_paths.set( filter_has_not_storage_paths, @@ -2532,7 +3024,8 @@ def update_triggers_and_actions(self, instance: Workflow, triggers, actions): set_triggers.append(trigger_instance) if actions is not None and actions is not serializers.empty: - for action in actions: + for index, action in enumerate(actions): + action["order"] = index assign_tags = action.pop("assign_tags", None) assign_view_users = action.pop("assign_view_users", None) assign_view_groups = action.pop("assign_view_groups", None) @@ -2619,7 +3112,7 @@ def update_triggers_and_actions(self, instance: Workflow, triggers, actions): instance.actions.set(set_actions) instance.save() - def prune_triggers_and_actions(self): + def prune_triggers_and_actions(self) -> None: """ ManyToMany fields dont support e.g. on_delete so we need to discard unattached triggers and actions manually @@ -2659,6 +3152,16 @@ def update(self, instance: Workflow, validated_data) -> Workflow: return instance + def to_representation(self, instance: Workflow) -> dict[str, Any]: + data = super().to_representation(instance) + actions = instance.actions.order_by("order", "pk") + data["actions"] = WorkflowActionSerializer( + actions, + many=True, + context=self.context, + ).data + return data + class TrashSerializer(SerializerWithPerms): documents = serializers.ListField( @@ -2674,7 +3177,7 @@ class TrashSerializer(SerializerWithPerms): write_only=True, ) - def validate_documents(self, documents): + def validate_documents(self, documents: list[int]) -> list[int]: count = Document.deleted_objects.filter(id__in=documents).count() if not count == len(documents): raise serializers.ValidationError( @@ -2691,8 +3194,22 @@ class StoragePathTestSerializer(SerializerWithPerms): ) document = serializers.PrimaryKeyRelatedField( - queryset=Document.objects.all(), + queryset=Document.objects.none(), required=True, label="Document", write_only=True, ) + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + request = self.context.get("request") + user = getattr(request, "user", None) if request else None + if user is not None and user.is_authenticated: + document_field = self.fields.get("document") + if not isinstance(document_field, serializers.PrimaryKeyRelatedField): + return + document_field.queryset = get_objects_for_user_owner_aware( + user, + "documents.view_document", + Document, + ) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 22abf625eb..97e4adaf3c 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -1,14 +1,11 @@ from __future__ import annotations -import ipaddress import logging import shutil -import socket from pathlib import Path from typing import TYPE_CHECKING -from urllib.parse import urlparse +from typing import Any -import httpx from celery import shared_task from celery import states from celery.signals import before_task_publish @@ -27,24 +24,24 @@ from django.dispatch import receiver from django.utils import timezone from filelock import FileLock -from guardian.shortcuts import remove_perm +from rest_framework import serializers from documents import matching from documents.caching import clear_document_caches +from documents.caching import invalidate_llm_suggestions_cache from documents.data_models import ConsumableDocument -from documents.data_models import DocumentSource from documents.file_handling import create_source_path_directory from documents.file_handling import delete_empty_directories +from documents.file_handling import generate_filename from documents.file_handling import generate_unique_filename -from documents.mail import send_email from documents.models import Correspondent from documents.models import CustomField from documents.models import CustomFieldInstance from documents.models import Document from documents.models import DocumentType -from documents.models import MatchingModel from documents.models import PaperlessTask from documents.models import SavedView +from documents.models import StoragePath from documents.models import Tag from documents.models import UiSettings from documents.models import Workflow @@ -52,17 +49,32 @@ from documents.models import WorkflowRun from documents.models import WorkflowTrigger from documents.permissions import get_objects_for_user_owner_aware -from documents.permissions import set_permissions_for_object -from documents.templating.workflows import parse_w_workflow_placeholders +from documents.plugins.helpers import DocumentsStatusManager +from documents.templating.utils import convert_format_str_to_template_format +from documents.workflows.actions import build_workflow_action_context +from documents.workflows.actions import execute_email_action +from documents.workflows.actions import execute_move_to_trash_action +from documents.workflows.actions import execute_password_removal_action +from documents.workflows.actions import execute_webhook_action +from documents.workflows.mutations import apply_assignment_to_document +from documents.workflows.mutations import apply_assignment_to_overrides +from documents.workflows.mutations import apply_removal_to_document +from documents.workflows.mutations import apply_removal_to_overrides +from documents.workflows.utils import get_workflows_for_trigger +from paperless.config import AIConfig if TYPE_CHECKING: + import uuid + from documents.classifier import DocumentClassifier + from documents.data_models import ConsumableDocument from documents.data_models import DocumentMetadataOverrides logger = logging.getLogger("paperless.handlers") +DRF_DATETIME_FIELD = serializers.DateTimeField() -def add_inbox_tags(sender, document: Document, logging_group=None, **kwargs): +def add_inbox_tags(sender, document: Document, logging_group=None, **kwargs) -> None: if document.owner is not None: tags = get_objects_for_user_owner_aware( document.owner, @@ -75,47 +87,41 @@ def add_inbox_tags(sender, document: Document, logging_group=None, **kwargs): document.add_nested_tags(inbox_tags) -def _suggestion_printer( - stdout, - style_func, - suggestion_type: str, - document: Document, - selected: MatchingModel, - base_url: str | None = None, -): - """ - Smaller helper to reduce duplication when just outputting suggestions to the console - """ - doc_str = str(document) - if base_url is not None: - stdout.write(style_func.SUCCESS(doc_str)) - stdout.write(style_func.SUCCESS(f"{base_url}/documents/{document.pk}")) - else: - stdout.write(style_func.SUCCESS(f"{doc_str} [{document.pk}]")) - stdout.write(f"Suggest {suggestion_type}: {selected}") - - def set_correspondent( - sender, + sender: object, document: Document, *, - logging_group=None, + logging_group: object = None, classifier: DocumentClassifier | None = None, - replace=False, - use_first=True, - suggest=False, - base_url=None, - stdout=None, - style_func=None, - **kwargs, -): + replace: bool = False, + use_first: bool = True, + dry_run: bool = False, + **kwargs: Any, +) -> Correspondent | None: + """ + Assign a correspondent to a document based on classifier results. + + Args: + document: The document to classify. + logging_group: Optional logging group for structured log output. + classifier: The trained classifier. If None, only rule-based matching runs. + replace: If True, overwrite an existing correspondent assignment. + use_first: If True, pick the first match when multiple correspondents + match. If False, skip assignment when multiple match. + dry_run: If True, compute and return the selection without saving. + **kwargs: Absorbed for Django signal compatibility (e.g. sender, signal). + + Returns: + The correspondent that was (or would be) assigned, or None if no match + was found or assignment was skipped. + """ if document.correspondent and not replace: - return + return None potential_correspondents = matching.match_correspondents(document, classifier) - potential_count = len(potential_correspondents) selected = potential_correspondents[0] if potential_correspondents else None + if potential_count > 1: if use_first: logger.debug( @@ -129,49 +135,53 @@ def set_correspondent( f"not assigning any correspondent", extra={"group": logging_group}, ) - return + return None - if selected or replace: - if suggest: - _suggestion_printer( - stdout, - style_func, - "correspondent", - document, - selected, - base_url, - ) - else: - logger.info( - f"Assigning correspondent {selected} to {document}", - extra={"group": logging_group}, - ) + if (selected or replace) and not dry_run: + logger.info( + f"Assigning correspondent {selected} to {document}", + extra={"group": logging_group}, + ) + document.correspondent = selected + document.save(update_fields=("correspondent",)) - document.correspondent = selected - document.save(update_fields=("correspondent",)) + return selected def set_document_type( - sender, + sender: object, document: Document, *, - logging_group=None, + logging_group: object = None, classifier: DocumentClassifier | None = None, - replace=False, - use_first=True, - suggest=False, - base_url=None, - stdout=None, - style_func=None, - **kwargs, -): + replace: bool = False, + use_first: bool = True, + dry_run: bool = False, + **kwargs: Any, +) -> DocumentType | None: + """ + Assign a document type to a document based on classifier results. + + Args: + document: The document to classify. + logging_group: Optional logging group for structured log output. + classifier: The trained classifier. If None, only rule-based matching runs. + replace: If True, overwrite an existing document type assignment. + use_first: If True, pick the first match when multiple types match. + If False, skip assignment when multiple match. + dry_run: If True, compute and return the selection without saving. + **kwargs: Absorbed for Django signal compatibility (e.g. sender, signal). + + Returns: + The document type that was (or would be) assigned, or None if no match + was found or assignment was skipped. + """ if document.document_type and not replace: - return - - potential_document_type = matching.match_document_types(document, classifier) + return None - potential_count = len(potential_document_type) - selected = potential_document_type[0] if potential_document_type else None + potential_document_types = matching.match_document_types(document, classifier) + potential_count = len(potential_document_types) + selected = potential_document_types[0] if potential_document_types else None if potential_count > 1: if use_first: @@ -186,42 +196,64 @@ def set_document_type( f"not assigning any document type", extra={"group": logging_group}, ) - return + return None - if selected or replace: - if suggest: - _suggestion_printer( - stdout, - style_func, - "document type", - document, - selected, - base_url, - ) - else: - logger.info( - f"Assigning document type {selected} to {document}", - extra={"group": logging_group}, - ) + if (selected or replace) and not dry_run: + logger.info( + f"Assigning document type {selected} to {document}", + extra={"group": logging_group}, + ) + document.document_type = selected + document.save(update_fields=("document_type",)) - document.document_type = selected - document.save(update_fields=("document_type",)) + return selected def set_tags( - sender, + sender: object, document: Document, *, - logging_group=None, + logging_group: object = None, classifier: DocumentClassifier | None = None, - replace=False, - suggest=False, - base_url=None, - stdout=None, - style_func=None, - **kwargs, -): + replace: bool = False, + dry_run: bool = False, + **kwargs: Any, +) -> tuple[set[Tag], set[Tag]]: + """ + Assign tags to a document based on classifier results. + + When replace=True, existing auto-matched and rule-matched tags are removed + before applying the new set (inbox tags and manually-added tags are preserved). + + Args: + document: The document to classify. + logging_group: Optional logging group for structured log output. + classifier: The trained classifier. If None, only rule-based matching runs. + replace: If True, remove existing classifier-managed tags before applying + new ones. Inbox tags and manually-added tags are always preserved. + dry_run: If True, compute what would change without saving anything. + **kwargs: Absorbed for Django signal compatibility (e.g. sender, signal). + + Returns: + A two-tuple of (tags_added, tags_removed). In non-replace mode, + tags_removed is always an empty set. In dry_run mode, neither set + is applied to the database. + """ + # Compute which tags would be removed under replace mode. + # The filter mirrors the .delete() call below: keep inbox tags and + # manually-added tags (match="" and not auto-matched). if replace: + tags_to_remove: set[Tag] = set( + document.tags.exclude( + is_inbox_tag=True, + ).exclude( + Q(match="") & ~Q(matching_algorithm=Tag.MATCH_AUTO), + ), + ) + else: + tags_to_remove = set() + + if replace and not dry_run: Document.tags.through.objects.filter(document=document).exclude( Q(tag__is_inbox_tag=True), ).exclude( @@ -229,65 +261,53 @@ def set_tags( ).delete() current_tags = set(document.tags.all()) - matched_tags = matching.match_tags(document, classifier) + tags_to_add = set(matched_tags) - current_tags - relevant_tags = set(matched_tags) - current_tags - - if suggest: - extra_tags = current_tags - set(matched_tags) - extra_tags = [ - t for t in extra_tags if t.matching_algorithm == MatchingModel.MATCH_AUTO - ] - if not relevant_tags and not extra_tags: - return - doc_str = style_func.SUCCESS(str(document)) - if base_url: - stdout.write(doc_str) - stdout.write(f"{base_url}/documents/{document.pk}") - else: - stdout.write(doc_str + style_func.SUCCESS(f" [{document.pk}]")) - if relevant_tags: - stdout.write("Suggest tags: " + ", ".join([t.name for t in relevant_tags])) - if extra_tags: - stdout.write("Extra tags: " + ", ".join([t.name for t in extra_tags])) - else: - if not relevant_tags: - return - - message = 'Tagging "{}" with "{}"' + if tags_to_add and not dry_run: logger.info( - message.format(document, ", ".join([t.name for t in relevant_tags])), + f'Tagging "{document}" with "{", ".join(t.name for t in tags_to_add)}"', extra={"group": logging_group}, ) + document.add_nested_tags(tags_to_add) - document.add_nested_tags(relevant_tags) + return tags_to_add, tags_to_remove def set_storage_path( - sender, + sender: object, document: Document, *, - logging_group=None, + logging_group: object = None, classifier: DocumentClassifier | None = None, - replace=False, - use_first=True, - suggest=False, - base_url=None, - stdout=None, - style_func=None, - **kwargs, -): + replace: bool = False, + use_first: bool = True, + dry_run: bool = False, + **kwargs: Any, +) -> StoragePath | None: + """ + Assign a storage path to a document based on classifier results. + + Args: + document: The document to classify. + logging_group: Optional logging group for structured log output. + classifier: The trained classifier. If None, only rule-based matching runs. + replace: If True, overwrite an existing storage path assignment. + use_first: If True, pick the first match when multiple paths match. + If False, skip assignment when multiple match. + dry_run: If True, compute and return the selection without saving. + **kwargs: Absorbed for Django signal compatibility (e.g. sender, signal). + + Returns: + The storage path that was (or would be) assigned, or None if no match + was found or assignment was skipped. + """ if document.storage_path and not replace: - return - - potential_storage_path = matching.match_storage_paths( - document, - classifier, - ) + return None - potential_count = len(potential_storage_path) - selected = potential_storage_path[0] if potential_storage_path else None + potential_storage_paths = matching.match_storage_paths(document, classifier) + potential_count = len(potential_storage_paths) + selected = potential_storage_paths[0] if potential_storage_paths else None if potential_count > 1: if use_first: @@ -302,30 +322,21 @@ def set_storage_path( f"not assigning any storage directory", extra={"group": logging_group}, ) - return + return None - if selected or replace: - if suggest: - _suggestion_printer( - stdout, - style_func, - "storage directory", - document, - selected, - base_url, - ) - else: - logger.info( - f"Assigning storage path {selected} to {document}", - extra={"group": logging_group}, - ) + if (selected or replace) and not dry_run: + logger.info( + f"Assigning storage path {selected} to {document}", + extra={"group": logging_group}, + ) + document.storage_path = selected + document.save(update_fields=("storage_path",)) - document.storage_path = selected - document.save(update_fields=("storage_path",)) + return selected # see empty_trash in documents/tasks.py for signal handling -def cleanup_document_deletion(sender, instance, **kwargs): +def cleanup_document_deletion(sender, instance, **kwargs) -> None: with FileLock(settings.MEDIA_LOCK): if settings.EMPTY_TRASH_DIR: # Find a non-conflicting filename in case a document with the same @@ -392,19 +403,42 @@ class CannotMoveFilesException(Exception): pass +def _filename_template_uses_custom_fields(doc: Document) -> bool: + template = None + if doc.storage_path is not None: + template = doc.storage_path.path + elif settings.FILENAME_FORMAT is not None: + template = convert_format_str_to_template_format(settings.FILENAME_FORMAT) + + if not template: + return False + + return "custom_fields" in template + + # should be disabled in /src/documents/management/commands/document_importer.py handle -@receiver(models.signals.post_save, sender=CustomFieldInstance) -@receiver(models.signals.m2m_changed, sender=Document.tags.through) -@receiver(models.signals.post_save, sender=Document) +@receiver(models.signals.post_save, sender=CustomFieldInstance, weak=False) +@receiver(models.signals.m2m_changed, sender=Document.tags.through, weak=False) +@receiver(models.signals.post_save, sender=Document, weak=False) def update_filename_and_move_files( sender, instance: Document | CustomFieldInstance, **kwargs, -): +) -> None: if isinstance(instance, CustomFieldInstance): + if not _filename_template_uses_custom_fields(instance.document): + return instance = instance.document - def validate_move(instance, old_path: Path, new_path: Path): + def validate_move(instance, old_path: Path, new_path: Path, root: Path) -> None: + if not new_path.is_relative_to(root): + msg = ( + f"Document {instance!s}: Refusing to move file outside root {root}: " + f"{new_path}." + ) + logger.warning(msg) + raise CannotMoveFilesException(msg) + if not old_path.is_file(): # Can't do anything if the old file does not exist anymore. msg = f"Document {instance!s}: File {old_path} doesn't exist." @@ -438,22 +472,67 @@ def validate_move(instance, old_path: Path, new_path: Path): old_filename = instance.filename old_source_path = instance.source_path - - # Need to convert to string to be able to save it to the db - instance.filename = str(generate_unique_filename(instance)) - move_original = old_filename != instance.filename + move_original = False old_archive_filename = instance.archive_filename old_archive_path = instance.archive_path + move_archive = False + + candidate_filename = generate_filename(instance) + if len(str(candidate_filename)) > Document.MAX_STORED_FILENAME_LENGTH: + msg = ( + f"Document {instance!s}: Generated filename exceeds db path " + f"limit ({len(str(candidate_filename))} > " + f"{Document.MAX_STORED_FILENAME_LENGTH}): {candidate_filename!s}" + ) + logger.warning(msg) + raise CannotMoveFilesException(msg) + + candidate_source_path = ( + settings.ORIGINALS_DIR / candidate_filename + ).resolve() + if candidate_filename == Path(old_filename): + new_filename = Path(old_filename) + elif ( + candidate_source_path.exists() + and candidate_source_path != old_source_path + ): + # Only fall back to unique search when there is an actual conflict + new_filename = generate_unique_filename(instance) + else: + new_filename = candidate_filename + + # Need to convert to string to be able to save it to the db + instance.filename = str(new_filename) + move_original = old_filename != instance.filename if instance.has_archive_version: - # Need to convert to string to be able to save it to the db - instance.archive_filename = str( - generate_unique_filename( + archive_candidate = generate_filename(instance, archive_filename=True) + if len(str(archive_candidate)) > Document.MAX_STORED_FILENAME_LENGTH: + msg = ( + f"Document {instance!s}: Generated archive filename exceeds " + f"db path limit ({len(str(archive_candidate))} > " + f"{Document.MAX_STORED_FILENAME_LENGTH}): {archive_candidate!s}" + ) + logger.warning(msg) + raise CannotMoveFilesException(msg) + archive_candidate_path = ( + settings.ARCHIVE_DIR / archive_candidate + ).resolve() + if archive_candidate == Path(old_archive_filename): + new_archive_filename = Path(old_archive_filename) + elif ( + archive_candidate_path.exists() + and archive_candidate_path != old_archive_path + ): + new_archive_filename = generate_unique_filename( instance, archive_filename=True, - ), - ) + ) + else: + new_archive_filename = archive_candidate + + instance.archive_filename = str(new_archive_filename) move_archive = old_archive_filename != instance.archive_filename else: @@ -467,12 +546,22 @@ def validate_move(instance, old_path: Path, new_path: Path): return if move_original: - validate_move(instance, old_source_path, instance.source_path) + validate_move( + instance, + old_source_path, + instance.source_path, + settings.ORIGINALS_DIR, + ) create_source_path_directory(instance.source_path) shutil.move(old_source_path, instance.source_path) if move_archive: - validate_move(instance, old_archive_path, instance.archive_path) + validate_move( + instance, + old_archive_path, + instance.archive_path, + settings.ARCHIVE_DIR, + ) create_source_path_directory(instance.archive_path) shutil.move(old_archive_path, instance.archive_path) @@ -531,39 +620,62 @@ def validate_move(instance, old_path: Path, new_path: Path): root=settings.ARCHIVE_DIR, ) + # Keep version files in sync with root + if instance.root_document_id is None: + for version_doc in Document.objects.filter(root_document_id=instance.pk).only( + "pk", + ): + update_filename_and_move_files( + Document, + version_doc, + ) -# should be disabled in /src/documents/management/commands/document_importer.py handle -@receiver(models.signals.post_save, sender=CustomField) -def check_paths_and_prune_custom_fields(sender, instance: CustomField, **kwargs): + +@shared_task +def process_cf_select_update(custom_field: CustomField) -> None: """ - When a custom field is updated: + Update documents tied to a select custom field: + 1. 'Select' custom field instances get their end-user value (e.g. in file names) from the select_options in extra_data, which is contained in the custom field itself. So when the field is changed, we (may) need to update the file names of all documents that have this custom field. 2. If a 'Select' field option was removed, we need to nullify the custom field instances that have the option. """ + select_options = { + option["id"]: option["label"] + for option in custom_field.extra_data.get("select_options", []) + } + + # Clear select values that no longer exist + custom_field.fields.exclude( + value_select__in=select_options.keys(), + ).update(value_select=None) + + for cf_instance in custom_field.fields.select_related("document").iterator(): + # Update the filename and move files if necessary + update_filename_and_move_files(CustomFieldInstance, cf_instance) + + +# should be disabled in /src/documents/management/commands/document_importer.py handle +@receiver(models.signals.post_save, sender=CustomField) +def check_paths_and_prune_custom_fields( + sender, + instance: CustomField, + **kwargs, +) -> None: + """ + When a custom field is updated, check if we need to update any documents. Done async to avoid slowing down the save operation. + """ if ( instance.data_type == CustomField.FieldDataType.SELECT and instance.fields.count() > 0 and instance.extra_data ): # Only select fields, for now - select_options = { - option["id"]: option["label"] - for option in instance.extra_data.get("select_options", []) - } - - for cf_instance in instance.fields.all(): - # Check if the current value is still a valid option - if cf_instance.value not in select_options: - cf_instance.value_select = None - cf_instance.save(update_fields=["value_select"]) - - # Update the filename and move files if necessary - update_filename_and_move_files(sender, cf_instance) + process_cf_select_update.delay(instance) @receiver(models.signals.post_delete, sender=CustomField) -def cleanup_custom_field_deletion(sender, instance: CustomField, **kwargs): +def cleanup_custom_field_deletion(sender, instance: CustomField, **kwargs) -> None: """ When a custom field is deleted, ensure no saved views reference it. """ @@ -589,9 +701,18 @@ def cleanup_custom_field_deletion(sender, instance: CustomField, **kwargs): ) +@receiver(models.signals.post_save, sender=Document) +def update_llm_suggestions_cache(sender, instance, **kwargs): + """ + Invalidate the LLM suggestions cache when a document is saved. + """ + # Invalidate the cache for the document + invalidate_llm_suggestions_cache(instance.pk) + + @receiver(models.signals.post_delete, sender=User) @receiver(models.signals.post_delete, sender=Group) -def cleanup_user_deletion(sender, instance: User | Group, **kwargs): +def cleanup_user_deletion(sender, instance: User | Group, **kwargs) -> None: """ When a user or group is deleted, remove non-cascading references. At the moment, just the default permission settings in UiSettings. @@ -634,19 +755,25 @@ def cleanup_user_deletion(sender, instance: User | Group, **kwargs): ) -def add_to_index(sender, document, **kwargs): +def add_to_index(sender, document, **kwargs) -> None: from documents import index index.add_or_update_document(document) + if document.root_document_id is not None and document.root_document is not None: + # keep in sync when a new version is consumed. + index.add_or_update_document( + document.root_document, + effective_content=document.content, + ) def run_workflows_added( sender, document: Document, - logging_group=None, + logging_group: uuid.UUID | None = None, original_file=None, **kwargs, -): +) -> None: run_workflows( trigger_type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED, document=document, @@ -656,7 +783,12 @@ def run_workflows_added( ) -def run_workflows_updated(sender, document: Document, logging_group=None, **kwargs): +def run_workflows_updated( + sender, + document: Document, + logging_group: uuid.UUID | None = None, + **kwargs, +) -> None: run_workflows( trigger_type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, document=document, @@ -664,693 +796,94 @@ def run_workflows_updated(sender, document: Document, logging_group=None, **kwar ) -def _is_public_ip(ip: str) -> bool: - try: - obj = ipaddress.ip_address(ip) - return not ( - obj.is_private - or obj.is_loopback - or obj.is_link_local - or obj.is_multicast - or obj.is_unspecified - ) - except ValueError: # pragma: no cover - return False - - -def _resolve_first_ip(host: str) -> str | None: - try: - info = socket.getaddrinfo(host, None) - return info[0][4][0] if info else None - except Exception: # pragma: no cover - return None - +def send_websocket_document_updated( + sender, + document: Document, + **kwargs, +) -> None: + # At this point, workflows may already have applied additional changes. + document.refresh_from_db() -@shared_task( - retry_backoff=True, - autoretry_for=(httpx.HTTPStatusError,), - max_retries=3, - throws=(httpx.HTTPError,), -) -def send_webhook( - url: str, - data: str | dict, - headers: dict, - files: dict, - *, - as_json: bool = False, -): - p = urlparse(url) - if p.scheme.lower() not in settings.WEBHOOKS_ALLOWED_SCHEMES or not p.hostname: - logger.warning("Webhook blocked: invalid scheme/hostname") - raise ValueError("Invalid URL scheme or hostname.") - - port = p.port or (443 if p.scheme == "https" else 80) - if ( - len(settings.WEBHOOKS_ALLOWED_PORTS) > 0 - and port not in settings.WEBHOOKS_ALLOWED_PORTS - ): - logger.warning("Webhook blocked: port not permitted") - raise ValueError("Destination port not permitted.") - - ip = _resolve_first_ip(p.hostname) - if not ip or ( - not _is_public_ip(ip) and not settings.WEBHOOKS_ALLOW_INTERNAL_REQUESTS - ): - logger.warning("Webhook blocked: destination not allowed") - raise ValueError("Destination host is not allowed.") + from documents.data_models import DocumentMetadataOverrides - try: - post_args = { - "url": url, - "headers": { - k: v for k, v in (headers or {}).items() if k.lower() != "host" - }, - "files": files or None, - "timeout": 5.0, - "follow_redirects": False, - } - if as_json: - post_args["json"] = data - elif isinstance(data, dict): - post_args["data"] = data - else: - post_args["content"] = data + doc_overrides = DocumentMetadataOverrides.from_document(document) - httpx.post( - **post_args, - ).raise_for_status() - logger.info( - f"Webhook sent to {url}", - ) - except Exception as e: - logger.error( - f"Failed attempt sending webhook to {url}: {e}", + with DocumentsStatusManager() as status_mgr: + status_mgr.send_document_updated( + document_id=document.id, + modified=DRF_DATETIME_FIELD.to_representation(document.modified), + owner_id=doc_overrides.owner_id, + users_can_view=doc_overrides.view_users, + groups_can_view=doc_overrides.view_groups, ) - raise e def run_workflows( trigger_type: WorkflowTrigger.WorkflowTriggerType, document: Document | ConsumableDocument, workflow_to_run: Workflow | None = None, - logging_group=None, + logging_group: uuid.UUID | None = None, overrides: DocumentMetadataOverrides | None = None, original_file: Path | None = None, ) -> tuple[DocumentMetadataOverrides, str] | None: - """Run workflows which match a Document (or ConsumableDocument) for a specific trigger type or a single workflow if given. - - Assignment or removal actions are either applied directly to the document or an overrides object. If an overrides - object is provided, the function returns the object with the applied changes or None if no actions were applied and a string - of messages for each action. If no overrides object is provided, the changes are applied directly to the document and the - function returns None. """ + Execute workflows matching a document for the given trigger. When `overrides` is provided + (consumption flow), actions mutate that object and the function returns `(overrides, messages)`. + Otherwise actions mutate the actual document and return nothing. - def assignment_action(): - if action.assign_tags.exists(): - tag_ids_to_add: set[int] = set() - for tag in action.assign_tags.all(): - tag_ids_to_add.add(tag.pk) - tag_ids_to_add.update(int(pk) for pk in tag.get_ancestors_pks()) - - if not use_overrides: - doc_tag_ids[:] = list(set(doc_tag_ids) | tag_ids_to_add) - else: - if overrides.tag_ids is None: - overrides.tag_ids = [] - overrides.tag_ids = list(set(overrides.tag_ids) | tag_ids_to_add) - - if action.assign_correspondent: - if not use_overrides: - document.correspondent = action.assign_correspondent - else: - overrides.correspondent_id = action.assign_correspondent.pk - - if action.assign_document_type: - if not use_overrides: - document.document_type = action.assign_document_type - else: - overrides.document_type_id = action.assign_document_type.pk - - if action.assign_storage_path: - if not use_overrides: - document.storage_path = action.assign_storage_path - else: - overrides.storage_path_id = action.assign_storage_path.pk - - if action.assign_owner: - if not use_overrides: - document.owner = action.assign_owner - else: - overrides.owner_id = action.assign_owner.pk - - if action.assign_title: - if not use_overrides: - try: - document.title = parse_w_workflow_placeholders( - action.assign_title, - document.correspondent.name if document.correspondent else "", - document.document_type.name if document.document_type else "", - document.owner.username if document.owner else "", - timezone.localtime(document.added), - document.original_filename or "", - document.filename or "", - document.created, - ) - except Exception: - logger.exception( - f"Error occurred parsing title assignment '{action.assign_title}', falling back to original", - extra={"group": logging_group}, - ) - else: - overrides.title = action.assign_title - - if any( - [ - action.assign_view_users.exists(), - action.assign_view_groups.exists(), - action.assign_change_users.exists(), - action.assign_change_groups.exists(), - ], - ): - permissions = { - "view": { - "users": action.assign_view_users.values_list("id", flat=True), - "groups": action.assign_view_groups.values_list("id", flat=True), - }, - "change": { - "users": action.assign_change_users.values_list("id", flat=True), - "groups": action.assign_change_groups.values_list("id", flat=True), - }, - } - if not use_overrides: - set_permissions_for_object( - permissions=permissions, - object=document, - merge=True, - ) - else: - overrides.view_users = list( - set( - (overrides.view_users or []) - + list(permissions["view"]["users"]), - ), - ) - overrides.view_groups = list( - set( - (overrides.view_groups or []) - + list(permissions["view"]["groups"]), - ), - ) - overrides.change_users = list( - set( - (overrides.change_users or []) - + list(permissions["change"]["users"]), - ), - ) - overrides.change_groups = list( - set( - (overrides.change_groups or []) - + list(permissions["change"]["groups"]), - ), - ) + Attachments for email/webhook actions use `original_file` when given, otherwise fall back to + `document.source_path` (Document) or `document.original_file` (ConsumableDocument). - if action.assign_custom_fields.exists(): - if not use_overrides: - for field in action.assign_custom_fields.all(): - value_field_name = CustomFieldInstance.get_value_field_name( - data_type=field.data_type, - ) - args = { - value_field_name: action.assign_custom_fields_values.get( - str(field.pk), - None, - ), - } - # for some reason update_or_create doesn't work here - instance = CustomFieldInstance.objects.filter( - field=field, - document=document, - ).first() - if instance and args[value_field_name] is not None: - setattr(instance, value_field_name, args[value_field_name]) - instance.save() - elif not instance: - CustomFieldInstance.objects.create( - **args, - field=field, - document=document, - ) - else: - if overrides.custom_fields is None: - overrides.custom_fields = {} - overrides.custom_fields.update( - { - field.pk: action.assign_custom_fields_values.get( - str(field.pk), - None, - ) - for field in action.assign_custom_fields.all() - }, - ) - - def removal_action(): - if action.remove_all_tags: - if not use_overrides: - doc_tag_ids.clear() - else: - overrides.tag_ids = None - else: - tag_ids_to_remove: set[int] = set() - for tag in action.remove_tags.all(): - tag_ids_to_remove.add(tag.pk) - tag_ids_to_remove.update(int(pk) for pk in tag.get_descendants_pks()) - - if not use_overrides: - doc_tag_ids[:] = [t for t in doc_tag_ids if t not in tag_ids_to_remove] - elif overrides.tag_ids: - overrides.tag_ids = [ - t for t in overrides.tag_ids if t not in tag_ids_to_remove - ] - - if not use_overrides and ( - action.remove_all_correspondents - or ( - document.correspondent - and action.remove_correspondents.filter( - pk=document.correspondent.pk, - ).exists() - ) - ): - document.correspondent = None - elif use_overrides and ( - action.remove_all_correspondents - or ( - overrides.correspondent_id - and action.remove_correspondents.filter( - pk=overrides.correspondent_id, - ).exists() - ) - ): - overrides.correspondent_id = None - - if not use_overrides and ( - action.remove_all_document_types - or ( - document.document_type - and action.remove_document_types.filter( - pk=document.document_type.pk, - ).exists() - ) - ): - document.document_type = None - elif use_overrides and ( - action.remove_all_document_types - or ( - overrides.document_type_id - and action.remove_document_types.filter( - pk=overrides.document_type_id, - ).exists() - ) - ): - overrides.document_type_id = None - - if not use_overrides and ( - action.remove_all_storage_paths - or ( - document.storage_path - and action.remove_storage_paths.filter( - pk=document.storage_path.pk, - ).exists() - ) - ): - document.storage_path = None - elif use_overrides and ( - action.remove_all_storage_paths - or ( - overrides.storage_path_id - and action.remove_storage_paths.filter( - pk=overrides.storage_path_id, - ).exists() - ) - ): - overrides.storage_path_id = None - - if not use_overrides and ( - action.remove_all_owners - or ( - document.owner - and action.remove_owners.filter(pk=document.owner.pk).exists() - ) - ): - document.owner = None - elif use_overrides and ( - action.remove_all_owners - or ( - overrides.owner_id - and action.remove_owners.filter(pk=overrides.owner_id).exists() - ) - ): - overrides.owner_id = None - - if action.remove_all_permissions: - if not use_overrides: - permissions = { - "view": {"users": [], "groups": []}, - "change": {"users": [], "groups": []}, - } - set_permissions_for_object( - permissions=permissions, - object=document, - merge=False, - ) - else: - overrides.view_users = None - overrides.view_groups = None - overrides.change_users = None - overrides.change_groups = None - elif any( - [ - action.remove_view_users.exists(), - action.remove_view_groups.exists(), - action.remove_change_users.exists(), - action.remove_change_groups.exists(), - ], - ): - if not use_overrides: - for user in action.remove_view_users.all(): - remove_perm("view_document", user, document) - for user in action.remove_change_users.all(): - remove_perm("change_document", user, document) - for group in action.remove_view_groups.all(): - remove_perm("view_document", group, document) - for group in action.remove_change_groups.all(): - remove_perm("change_document", group, document) - else: - if overrides.view_users: - for user in action.remove_view_users.filter( - pk__in=overrides.view_users, - ): - overrides.view_users.remove(user.pk) - if overrides.change_users: - for user in action.remove_change_users.filter( - pk__in=overrides.change_users, - ): - overrides.change_users.remove(user.pk) - if overrides.view_groups: - for group in action.remove_view_groups.filter( - pk__in=overrides.view_groups, - ): - overrides.view_groups.remove(group.pk) - if overrides.change_groups: - for group in action.remove_change_groups.filter( - pk__in=overrides.change_groups, - ): - overrides.change_groups.remove(group.pk) - - if action.remove_all_custom_fields: - if not use_overrides: - CustomFieldInstance.objects.filter(document=document).hard_delete() - else: - overrides.custom_fields = None - elif action.remove_custom_fields.exists(): - if not use_overrides: - CustomFieldInstance.objects.filter( - field__in=action.remove_custom_fields.all(), - document=document, - ).hard_delete() - elif overrides.custom_fields: - for field in action.remove_custom_fields.filter( - pk__in=overrides.custom_fields.keys(), - ): - overrides.custom_fields.pop(field.pk, None) + Passing `workflow_to_run` skips the workflow query (currently only used by scheduled runs). + """ - def email_action(): - if not settings.EMAIL_ENABLED: - logger.error( - "Email backend has not been configured, cannot send email notifications", - extra={"group": logging_group}, - ) - return + use_overrides = overrides is not None - if not use_overrides: - title = document.title - doc_url = f"{settings.PAPERLESS_URL}/documents/{document.pk}/" - correspondent = ( - document.correspondent.name if document.correspondent else "" - ) - document_type = ( - document.document_type.name if document.document_type else "" - ) - owner_username = document.owner.username if document.owner else "" - filename = document.original_filename or "" - current_filename = document.filename or "" - added = timezone.localtime(document.added) - created = document.created - else: - title = overrides.title if overrides.title else str(document.original_file) - doc_url = "" - correspondent = ( - Correspondent.objects.filter(pk=overrides.correspondent_id).first() - if overrides.correspondent_id - else "" - ) - document_type = ( - DocumentType.objects.filter(pk=overrides.document_type_id).first().name - if overrides.document_type_id - else "" - ) - owner_username = ( - User.objects.filter(pk=overrides.owner_id).first().username - if overrides.owner_id - else "" - ) - filename = document.original_file if document.original_file else "" - current_filename = filename - added = timezone.localtime(timezone.now()) - created = overrides.created - - subject = ( - parse_w_workflow_placeholders( - action.email.subject, - correspondent, - document_type, - owner_username, - added, - filename, - current_filename, - created, - title, - doc_url, - ) - if action.email.subject - else "" - ) - body = ( - parse_w_workflow_placeholders( - action.email.body, - correspondent, - document_type, - owner_username, - added, - filename, - current_filename, - created, - title, - doc_url, - ) - if action.email.body - else "" + if isinstance(document, Document) and document.root_document_id is not None: + logger.debug( + "Skipping workflow execution for version document %s", + document.pk, ) - try: - attachments = [] - if action.email.include_document: - if trigger_type in [ - WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, - WorkflowTrigger.WorkflowTriggerType.SCHEDULED, - ]: - # Updated and scheduled can pass the document directly - attachments = [document] - elif original_file: - # For consumed and added document is not yet saved, so pass the original file - attachments = [ - ConsumableDocument( - source=DocumentSource.ApiUpload, - original_file=original_file, - ), - ] - n_messages = send_email( - subject=subject, - body=body, - to=action.email.to.split(","), - attachments=attachments, - use_archive=False, - ) - logger.debug( - f"Sent {n_messages} notification email(s) to {action.email.to}", - extra={"group": logging_group}, - ) - except Exception as e: - logger.exception( - f"Error occurred sending notification email: {e}", - extra={"group": logging_group}, - ) - - def webhook_action(): - if not use_overrides: - title = document.title - doc_url = f"{settings.PAPERLESS_URL}/documents/{document.pk}/" - correspondent = ( - document.correspondent.name if document.correspondent else "" - ) - document_type = ( - document.document_type.name if document.document_type else "" - ) - owner_username = document.owner.username if document.owner else "" - filename = document.original_filename or "" - current_filename = document.filename or "" - added = timezone.localtime(document.added) - created = document.created - else: - title = overrides.title if overrides.title else str(document.original_file) - doc_url = "" - correspondent = ( - Correspondent.objects.filter(pk=overrides.correspondent_id).first() - if overrides.correspondent_id - else "" - ) - document_type = ( - DocumentType.objects.filter(pk=overrides.document_type_id).first().name - if overrides.document_type_id - else "" - ) - owner_username = ( - User.objects.filter(pk=overrides.owner_id).first().username - if overrides.owner_id - else "" - ) - filename = document.original_file if document.original_file else "" - current_filename = filename - added = timezone.localtime(timezone.now()) - created = overrides.created - - try: - data = {} - if action.webhook.use_params: - if action.webhook.params: - try: - for key, value in action.webhook.params.items(): - data[key] = parse_w_workflow_placeholders( - value, - correspondent, - document_type, - owner_username, - added, - filename, - current_filename, - created, - title, - doc_url, - ) - except Exception as e: - logger.error( - f"Error occurred parsing webhook params: {e}", - extra={"group": logging_group}, - ) - elif action.webhook.body: - data = parse_w_workflow_placeholders( - action.webhook.body, - correspondent, - document_type, - owner_username, - added, - filename, - current_filename, - created, - title, - doc_url, - ) - headers = {} - if action.webhook.headers: - try: - headers = { - str(k): str(v) for k, v in action.webhook.headers.items() - } - except Exception as e: - logger.error( - f"Error occurred parsing webhook headers: {e}", - extra={"group": logging_group}, - ) - files = None - if action.webhook.include_document: - with original_file.open("rb") as f: - files = { - "file": ( - filename, - f.read(), - document.mime_type, - ), - } - send_webhook.delay( - url=action.webhook.url, - data=data, - headers=headers, - files=files, - as_json=action.webhook.as_json, - ) - logger.debug( - f"Webhook to {action.webhook.url} queued", - extra={"group": logging_group}, - ) - except Exception as e: - logger.exception( - f"Error occurred sending webhook: {e}", - extra={"group": logging_group}, - ) + return None - use_overrides = overrides is not None if original_file is None: original_file = ( document.source_path if not use_overrides else document.original_file ) messages = [] - workflows = ( - ( - Workflow.objects.filter(enabled=True, triggers__type=trigger_type) - .prefetch_related( - "actions", - "actions__assign_view_users", - "actions__assign_view_groups", - "actions__assign_change_users", - "actions__assign_change_groups", - "actions__assign_custom_fields", - "actions__remove_tags", - "actions__remove_correspondents", - "actions__remove_document_types", - "actions__remove_storage_paths", - "actions__remove_custom_fields", - "actions__remove_owners", - "triggers", - ) - .order_by("order") - .distinct() - ) - if workflow_to_run is None - else [workflow_to_run] - ) + workflows = get_workflows_for_trigger(trigger_type, workflow_to_run) for workflow in workflows: if not use_overrides: - # This can be called from bulk_update_documents, which may be running multiple times - # Refresh this so the matching data is fresh and instance fields are re-freshed - # Otherwise, this instance might be behind and overwrite the work another process did - document.refresh_from_db() - doc_tag_ids = list(document.tags.values_list("pk", flat=True)) + if TYPE_CHECKING: + assert isinstance(document, Document) + try: + # This can be called from bulk_update_documents, which may be running multiple times + # Refresh this so the matching data is fresh and instance fields are re-freshed + # Otherwise, this instance might be behind and overwrite the work another process did + document.refresh_from_db() + doc_tag_ids = list(document.tags.values_list("pk", flat=True)) + except Document.DoesNotExist: + # Document was hard deleted by a previous workflow or another process + logger.info( + "Document no longer exists, skipping remaining workflows", + extra={"group": logging_group}, + ) + break + + # Check if document was soft deleted (moved to trash) + if document.is_deleted: + logger.info( + "Document was moved to trash, skipping remaining workflows", + extra={"group": logging_group}, + ) + break if matching.document_matches_workflow(document, workflow, trigger_type): action: WorkflowAction - for action in workflow.actions.all(): + has_move_to_trash_action = False + for action in workflow.actions.order_by("order", "pk"): message = f"Applying {action} from {workflow}" if not use_overrides: logger.info(message, extra={"group": logging_group}) @@ -1358,17 +891,49 @@ def webhook_action(): messages.append(message) if action.type == WorkflowAction.WorkflowActionType.ASSIGNMENT: - assignment_action() + if use_overrides and overrides: + apply_assignment_to_overrides(action, overrides) + else: + apply_assignment_to_document( + action, + document, + doc_tag_ids, + logging_group, + ) elif action.type == WorkflowAction.WorkflowActionType.REMOVAL: - removal_action() + if use_overrides and overrides: + apply_removal_to_overrides(action, overrides) + else: + apply_removal_to_document(action, document, doc_tag_ids) elif action.type == WorkflowAction.WorkflowActionType.EMAIL: - email_action() + context = build_workflow_action_context(document, overrides) + execute_email_action( + action, + document, + context, + logging_group, + original_file, + trigger_type, + ) elif action.type == WorkflowAction.WorkflowActionType.WEBHOOK: - webhook_action() + context = build_workflow_action_context(document, overrides) + execute_webhook_action( + action, + document, + context, + logging_group, + original_file, + ) + elif action.type == WorkflowAction.WorkflowActionType.PASSWORD_REMOVAL: + execute_password_removal_action(action, document, logging_group) + elif action.type == WorkflowAction.WorkflowActionType.MOVE_TO_TRASH: + has_move_to_trash_action = True if not use_overrides: # limit title to 128 characters document.title = document.title[:128] + # Make sure the filename and archive filename are accurate + document.refresh_from_db(fields=["filename", "archive_filename"]) # save first before setting tags document.save() document.tags.set(doc_tag_ids) @@ -1379,12 +944,17 @@ def webhook_action(): document=document if not use_overrides else None, ) + if has_move_to_trash_action: + execute_move_to_trash_action(action, document, logging_group) + if use_overrides: + if TYPE_CHECKING: + assert overrides is not None return overrides, "\n".join(messages) @before_task_publish.connect -def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): +def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs) -> None: """ Creates the PaperlessTask object in a pending state. This is sent before the task reaches the broker, but before it begins executing on a worker. @@ -1426,7 +996,7 @@ def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): @task_prerun.connect -def task_prerun_handler(sender=None, task_id=None, task=None, **kwargs): +def task_prerun_handler(sender=None, task_id=None, task=None, **kwargs) -> None: """ Updates the PaperlessTask to be started. Sent before the task begins execution @@ -1456,7 +1026,7 @@ def task_postrun_handler( retval=None, state=None, **kwargs, -): +) -> None: """ Updates the result of the PaperlessTask. @@ -1467,7 +1037,7 @@ def task_postrun_handler( task_instance = PaperlessTask.objects.filter(task_id=task_id).first() if task_instance is not None: - task_instance.status = state + task_instance.status = state or states.FAILURE task_instance.result = retval task_instance.date_done = timezone.now() task_instance.save() @@ -1485,7 +1055,7 @@ def task_failure_handler( args=None, traceback=None, **kwargs, -): +) -> None: """ Updates the result of a failed PaperlessTask. @@ -1505,7 +1075,7 @@ def task_failure_handler( @worker_process_init.connect -def close_connection_pool_on_worker_init(**kwargs): +def close_connection_pool_on_worker_init(**kwargs) -> None: """ Close the DB connection pool for each Celery child process after it starts. @@ -1517,3 +1087,30 @@ def close_connection_pool_on_worker_init(**kwargs): for conn in connections.all(initialized_only=True): if conn.alias == "default" and hasattr(conn, "pool") and conn.pool: conn.close_pool() + + +def add_or_update_document_in_llm_index(sender, document, **kwargs): + """ + Add or update a document in the LLM index when it is created or updated. + """ + ai_config = AIConfig() + if ai_config.llm_index_enabled: + from documents.tasks import update_document_in_llm_index + + update_document_in_llm_index.delay(document) + + +@receiver(models.signals.post_delete, sender=Document) +def delete_document_from_llm_index( + sender: Any, + instance: Document, + **kwargs: Any, +) -> None: + """ + Delete a document from the LLM index when it is deleted. + """ + ai_config = AIConfig() + if ai_config.llm_index_enabled: + from documents.tasks import remove_document_from_llm_index + + remove_document_from_llm_index.delay(instance) diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 17bfce3b06..3786957317 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -3,10 +3,14 @@ import logging import shutil import uuid +import zipfile +from collections.abc import Callable +from collections.abc import Iterable from pathlib import Path from tempfile import TemporaryDirectory +from tempfile import mkstemp +from typing import TypeVar -import tqdm from celery import Task from celery import shared_task from celery import states @@ -22,9 +26,12 @@ from documents import index from documents import sanity_checker from documents.barcodes import BarcodePlugin +from documents.bulk_download import ArchiveOnlyStrategy +from documents.bulk_download import OriginalsOnlyStrategy from documents.caching import clear_document_caches from documents.classifier import DocumentClassifier from documents.classifier import load_classifier +from documents.consumer import AsnCheckPlugin from documents.consumer import ConsumerPlugin from documents.consumer import ConsumerPreflightPlugin from documents.consumer import WorkflowTriggerPlugin @@ -39,9 +46,10 @@ from documents.models import Document from documents.models import DocumentType from documents.models import PaperlessTask +from documents.models import ShareLink +from documents.models import ShareLinkBundle from documents.models import StoragePath from documents.models import Tag -from documents.models import Workflow from documents.models import WorkflowRun from documents.models import WorkflowTrigger from documents.parsers import DocumentParser @@ -54,31 +62,49 @@ from documents.signals import document_updated from documents.signals.handlers import cleanup_document_deletion from documents.signals.handlers import run_workflows +from documents.signals.handlers import send_websocket_document_updated +from documents.workflows.utils import get_workflows_for_trigger +from paperless.config import AIConfig +from paperless_ai.indexing import llm_index_add_or_update_document +from paperless_ai.indexing import llm_index_remove_document +from paperless_ai.indexing import update_llm_index + +_T = TypeVar("_T") +IterWrapper = Callable[[Iterable[_T]], Iterable[_T]] + if settings.AUDIT_LOG_ENABLED: from auditlog.models import LogEntry logger = logging.getLogger("paperless.tasks") +def _identity(iterable: Iterable[_T]) -> Iterable[_T]: + return iterable + + @shared_task -def index_optimize(): +def index_optimize() -> None: ix = index.open_index() writer = AsyncWriter(ix) writer.commit(optimize=True) -def index_reindex(*, progress_bar_disable=False): +def index_reindex(*, iter_wrapper: IterWrapper[Document] = _identity) -> None: documents = Document.objects.all() ix = index.open_index(recreate=True) with AsyncWriter(ix) as writer: - for document in tqdm.tqdm(documents, disable=progress_bar_disable): + for document in iter_wrapper(documents): index.update_document(writer, document) @shared_task -def train_classifier(*, scheduled=True): +def train_classifier( + *, + scheduled=True, + status_callback: Callable[[str], None] | None = None, +) -> None: task = PaperlessTask.objects.create( type=PaperlessTask.TaskType.SCHEDULED_TASK if scheduled @@ -114,7 +140,7 @@ def train_classifier(*, scheduled=True): classifier = DocumentClassifier() try: - if classifier.train(): + if classifier.train(status_callback=status_callback): logger.info( f"Saving updated classifier model to {settings.MODEL_FILE}...", ) @@ -145,13 +171,22 @@ def consume_file( if overrides is None: overrides = DocumentMetadataOverrides() - plugins: list[type[ConsumeTaskPlugin]] = [ - ConsumerPreflightPlugin, - CollatePlugin, - BarcodePlugin, - WorkflowTriggerPlugin, - ConsumerPlugin, - ] + plugins: list[type[ConsumeTaskPlugin]] = ( + [ + ConsumerPreflightPlugin, + ConsumerPlugin, + ] + if input_doc.root_document_id is not None + else [ + ConsumerPreflightPlugin, + AsnCheckPlugin, + CollatePlugin, + BarcodePlugin, + AsnCheckPlugin, # Re-run ASN check after barcode reading + WorkflowTriggerPlugin, + ConsumerPlugin, + ] + ) with ( ProgressManager( @@ -207,24 +242,34 @@ def consume_file( @shared_task def sanity_check(*, scheduled=True, raise_on_error=True): messages = sanity_checker.check_sanity(scheduled=scheduled) - messages.log_messages() + if not messages.has_error and not messages.has_warning and not messages.has_info: + return "No issues detected." + + parts: list[str] = [] + if messages.document_error_count: + parts.append(f"{messages.document_error_count} document(s) with errors") + if messages.document_warning_count: + parts.append(f"{messages.document_warning_count} document(s) with warnings") + if messages.document_info_count: + parts.append(f"{messages.document_info_count} document(s) with infos") + if messages.global_warning_count: + parts.append(f"{messages.global_warning_count} global warning(s)") + + summary = ", ".join(parts) + " found." + if messages.has_error: - message = "Sanity check exited with errors. See log." + message = summary + " Check logs for details." if raise_on_error: raise SanityCheckFailedException(message) return message - elif messages.has_warning: - return "Sanity check exited with warnings. See log." - elif len(messages) > 0: - return "Sanity check exited with infos. See log." - else: - return "No issues detected." + + return summary @shared_task -def bulk_update_documents(document_ids): +def bulk_update_documents(document_ids) -> None: documents = Document.objects.filter(id__in=document_ids) ix = index.open_index() @@ -242,9 +287,15 @@ def bulk_update_documents(document_ids): for doc in documents: index.update_document(writer, doc) + ai_config = AIConfig() + if ai_config.llm_index_enabled: + update_llm_index( + rebuild=False, + ) + @shared_task -def update_document_content_maybe_archive_file(document_id): +def update_document_content_maybe_archive_file(document_id) -> None: """ Re-creates OCR content and thumbnail for a document, and archive file if it exists. @@ -341,6 +392,10 @@ def update_document_content_maybe_archive_file(document_id): with index.open_index_writer() as writer: index.update_document(writer, document) + ai_config = AIConfig() + if ai_config.llm_index_enabled: + llm_index_add_or_update_document(document) + clear_document_caches(document.pk) except Exception: @@ -348,11 +403,12 @@ def update_document_content_maybe_archive_file(document_id): f"Error while parsing document {document} (ID: {document_id})", ) finally: + # TODO(stumpylog): Cleanup once all parsers are handled parser.cleanup() @shared_task -def empty_trash(doc_ids=None): +def empty_trash(doc_ids=None) -> None: if doc_ids is None: logger.info("Emptying trash of all expired documents") documents = ( @@ -389,7 +445,7 @@ def empty_trash(doc_ids=None): @shared_task -def check_scheduled_workflows(): +def check_scheduled_workflows() -> None: """ Check and run all enabled scheduled workflows. @@ -400,13 +456,8 @@ def check_scheduled_workflows(): Once a document satisfies this condition, and recurring/non-recurring constraints are met, the workflow is run. """ - scheduled_workflows: list[Workflow] = ( - Workflow.objects.filter( - triggers__type=WorkflowTrigger.WorkflowTriggerType.SCHEDULED, - enabled=True, - ) - .distinct() - .prefetch_related("triggers") + scheduled_workflows = get_workflows_for_trigger( + WorkflowTrigger.WorkflowTriggerType.SCHEDULED, ) if scheduled_workflows.count() > 0: logger.debug(f"Checking {len(scheduled_workflows)} scheduled workflows") @@ -426,13 +477,22 @@ def check_scheduled_workflows(): match trigger.schedule_date_field: case WorkflowTrigger.ScheduleDateField.ADDED: - documents = Document.objects.filter(added__lte=threshold) + documents = Document.objects.filter( + root_document__isnull=True, + added__lte=threshold, + ) case WorkflowTrigger.ScheduleDateField.CREATED: - documents = Document.objects.filter(created__lte=threshold) + documents = Document.objects.filter( + root_document__isnull=True, + created__lte=threshold, + ) case WorkflowTrigger.ScheduleDateField.MODIFIED: - documents = Document.objects.filter(modified__lte=threshold) + documents = Document.objects.filter( + root_document__isnull=True, + modified__lte=threshold, + ) case WorkflowTrigger.ScheduleDateField.CUSTOM_FIELD: # cap earliest date to avoid massive scans @@ -470,7 +530,10 @@ def check_scheduled_workflows(): ) ] - documents = Document.objects.filter(id__in=matched_ids) + documents = Document.objects.filter( + root_document__isnull=True, + id__in=matched_ids, + ) if documents.count() > 0: documents = prefilter_documents_by_workflowtrigger( @@ -498,7 +561,7 @@ def check_scheduled_workflows(): trigger.schedule_is_recurring and workflow_runs.exists() and ( - workflow_runs.last().run_at + workflow_runs.first().run_at > now - datetime.timedelta( days=trigger.schedule_recurring_interval_days, @@ -515,6 +578,11 @@ def check_scheduled_workflows(): workflow_to_run=workflow, document=document, ) + # Scheduled workflows dont send document_updated signal, so send a websocket update here to ensure clients are updated + send_websocket_document_updated( + sender=None, + document=document, + ) def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: @@ -563,3 +631,169 @@ def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: if affected: bulk_update_documents.delay(document_ids=list(affected)) + + +@shared_task +def llmindex_index( + *, + iter_wrapper: IterWrapper[Document] = _identity, + rebuild=False, + scheduled=True, + auto=False, +) -> None: + ai_config = AIConfig() + if ai_config.llm_index_enabled: + task = PaperlessTask.objects.create( + type=PaperlessTask.TaskType.SCHEDULED_TASK + if scheduled + else PaperlessTask.TaskType.AUTO + if auto + else PaperlessTask.TaskType.MANUAL_TASK, + task_id=uuid.uuid4(), + task_name=PaperlessTask.TaskName.LLMINDEX_UPDATE, + status=states.STARTED, + date_created=timezone.now(), + date_started=timezone.now(), + ) + from paperless_ai.indexing import update_llm_index + + try: + result = update_llm_index( + iter_wrapper=iter_wrapper, + rebuild=rebuild, + ) + task.status = states.SUCCESS + task.result = result + except Exception as e: + logger.error("LLM index error: " + str(e)) + task.status = states.FAILURE + task.result = str(e) + + task.date_done = timezone.now() + task.save(update_fields=["status", "result", "date_done"]) + else: + logger.info("LLM index is disabled, skipping update.") + + +@shared_task +def update_document_in_llm_index(document) -> None: + llm_index_add_or_update_document(document) + + +@shared_task +def remove_document_from_llm_index(document) -> None: + llm_index_remove_document(document) + + +@shared_task +def build_share_link_bundle(bundle_id: int) -> None: + try: + bundle = ( + ShareLinkBundle.objects.filter(pk=bundle_id) + .prefetch_related("documents") + .get() + ) + except ShareLinkBundle.DoesNotExist: + logger.warning("Share link bundle %s no longer exists.", bundle_id) + return + + bundle.remove_file() + bundle.status = ShareLinkBundle.Status.PROCESSING + bundle.last_error = None + bundle.size_bytes = None + bundle.built_at = None + bundle.file_path = "" + bundle.save( + update_fields=[ + "status", + "last_error", + "size_bytes", + "built_at", + "file_path", + ], + ) + + documents = list(bundle.documents.all().order_by("pk")) + + _, temp_zip_path_str = mkstemp(suffix=".zip", dir=settings.SCRATCH_DIR) + temp_zip_path = Path(temp_zip_path_str) + + try: + strategy_class = ( + ArchiveOnlyStrategy + if bundle.file_version == ShareLink.FileVersion.ARCHIVE + else OriginalsOnlyStrategy + ) + with zipfile.ZipFile(temp_zip_path, "w", zipfile.ZIP_DEFLATED) as zipf: + strategy = strategy_class(zipf) + for document in documents: + strategy.add_document(document) + + output_dir = settings.SHARE_LINK_BUNDLE_DIR + output_dir.mkdir(parents=True, exist_ok=True) + final_path = (output_dir / f"{bundle.slug}.zip").resolve() + if final_path.exists(): + final_path.unlink() + shutil.move(temp_zip_path, final_path) + + bundle.file_path = f"{bundle.slug}.zip" + bundle.size_bytes = final_path.stat().st_size + bundle.status = ShareLinkBundle.Status.READY + bundle.built_at = timezone.now() + bundle.last_error = None + bundle.save( + update_fields=[ + "file_path", + "size_bytes", + "status", + "built_at", + "last_error", + ], + ) + logger.info("Built share link bundle %s", bundle.pk) + except Exception as exc: + logger.exception( + "Failed to build share link bundle %s: %s", + bundle_id, + exc, + ) + bundle.status = ShareLinkBundle.Status.FAILED + bundle.last_error = { + "bundle_id": bundle_id, + "exception_type": exc.__class__.__name__, + "message": str(exc), + "timestamp": timezone.now().isoformat(), + } + bundle.save(update_fields=["status", "last_error"]) + try: + temp_zip_path.unlink() + except OSError: + pass + raise + finally: + try: + temp_zip_path.unlink(missing_ok=True) + except OSError: + pass + + +@shared_task +def cleanup_expired_share_link_bundles() -> None: + now = timezone.now() + expired_qs = ShareLinkBundle.objects.filter( + expiration__isnull=False, + expiration__lt=now, + ) + count = 0 + for bundle in expired_qs.iterator(): + count += 1 + try: + bundle.delete() + except Exception as exc: + logger.warning( + "Failed to delete expired share link bundle %s: %s", + bundle.pk, + exc, + ) + if count: + logger.info("Deleted %s expired share link bundle(s)", count) diff --git a/src/documents/templating/filepath.py b/src/documents/templating/filepath.py index 00de8de2c1..008f1d0a98 100644 --- a/src/documents/templating/filepath.py +++ b/src/documents/templating/filepath.py @@ -52,6 +52,50 @@ def clean_filepath(value: str) -> str: return clean_filepath(original_render) +class PlaceholderString(str): + """ + String subclass used as a sentinel for empty metadata values inside templates. + + - Renders as \"-none-\" to preserve existing filename cleaning logic. + - Compares equal to either \"-none-\" or \"none\" so templates can check for either. + - Evaluates to False so {% if correspondent %} behaves intuitively. + """ + + def __new__(cls, value: str = "-none-"): + return super().__new__(cls, value) + + def __bool__(self) -> bool: + return False + + def __eq__(self, other) -> bool: + if isinstance(other, str) and other == "none": + other = "-none-" + return super().__eq__(other) + + def __ne__(self, other) -> bool: + return not self.__eq__(other) + + +NO_VALUE_PLACEHOLDER = PlaceholderString("-none-") + + +class MatchingModelContext: + """ + Safe template context for related objects. + + Keeps legacy behavior where including the object ina template yields the related object's + name as a string, while still exposing limited attributes. + """ + + def __init__(self, *, id: int, name: str, path: str | None = None): + self.id = id + self.name = name + self.path = path + + def __str__(self) -> str: + return self.name + + _template_environment.undefined = _LogStrictUndefined _template_environment.filters["get_cf_value"] = get_cf_value @@ -81,7 +125,6 @@ def create_dummy_document(): page_count=5, created=timezone.now(), modified=timezone.now(), - storage_type=Document.STORAGE_TYPE_UNENCRYPTED, added=timezone.now(), filename="/dummy/filename.pdf", archive_filename="/dummy/archive_filename.pdf", @@ -128,7 +171,7 @@ def get_added_date_context(document: Document) -> dict[str, str]: def get_basic_metadata_context( document: Document, *, - no_value_default: str, + no_value_default: str = NO_VALUE_PLACEHOLDER, ) -> dict[str, str]: """ Given a Document, constructs some basic information about it. If certain values are not set, @@ -166,6 +209,59 @@ def get_basic_metadata_context( } +def get_safe_document_context( + document: Document, + tags: Iterable[Tag], +) -> dict[str, object]: + """ + Build a document context object to avoid supplying entire model instance. + """ + return { + "id": document.pk, + "pk": document.pk, + "title": document.title, + "content": document.content, + "page_count": document.page_count, + "created": document.created, + "added": document.added, + "modified": document.modified, + "archive_serial_number": document.archive_serial_number, + "mime_type": document.mime_type, + "checksum": document.checksum, + "archive_checksum": document.archive_checksum, + "filename": document.filename, + "archive_filename": document.archive_filename, + "original_filename": document.original_filename, + "owner": {"username": document.owner.username, "id": document.owner.id} + if document.owner + else None, + "tags": [{"name": tag.name, "id": tag.id} for tag in tags], + "correspondent": ( + MatchingModelContext( + name=document.correspondent.name, + id=document.correspondent.id, + ) + if document.correspondent + else None + ), + "document_type": ( + MatchingModelContext( + name=document.document_type.name, + id=document.document_type.id, + ) + if document.document_type + else None + ), + "storage_path": MatchingModelContext( + name=document.storage_path.name, + path=document.storage_path.path, + id=document.storage_path.id, + ) + if document.storage_path + else None, + } + + def get_tags_context(tags: Iterable[Tag]) -> dict[str, str | list[str]]: """ Given an Iterable of tags, constructs some context from them for usage @@ -235,6 +331,17 @@ def get_custom_fields_context( return field_data +def _is_safe_relative_path(value: str) -> bool: + if value == "": + return True + + path = PurePath(value) + if path.is_absolute() or path.drive: + return False + + return ".." not in path.parts + + def validate_filepath_template_and_render( template_string: str, document: Document | None = None, @@ -265,8 +372,8 @@ def validate_filepath_template_and_render( # Build the context dictionary context = ( - {"document": document} - | get_basic_metadata_context(document, no_value_default="-none-") + {"document": get_safe_document_context(document, tags=tags_list)} + | get_basic_metadata_context(document, no_value_default=NO_VALUE_PLACEHOLDER) | get_creation_date_context(document) | get_added_date_context(document) | get_tags_context(tags_list) @@ -282,6 +389,12 @@ def validate_filepath_template_and_render( ) rendered_template = template.render(context) + if not _is_safe_relative_path(rendered_template): + logger.warning( + "Template rendered an unsafe path (absolute or containing traversal).", + ) + return None + # We're good! return rendered_template except UndefinedError: diff --git a/src/documents/templating/workflows.py b/src/documents/templating/workflows.py index 67f3ac930d..66fd97e017 100644 --- a/src/documents/templating/workflows.py +++ b/src/documents/templating/workflows.py @@ -40,6 +40,7 @@ def parse_w_workflow_placeholders( created: date | None = None, doc_title: str | None = None, doc_url: str | None = None, + doc_id: int | None = None, ) -> str: """ Available title placeholders for Workflows depend on what has already been assigned, @@ -79,6 +80,8 @@ def parse_w_workflow_placeholders( formatting.update({"doc_title": doc_title}) if doc_url is not None: formatting.update({"doc_url": doc_url}) + if doc_id is not None: + formatting.update({"doc_id": str(doc_id)}) logger.debug(f"Parsing Workflow Jinja template: {text}") try: diff --git a/src/documents/tests/conftest.py b/src/documents/tests/conftest.py index 8c88cee9f3..a33771fd1c 100644 --- a/src/documents/tests/conftest.py +++ b/src/documents/tests/conftest.py @@ -1,10 +1,96 @@ +import shutil import zoneinfo +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING +import filelock import pytest from django.contrib.auth import get_user_model from pytest_django.fixtures import SettingsWrapper from rest_framework.test import APIClient +from documents.tests.factories import DocumentFactory + +if TYPE_CHECKING: + from documents.models import Document + + +@dataclass(frozen=True, slots=True) +class PaperlessDirs: + """Standard Paperless-ngx directory layout for tests.""" + + media: Path + originals: Path + archive: Path + thumbnails: Path + + +@pytest.fixture(scope="session") +def samples_dir() -> Path: + """Path to the shared test sample documents.""" + return Path(__file__).parent / "samples" / "documents" + + +@pytest.fixture() +def paperless_dirs(tmp_path: Path) -> PaperlessDirs: + """Create and return the directory structure for testing.""" + media = tmp_path / "media" + dirs = PaperlessDirs( + media=media, + originals=media / "documents" / "originals", + archive=media / "documents" / "archive", + thumbnails=media / "documents" / "thumbnails", + ) + for d in (dirs.originals, dirs.archive, dirs.thumbnails): + d.mkdir(parents=True) + return dirs + + +@pytest.fixture() +def _media_settings(paperless_dirs: PaperlessDirs, settings) -> None: + """Configure Django settings to point at temp directories.""" + settings.MEDIA_ROOT = paperless_dirs.media + settings.ORIGINALS_DIR = paperless_dirs.originals + settings.ARCHIVE_DIR = paperless_dirs.archive + settings.THUMBNAIL_DIR = paperless_dirs.thumbnails + settings.MEDIA_LOCK = paperless_dirs.media / "media.lock" + settings.IGNORABLE_FILES = {".DS_Store", "Thumbs.db", "desktop.ini"} + settings.APP_LOGO = "" + + +@pytest.fixture() +def sample_doc( + paperless_dirs: PaperlessDirs, + _media_settings: None, + samples_dir: Path, +) -> "Document": + """Create a document with valid files and matching checksums.""" + with filelock.FileLock(paperless_dirs.media / "media.lock"): + shutil.copy( + samples_dir / "originals" / "0000001.pdf", + paperless_dirs.originals / "0000001.pdf", + ) + shutil.copy( + samples_dir / "archive" / "0000001.pdf", + paperless_dirs.archive / "0000001.pdf", + ) + shutil.copy( + samples_dir / "thumbnails" / "0000001.webp", + paperless_dirs.thumbnails / "0000001.webp", + ) + + return DocumentFactory( + title="test", + checksum="42995833e01aea9b3edee44bbfdd7ce1", + archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", + content="test content", + pk=1, + filename="0000001.pdf", + mime_type="application/pdf", + archive_filename="0000001.pdf", + ) + @pytest.fixture() def settings_timezone(settings: SettingsWrapper) -> zoneinfo.ZoneInfo: @@ -28,3 +114,14 @@ def authenticated_rest_api_client(rest_api_client: APIClient): user = UserModel.objects.create_user(username="testuser", password="password") rest_api_client.force_authenticate(user=user) yield rest_api_client + + +@pytest.fixture(scope="session", autouse=True) +def faker_session_locale(): + """Set Faker locale for reproducibility.""" + return "en_US" + + +@pytest.fixture(scope="session", autouse=True) +def faker_seed(): + return 12345 diff --git a/src/documents/tests/date_parsing/__init__.py b/src/documents/tests/date_parsing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/documents/tests/date_parsing/conftest.py b/src/documents/tests/date_parsing/conftest.py new file mode 100644 index 0000000000..3cc1bab524 --- /dev/null +++ b/src/documents/tests/date_parsing/conftest.py @@ -0,0 +1,82 @@ +import datetime +from collections.abc import Generator +from typing import Any + +import pytest +import pytest_django + +from documents.plugins.date_parsing import _discover_parser_class +from documents.plugins.date_parsing.base import DateParserConfig +from documents.plugins.date_parsing.regex_parser import RegexDateParserPlugin + + +@pytest.fixture +def base_config() -> DateParserConfig: + """Basic configuration for date parser testing.""" + return DateParserConfig( + languages=["en"], + timezone_str="UTC", + ignore_dates=set(), + reference_time=datetime.datetime( + 2024, + 1, + 15, + 12, + 0, + 0, + tzinfo=datetime.UTC, + ), + filename_date_order="YMD", + content_date_order="DMY", + ) + + +@pytest.fixture +def config_with_ignore_dates() -> DateParserConfig: + """Configuration with dates to ignore.""" + return DateParserConfig( + languages=["en", "de"], + timezone_str="America/New_York", + ignore_dates={datetime.date(2024, 1, 1), datetime.date(2024, 12, 25)}, + reference_time=datetime.datetime( + 2024, + 1, + 15, + 12, + 0, + 0, + tzinfo=datetime.UTC, + ), + filename_date_order="DMY", + content_date_order="MDY", + ) + + +@pytest.fixture +def regex_parser(base_config: DateParserConfig) -> RegexDateParserPlugin: + """Instance of RegexDateParser with base config.""" + return RegexDateParserPlugin(base_config) + + +@pytest.fixture +def clear_lru_cache() -> Generator[None, None, None]: + """ + Ensure the LRU cache for _discover_parser_class is cleared + before and after any test that depends on it. + """ + _discover_parser_class.cache_clear() + yield + _discover_parser_class.cache_clear() + + +@pytest.fixture +def mock_date_parser_settings(settings: pytest_django.fixtures.SettingsWrapper) -> Any: + """ + Override Django settings for the duration of date parser tests. + """ + settings.DATE_PARSER_LANGUAGES = ["en", "de"] + settings.TIME_ZONE = "UTC" + settings.IGNORE_DATES = [datetime.date(1900, 1, 1)] + settings.FILENAME_DATE_ORDER = "YMD" + settings.DATE_ORDER = "DMY" + return settings diff --git a/src/documents/tests/date_parsing/test_date_parser_plugin_loading.py b/src/documents/tests/date_parsing/test_date_parser_plugin_loading.py new file mode 100644 index 0000000000..5d870fea10 --- /dev/null +++ b/src/documents/tests/date_parsing/test_date_parser_plugin_loading.py @@ -0,0 +1,229 @@ +import datetime +import logging +from collections.abc import Iterator +from importlib.metadata import EntryPoint + +import pytest +import pytest_mock +from django.utils import timezone + +from documents.plugins.date_parsing import DATE_PARSER_ENTRY_POINT_GROUP +from documents.plugins.date_parsing import _discover_parser_class +from documents.plugins.date_parsing import get_date_parser +from documents.plugins.date_parsing.base import DateParserConfig +from documents.plugins.date_parsing.base import DateParserPluginBase +from documents.plugins.date_parsing.regex_parser import RegexDateParserPlugin + + +class AlphaParser(DateParserPluginBase): + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + yield timezone.now() + + +class BetaParser(DateParserPluginBase): + def parse(self, filename: str, content: str) -> Iterator[datetime.datetime]: + yield timezone.now() + + +@pytest.mark.date_parsing +@pytest.mark.usefixtures("clear_lru_cache") +class TestDiscoverParserClass: + """Tests for the _discover_parser_class() function.""" + + def test_returns_default_when_no_plugins_found( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(), + ) + result = _discover_parser_class() + assert result is RegexDateParserPlugin + + def test_returns_default_when_entrypoint_query_fails( + self, + mocker: pytest_mock.MockerFixture, + caplog: pytest.LogCaptureFixture, + ) -> None: + mocker.patch( + "documents.plugins.date_parsing.entry_points", + side_effect=RuntimeError("boom"), + ) + result = _discover_parser_class() + assert result is RegexDateParserPlugin + assert "Could not query entry points" in caplog.text + + def test_filters_out_invalid_plugins( + self, + mocker: pytest_mock.MockerFixture, + caplog: pytest.LogCaptureFixture, + ) -> None: + fake_ep = mocker.MagicMock(spec=EntryPoint) + fake_ep.name = "bad_plugin" + fake_ep.load.return_value = object # not subclass of DateParser + + mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(fake_ep,), + ) + + result = _discover_parser_class() + assert result is RegexDateParserPlugin + assert "does not subclass DateParser" in caplog.text + + def test_skips_plugins_that_fail_to_load( + self, + mocker: pytest_mock.MockerFixture, + caplog: pytest.LogCaptureFixture, + ) -> None: + fake_ep = mocker.MagicMock(spec=EntryPoint) + fake_ep.name = "failing_plugin" + fake_ep.load.side_effect = ImportError("cannot import") + + mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(fake_ep,), + ) + + result = _discover_parser_class() + assert result is RegexDateParserPlugin + assert "Unable to load date parser plugin failing_plugin" in caplog.text + + def test_returns_single_valid_plugin_without_warning( + self, + mocker: pytest_mock.MockerFixture, + caplog: pytest.LogCaptureFixture, + ) -> None: + """If exactly one valid plugin is discovered, it should be returned without logging a warning.""" + + ep = mocker.MagicMock(spec=EntryPoint) + ep.name = "alpha" + ep.load.return_value = AlphaParser + + mock_entry_points = mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(ep,), + ) + + with caplog.at_level( + logging.WARNING, + logger="documents.plugins.date_parsing", + ): + result = _discover_parser_class() + + # It should have called entry_points with the correct group + mock_entry_points.assert_called_once_with(group=DATE_PARSER_ENTRY_POINT_GROUP) + + # The discovered class should be exactly our AlphaParser + assert result is AlphaParser + + # No warnings should have been logged + assert not any( + "Multiple date parsers found" in record.message for record in caplog.records + ), "Unexpected warning logged when only one plugin was found" + + def test_returns_first_valid_plugin_by_name( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + ep_a = mocker.MagicMock(spec=EntryPoint) + ep_a.name = "alpha" + ep_a.load.return_value = AlphaParser + + ep_b = mocker.MagicMock(spec=EntryPoint) + ep_b.name = "beta" + ep_b.load.return_value = BetaParser + + mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(ep_b, ep_a), + ) + + result = _discover_parser_class() + assert result is AlphaParser + + def test_logs_warning_if_multiple_plugins_found( + self, + mocker: pytest_mock.MockerFixture, + caplog: pytest.LogCaptureFixture, + ) -> None: + ep1 = mocker.MagicMock(spec=EntryPoint) + ep1.name = "a" + ep1.load.return_value = AlphaParser + + ep2 = mocker.MagicMock(spec=EntryPoint) + ep2.name = "b" + ep2.load.return_value = BetaParser + + mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(ep1, ep2), + ) + + with caplog.at_level( + logging.WARNING, + logger="documents.plugins.date_parsing", + ): + result = _discover_parser_class() + + # Should select alphabetically first plugin ("a") + assert result is AlphaParser + + # Should log a warning mentioning multiple parsers + assert any( + "Multiple date parsers found" in record.message for record in caplog.records + ), "Expected a warning about multiple date parsers" + + def test_cache_behavior_only_runs_once( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + mock_entry_points = mocker.patch( + "documents.plugins.date_parsing.entry_points", + return_value=(), + ) + + # First call populates cache + _discover_parser_class() + # Second call should not re-invoke entry_points + _discover_parser_class() + mock_entry_points.assert_called_once() + + +@pytest.mark.django_db +@pytest.mark.date_parsing +@pytest.mark.usefixtures("mock_date_parser_settings") +class TestGetDateParser: + """Tests for the get_date_parser() factory function.""" + + def test_returns_instance_of_discovered_class( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + mocker.patch( + "documents.plugins.date_parsing._discover_parser_class", + return_value=AlphaParser, + ) + parser = get_date_parser() + assert isinstance(parser, AlphaParser) + assert isinstance(parser.config, DateParserConfig) + assert parser.config.languages == ["en", "de"] + assert parser.config.timezone_str == "UTC" + assert parser.config.ignore_dates == [datetime.date(1900, 1, 1)] + assert parser.config.filename_date_order == "YMD" + assert parser.config.content_date_order == "DMY" + # Check reference_time near now + delta = abs((parser.config.reference_time - timezone.now()).total_seconds()) + assert delta < 2 + + def test_uses_default_regex_parser_when_no_plugins( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + mocker.patch( + "documents.plugins.date_parsing._discover_parser_class", + return_value=RegexDateParserPlugin, + ) + parser = get_date_parser() + assert isinstance(parser, RegexDateParserPlugin) diff --git a/src/documents/tests/date_parsing/test_date_parsing.py b/src/documents/tests/date_parsing/test_date_parsing.py new file mode 100644 index 0000000000..f43303d224 --- /dev/null +++ b/src/documents/tests/date_parsing/test_date_parsing.py @@ -0,0 +1,433 @@ +import datetime +import logging +from typing import Any + +import pytest +import pytest_mock + +from documents.plugins.date_parsing.base import DateParserConfig +from documents.plugins.date_parsing.regex_parser import RegexDateParserPlugin + + +@pytest.mark.date_parsing +class TestParseString: + """Tests for DateParser._parse_string method via RegexDateParser.""" + + @pytest.mark.parametrize( + ("date_string", "date_order", "expected_year"), + [ + pytest.param("15/01/2024", "DMY", 2024, id="dmy_slash"), + pytest.param("01/15/2024", "MDY", 2024, id="mdy_slash"), + pytest.param("2024/01/15", "YMD", 2024, id="ymd_slash"), + pytest.param("January 15, 2024", "DMY", 2024, id="month_name_comma"), + pytest.param("15 Jan 2024", "DMY", 2024, id="day_abbr_month_year"), + pytest.param("15.01.2024", "DMY", 2024, id="dmy_dot"), + pytest.param("2024-01-15", "YMD", 2024, id="ymd_dash"), + ], + ) + def test_parse_string_valid_formats( + self, + regex_parser: RegexDateParserPlugin, + date_string: str, + date_order: str, + expected_year: int, + ) -> None: + """Should correctly parse various valid date formats.""" + result = regex_parser._parse_string(date_string, date_order) + + assert result is not None + assert result.year == expected_year + + @pytest.mark.parametrize( + "invalid_string", + [ + pytest.param("not a date", id="plain_text"), + pytest.param("32/13/2024", id="invalid_day_month"), + pytest.param("", id="empty_string"), + pytest.param("abc123xyz", id="alphanumeric_gibberish"), + pytest.param("99/99/9999", id="out_of_range"), + ], + ) + def test_parse_string_invalid_input( + self, + regex_parser: RegexDateParserPlugin, + invalid_string: str, + ) -> None: + """Should return None for invalid date strings.""" + result = regex_parser._parse_string(invalid_string, "DMY") + + assert result is None + + def test_parse_string_handles_exceptions( + self, + caplog: pytest.LogCaptureFixture, + mocker: pytest_mock.MockerFixture, + regex_parser: RegexDateParserPlugin, + ) -> None: + """Should handle and log exceptions from dateparser gracefully.""" + with caplog.at_level( + logging.ERROR, + logger="documents.plugins.date_parsing.base", + ): + # We still need to mock dateparser.parse to force the exception + mocker.patch( + "documents.plugins.date_parsing.base.dateparser.parse", + side_effect=ValueError( + "Parsing error: 01/01/2024", + ), + ) + + # 1. Execute the function under test + result = regex_parser._parse_string("01/01/2024", "DMY") + + assert result is None + + # Check if an error was logged + assert len(caplog.records) == 1 + assert caplog.records[0].levelname == "ERROR" + + # Check if the specific error message is present + assert "Error while parsing date string" in caplog.text + # Optional: Check for the exact exception message if it's included in the log + assert "Parsing error: 01/01/2024" in caplog.text + + +@pytest.mark.date_parsing +class TestFilterDate: + """Tests for DateParser._filter_date method via RegexDateParser.""" + + @pytest.mark.parametrize( + ("date", "expected_output"), + [ + # Valid Dates + pytest.param( + datetime.datetime(2024, 1, 10, tzinfo=datetime.UTC), + datetime.datetime(2024, 1, 10, tzinfo=datetime.UTC), + id="valid_past_date", + ), + pytest.param( + datetime.datetime(2024, 1, 15, 12, 0, 0, tzinfo=datetime.UTC), + datetime.datetime(2024, 1, 15, 12, 0, 0, tzinfo=datetime.UTC), + id="exactly_at_reference", + ), + pytest.param( + datetime.datetime(1901, 1, 1, tzinfo=datetime.UTC), + datetime.datetime(1901, 1, 1, tzinfo=datetime.UTC), + id="year_1901_valid", + ), + # Date is > reference_time + pytest.param( + datetime.datetime(2024, 1, 16, tzinfo=datetime.UTC), + None, + id="future_date_day_after", + ), + # date.date() in ignore_dates + pytest.param( + datetime.datetime(2024, 1, 1, 0, 0, 0, tzinfo=datetime.UTC), + None, + id="ignored_date_midnight_jan1", + ), + pytest.param( + datetime.datetime(2024, 1, 1, 10, 30, 0, tzinfo=datetime.UTC), + None, + id="ignored_date_midday_jan1", + ), + pytest.param( + datetime.datetime(2024, 12, 25, 15, 0, 0, tzinfo=datetime.UTC), + None, + id="ignored_date_dec25_future", + ), + # date.year <= 1900 + pytest.param( + datetime.datetime(1899, 12, 31, tzinfo=datetime.UTC), + None, + id="year_1899", + ), + pytest.param( + datetime.datetime(1900, 1, 1, tzinfo=datetime.UTC), + None, + id="year_1900_boundary", + ), + # date is None + pytest.param(None, None, id="none_input"), + ], + ) + def test_filter_date_validation_rules( + self, + config_with_ignore_dates: DateParserConfig, + date: datetime.datetime | None, + expected_output: datetime.datetime | None, + ) -> None: + """Should correctly validate dates against various rules.""" + parser = RegexDateParserPlugin(config_with_ignore_dates) + result = parser._filter_date(date) + assert result == expected_output + + def test_filter_date_respects_ignore_dates( + self, + config_with_ignore_dates: DateParserConfig, + ) -> None: + """Should filter out dates in the ignore_dates set.""" + parser = RegexDateParserPlugin(config_with_ignore_dates) + + ignored_date = datetime.datetime( + 2024, + 1, + 1, + 12, + 0, + tzinfo=datetime.UTC, + ) + another_ignored = datetime.datetime( + 2024, + 12, + 25, + 15, + 30, + tzinfo=datetime.UTC, + ) + allowed_date = datetime.datetime( + 2024, + 1, + 2, + 12, + 0, + tzinfo=datetime.UTC, + ) + + assert parser._filter_date(ignored_date) is None + assert parser._filter_date(another_ignored) is None + assert parser._filter_date(allowed_date) == allowed_date + + def test_filter_date_timezone_aware( + self, + regex_parser: RegexDateParserPlugin, + ) -> None: + """Should work with timezone-aware datetimes.""" + date_utc = datetime.datetime(2024, 1, 10, 12, 0, tzinfo=datetime.UTC) + + result = regex_parser._filter_date(date_utc) + + assert result is not None + assert result.tzinfo is not None + + +@pytest.mark.date_parsing +class TestRegexDateParser: + @pytest.mark.parametrize( + ("filename", "content", "expected"), + [ + pytest.param( + "report-2023-12-25.txt", + "Event recorded on 25/12/2022.", + [ + datetime.datetime(2023, 12, 25, tzinfo=datetime.UTC), + datetime.datetime(2022, 12, 25, tzinfo=datetime.UTC), + ], + id="filename-y-m-d_and_content-d-m-y", + ), + pytest.param( + "img_2023.01.02.jpg", + "Taken on 01/02/2023", + [ + datetime.datetime(2023, 1, 2, tzinfo=datetime.UTC), + datetime.datetime(2023, 2, 1, tzinfo=datetime.UTC), + ], + id="ambiguous-dates-respect-orders", + ), + pytest.param( + "notes.txt", + "bad date 99/99/9999 and 25/12/2022", + [ + datetime.datetime(2022, 12, 25, tzinfo=datetime.UTC), + ], + id="parse-exception-skips-bad-and-yields-good", + ), + ], + ) + def test_parse_returns_expected_dates( + self, + base_config: DateParserConfig, + mocker: pytest_mock.MockerFixture, + filename: str, + content: str, + expected: list[datetime.datetime], + ) -> None: + """ + High-level tests that exercise RegexDateParser.parse only. + dateparser.parse is mocked so tests are deterministic. + """ + parser = RegexDateParserPlugin(base_config) + + # Patch the dateparser.parse + target = "documents.plugins.date_parsing.base.dateparser.parse" + + def fake_parse( + date_string: str, + settings: dict[str, Any] | None = None, + locales: None = None, + ) -> datetime.datetime | None: + date_order = settings.get("DATE_ORDER") if settings else None + + # Filename-style YYYY-MM-DD / YYYY.MM.DD + if ( + "2023-12-25" in date_string + or "2023.12.25" in date_string + or "2023-12-25" in date_string + ): + return datetime.datetime(2023, 12, 25, tzinfo=datetime.UTC) + + # content DMY 25/12/2022 + if "25/12/2022" in date_string or "25-12-2022" in date_string: + return datetime.datetime(2022, 12, 25, tzinfo=datetime.UTC) + + # filename YMD 2023.01.02 + if "2023.01.02" in date_string or "2023-01-02" in date_string: + return datetime.datetime(2023, 1, 2, tzinfo=datetime.UTC) + + # ambiguous 01/02/2023 -> respect DATE_ORDER setting + if "01/02/2023" in date_string: + if date_order == "DMY": + return datetime.datetime(2023, 2, 1, tzinfo=datetime.UTC) + if date_order == "YMD": + return datetime.datetime(2023, 1, 2, tzinfo=datetime.UTC) + # fallback + return datetime.datetime(2023, 2, 1, tzinfo=datetime.UTC) + + # simulate parse failure for malformed input + if "99/99/9999" in date_string or "bad date" in date_string: + raise Exception("parse failed for malformed date") + + return None + + mocker.patch(target, side_effect=fake_parse) + + results = list(parser.parse(filename, content)) + + assert results == expected + for dt in results: + assert dt.tzinfo is not None + + def test_parse_filters_future_and_ignored_dates( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + """ + Ensure parser filters out: + - dates after reference_time + - dates whose .date() are in ignore_dates + """ + cfg = DateParserConfig( + languages=["en"], + timezone_str="UTC", + ignore_dates={datetime.date(2023, 12, 10)}, + reference_time=datetime.datetime( + 2024, + 1, + 15, + 12, + 0, + 0, + tzinfo=datetime.UTC, + ), + filename_date_order="YMD", + content_date_order="DMY", + ) + parser = RegexDateParserPlugin(cfg) + + target = "documents.plugins.date_parsing.base.dateparser.parse" + + def fake_parse( + date_string: str, + settings: dict[str, Any] | None = None, + locales: None = None, + ) -> datetime.datetime | None: + if "10/12/2023" in date_string or "10-12-2023" in date_string: + # ignored date + return datetime.datetime(2023, 12, 10, tzinfo=datetime.UTC) + if "01/02/2024" in date_string or "01-02-2024" in date_string: + # future relative to reference_time -> filtered + return datetime.datetime(2024, 2, 1, tzinfo=datetime.UTC) + if "05/01/2023" in date_string or "05-01-2023" in date_string: + # valid + return datetime.datetime(2023, 1, 5, tzinfo=datetime.UTC) + return None + + mocker.patch(target, side_effect=fake_parse) + + content = "Ignored: 10/12/2023, Future: 01/02/2024, Keep: 05/01/2023" + results = list(parser.parse("whatever.txt", content)) + + assert results == [datetime.datetime(2023, 1, 5, tzinfo=datetime.UTC)] + + def test_parse_handles_no_matches_and_returns_empty_list( + self, + base_config: DateParserConfig, + ) -> None: + """ + When there are no matching date-like substrings, parse should yield nothing. + """ + parser = RegexDateParserPlugin(base_config) + results = list( + parser.parse("no-dates.txt", "this has no dates whatsoever"), + ) + assert results == [] + + def test_parse_skips_filename_when_filename_date_order_none( + self, + mocker: pytest_mock.MockerFixture, + ) -> None: + """ + When filename_date_order is None the parser must not attempt to parse the filename. + Only dates found in the content should be passed to dateparser.parse. + """ + cfg = DateParserConfig( + languages=["en"], + timezone_str="UTC", + ignore_dates=set(), + reference_time=datetime.datetime( + 2024, + 1, + 15, + 12, + 0, + 0, + tzinfo=datetime.UTC, + ), + filename_date_order=None, + content_date_order="DMY", + ) + parser = RegexDateParserPlugin(cfg) + + # Patch the module's dateparser.parse so we can inspect calls + target = "documents.plugins.date_parsing.base.dateparser.parse" + + def fake_parse( + date_string: str, + settings: dict[str, Any] | None = None, + locales: None = None, + ) -> datetime.datetime | None: + # return distinct datetimes so we can tell which source was parsed + if "25/12/2022" in date_string: + return datetime.datetime(2022, 12, 25, tzinfo=datetime.UTC) + if "2023-12-25" in date_string: + return datetime.datetime(2023, 12, 25, tzinfo=datetime.UTC) + return None + + mock = mocker.patch(target, side_effect=fake_parse) + + filename = "report-2023-12-25.txt" + content = "Event recorded on 25/12/2022." + + results = list(parser.parse(filename, content)) + + # Only the content date should have been parsed -> one call + assert mock.call_count == 1 + + # # first call, first positional arg + called_date_string = mock.call_args_list[0][0][0] + assert "25/12/2022" in called_date_string + # And the parser should have yielded the corresponding datetime + assert results == [ + datetime.datetime(2022, 12, 25, tzinfo=datetime.UTC), + ] diff --git a/src/documents/tests/factories.py b/src/documents/tests/factories.py index de41bbd02f..d1d88587c5 100644 --- a/src/documents/tests/factories.py +++ b/src/documents/tests/factories.py @@ -1,17 +1,67 @@ -from factory import Faker +""" +Factory-boy factories for documents app models. +""" + +from __future__ import annotations + +import factory from factory.django import DjangoModelFactory from documents.models import Correspondent from documents.models import Document +from documents.models import DocumentType +from documents.models import MatchingModel +from documents.models import StoragePath +from documents.models import Tag class CorrespondentFactory(DjangoModelFactory): class Meta: model = Correspondent - name = Faker("name") + name = factory.Sequence(lambda n: f"{factory.Faker('company')} {n}") + match = "" + matching_algorithm = MatchingModel.MATCH_NONE + + +class DocumentTypeFactory(DjangoModelFactory): + class Meta: + model = DocumentType + + name = factory.Sequence(lambda n: f"{factory.Faker('bs')} {n}") + match = "" + matching_algorithm = MatchingModel.MATCH_NONE + + +class TagFactory(DjangoModelFactory): + class Meta: + model = Tag + + name = factory.Sequence(lambda n: f"{factory.Faker('word')} {n}") + match = "" + matching_algorithm = MatchingModel.MATCH_NONE + is_inbox_tag = False + + +class StoragePathFactory(DjangoModelFactory): + class Meta: + model = StoragePath + + name = factory.Sequence( + lambda n: f"{factory.Faker('file_path', depth=2, extension='')} {n}", + ) + path = factory.LazyAttribute(lambda o: f"{o.name}/{{title}}") + match = "" + matching_algorithm = MatchingModel.MATCH_NONE class DocumentFactory(DjangoModelFactory): class Meta: model = Document + + title = factory.Faker("sentence", nb_words=4) + checksum = factory.Faker("md5") + content = factory.Faker("paragraph") + correspondent = None + document_type = None + storage_path = None diff --git a/src/documents/tests/management/__init__.py b/src/documents/tests/management/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/documents/tests/management/test_management_base_cmd.py b/src/documents/tests/management/test_management_base_cmd.py new file mode 100644 index 0000000000..d4c99f1512 --- /dev/null +++ b/src/documents/tests/management/test_management_base_cmd.py @@ -0,0 +1,518 @@ +"""Tests for PaperlessCommand base class.""" + +from __future__ import annotations + +import io +from typing import TYPE_CHECKING + +import pytest +from django.core.management import CommandError +from django.db.models import QuerySet +from rich.console import Console + +from documents.management.commands.base import PaperlessCommand +from documents.management.commands.base import ProcessResult + +if TYPE_CHECKING: + from pytest_mock import MockerFixture + + +# --- Test Commands --- +# These simulate real command implementations for testing + + +class SimpleCommand(PaperlessCommand): + """Command with default settings (progress bar, no multiprocessing).""" + + help = "Simple test command" + + def handle(self, *args, **options): + items = list(range(5)) + results = [] + for item in self.track(items, description="Processing..."): + results.append(item * 2) + self.stdout.write(f"Results: {results}") + + +class NoProgressBarCommand(PaperlessCommand): + """Command with progress bar disabled.""" + + help = "No progress bar command" + supports_progress_bar = False + + def handle(self, *args, **options): + items = list(range(3)) + for _ in self.track(items): + # We don't need to actually work + pass + self.stdout.write("Done") + + +class MultiprocessCommand(PaperlessCommand): + """Command with multiprocessing support.""" + + help = "Multiprocess test command" + supports_multiprocessing = True + + def handle(self, *args, **options): + items = list(range(5)) + results = [] + for result in self.process_parallel( + _double_value, + items, + description="Processing...", + ): + results.append(result) + successes = sum(1 for r in results if r.success) + self.stdout.write(f"Successes: {successes}") + + +# --- Helper Functions for Multiprocessing --- +# Must be at module level to be picklable + + +def _double_value(x: int) -> int: + """Double the input value.""" + return x * 2 + + +def _divide_ten_by(x: int) -> float: + """Divide 10 by x. Raises ZeroDivisionError if x is 0.""" + return 10 / x + + +# --- Fixtures --- + + +@pytest.fixture +def console() -> Console: + """Create a non-interactive console for testing.""" + return Console(force_terminal=False, force_interactive=False) + + +@pytest.fixture +def simple_command(console: Console) -> SimpleCommand: + """Create a SimpleCommand instance configured for testing.""" + command = SimpleCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + command.console = console + command.no_progress_bar = True + command.process_count = 1 + return command + + +@pytest.fixture +def multiprocess_command(console: Console) -> MultiprocessCommand: + """Create a MultiprocessCommand instance configured for testing.""" + command = MultiprocessCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + command.console = console + command.no_progress_bar = True + command.process_count = 1 + return command + + +@pytest.fixture +def mock_queryset(): + """ + Create a mock Django QuerySet that tracks method calls. + + This verifies we use .count() instead of len() for querysets. + """ + + class MockQuerySet(QuerySet): + def __init__(self, items: list): + self._items = items + self.count_called = False + + def count(self) -> int: + self.count_called = True + return len(self._items) + + def __iter__(self): + return iter(self._items) + + def __len__(self): + raise AssertionError("len() should not be called on querysets") + + return MockQuerySet + + +# --- Test Classes --- + + +@pytest.mark.management +class TestProcessResult: + """Tests for the ProcessResult dataclass.""" + + def test_success_result(self): + result = ProcessResult(item=1, result=2, error=None) + + assert result.item == 1 + assert result.result == 2 + assert result.error is None + assert result.success is True + + def test_error_result(self): + error = ValueError("test error") + result = ProcessResult(item=1, result=None, error=error) + + assert result.item == 1 + assert result.result is None + assert result.error is error + assert result.success is False + + +@pytest.mark.management +class TestPaperlessCommandArguments: + """Tests for argument parsing behavior.""" + + def test_progress_bar_argument_added_by_default(self): + command = SimpleCommand() + parser = command.create_parser("manage.py", "simple") + + options = parser.parse_args(["--no-progress-bar"]) + assert options.no_progress_bar is True + + options = parser.parse_args([]) + assert options.no_progress_bar is False + + def test_progress_bar_argument_not_added_when_disabled(self): + 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): + command = MultiprocessCommand() + parser = command.create_parser("manage.py", "multiprocess") + + options = parser.parse_args(["--processes", "4"]) + assert options.processes == 4 + + options = parser.parse_args([]) + assert options.processes >= 1 + + def test_processes_argument_not_added_when_multiprocessing_disabled(self): + command = SimpleCommand() + parser = command.create_parser("manage.py", "simple") + + options = parser.parse_args([]) + assert not hasattr(options, "processes") + + +@pytest.mark.management +class TestPaperlessCommandExecute: + """Tests for the execute() setup behavior.""" + + @pytest.fixture + def base_options(self) -> dict: + """Base options required for execute().""" + return { + "verbosity": 1, + "no_color": True, + "force_color": False, + "skip_checks": True, + } + + @pytest.mark.parametrize( + ("no_progress_bar_flag", "expected"), + [ + pytest.param(False, False, id="progress-bar-enabled"), + pytest.param(True, True, id="progress-bar-disabled"), + ], + ) + def test_no_progress_bar_state_set( + self, + base_options: dict, + *, + no_progress_bar_flag: bool, + expected: bool, + ): + command = SimpleCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + + options = {**base_options, "no_progress_bar": no_progress_bar_flag} + command.execute(**options) + + assert command.no_progress_bar is expected + + def test_no_progress_bar_always_true_when_not_supported(self, base_options: dict): + command = NoProgressBarCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + + command.execute(**base_options) + + assert command.no_progress_bar is True + + @pytest.mark.parametrize( + ("processes", "expected"), + [ + pytest.param(1, 1, id="single-process"), + pytest.param(4, 4, id="four-processes"), + ], + ) + def test_process_count_set( + self, + base_options: dict, + processes: int, + expected: int, + ): + command = MultiprocessCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + + options = {**base_options, "processes": processes, "no_progress_bar": True} + command.execute(**options) + + assert command.process_count == expected + + @pytest.mark.parametrize( + "invalid_count", + [ + pytest.param(0, id="zero"), + pytest.param(-1, id="negative"), + ], + ) + def test_process_count_validation_rejects_invalid( + self, + base_options: dict, + invalid_count: int, + ): + command = MultiprocessCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + + options = {**base_options, "processes": invalid_count, "no_progress_bar": True} + + 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): + command = SimpleCommand() + command.stdout = io.StringIO() + command.stderr = io.StringIO() + + options = {**base_options, "no_progress_bar": True} + command.execute(**options) + + assert command.process_count == 1 + + +@pytest.mark.management +class TestGetIterableLength: + """Tests for the _get_iterable_length() method.""" + + def test_uses_count_for_querysets( + self, + simple_command: SimpleCommand, + mock_queryset, + ): + """Should call .count() on Django querysets rather than len().""" + queryset = mock_queryset([1, 2, 3, 4, 5]) + + result = simple_command._get_iterable_length(queryset) + + assert result == 5 + assert queryset.count_called is True + + def test_uses_len_for_sized(self, simple_command: SimpleCommand): + """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): + """Should return None for generators and other iterables without len().""" + result = simple_command._get_iterable_length(x for x in [1, 2, 3]) + + assert result is None + + +@pytest.mark.management +class TestTrack: + """Tests for the track() method.""" + + def test_with_progress_bar_disabled(self, simple_command: SimpleCommand): + simple_command.no_progress_bar = True + items = ["a", "b", "c"] + + result = list(simple_command.track(items, description="Test...")) + + assert result == items + + def test_with_progress_bar_enabled(self, simple_command: SimpleCommand): + simple_command.no_progress_bar = False + items = [1, 2, 3] + + result = list(simple_command.track(items, description="Processing...")) + + assert result == items + + def test_with_explicit_total(self, simple_command: SimpleCommand): + simple_command.no_progress_bar = False + + def gen(): + yield from [1, 2, 3] + + result = list(simple_command.track(gen(), total=3)) + + assert result == [1, 2, 3] + + def test_with_generator_no_total(self, simple_command: SimpleCommand): + def gen(): + yield from [1, 2, 3] + + result = list(simple_command.track(gen())) + + assert result == [1, 2, 3] + + def test_empty_iterable(self, simple_command: SimpleCommand): + result = list(simple_command.track([])) + + assert result == [] + + def test_uses_queryset_count( + self, + simple_command: SimpleCommand, + mock_queryset, + mocker: MockerFixture, + ): + """Verify track() uses .count() for querysets.""" + simple_command.no_progress_bar = False + queryset = mock_queryset([1, 2, 3]) + + spy = mocker.spy(simple_command, "_get_iterable_length") + + result = list(simple_command.track(queryset)) + + assert result == [1, 2, 3] + spy.assert_called_once_with(queryset) + assert queryset.count_called is True + + +@pytest.mark.management +class TestProcessParallel: + """Tests for the process_parallel() method.""" + + def test_sequential_processing_single_process( + self, + multiprocess_command: MultiprocessCommand, + ): + multiprocess_command.process_count = 1 + items = [1, 2, 3, 4, 5] + + results = list(multiprocess_command.process_parallel(_double_value, items)) + + assert len(results) == 5 + assert all(r.success for r in results) + + result_map = {r.item: r.result for r in results} + assert result_map == {1: 2, 2: 4, 3: 6, 4: 8, 5: 10} + + def test_sequential_processing_handles_errors( + self, + multiprocess_command: MultiprocessCommand, + ): + multiprocess_command.process_count = 1 + items = [1, 2, 0, 4] # 0 causes ZeroDivisionError + + results = list(multiprocess_command.process_parallel(_divide_ten_by, items)) + + assert len(results) == 4 + + successes = [r for r in results if r.success] + failures = [r for r in results if not r.success] + + assert len(successes) == 3 + assert len(failures) == 1 + assert failures[0].item == 0 + assert isinstance(failures[0].error, ZeroDivisionError) + + def test_parallel_closes_db_connections( + self, + multiprocess_command: MultiprocessCommand, + mocker: MockerFixture, + ): + multiprocess_command.process_count = 2 + items = [1, 2, 3] + + mock_connections = mocker.patch( + "documents.management.commands.base.db.connections", + ) + + results = list(multiprocess_command.process_parallel(_double_value, items)) + + mock_connections.close_all.assert_called_once() + assert len(results) == 3 + + def test_parallel_processing_handles_errors( + self, + multiprocess_command: MultiprocessCommand, + mocker: MockerFixture, + ): + multiprocess_command.process_count = 2 + items = [1, 2, 0, 4] + + mocker.patch("documents.management.commands.base.db.connections") + + results = list(multiprocess_command.process_parallel(_divide_ten_by, items)) + + failures = [r for r in results if not r.success] + assert len(failures) == 1 + assert failures[0].item == 0 + + def test_empty_items(self, multiprocess_command: MultiprocessCommand): + results = list(multiprocess_command.process_parallel(_double_value, [])) + + assert results == [] + + def test_result_contains_original_item( + self, + multiprocess_command: MultiprocessCommand, + ): + items = [10, 20, 30] + + results = list(multiprocess_command.process_parallel(_double_value, items)) + + for result in results: + assert result.item in items + assert result.result == result.item * 2 + + def test_sequential_path_used_for_single_process( + self, + multiprocess_command: MultiprocessCommand, + mocker: MockerFixture, + ): + """Verify single process uses sequential path (important for testing).""" + multiprocess_command.process_count = 1 + + spy_sequential = mocker.spy(multiprocess_command, "_process_sequential") + spy_parallel = mocker.spy(multiprocess_command, "_process_parallel") + + list(multiprocess_command.process_parallel(_double_value, [1, 2, 3])) + + spy_sequential.assert_called_once() + spy_parallel.assert_not_called() + + def test_parallel_path_used_for_multiple_processes( + self, + multiprocess_command: MultiprocessCommand, + mocker: MockerFixture, + ): + """Verify multiple processes uses parallel path.""" + multiprocess_command.process_count = 2 + + mocker.patch("documents.management.commands.base.db.connections") + spy_sequential = mocker.spy(multiprocess_command, "_process_sequential") + spy_parallel = mocker.spy(multiprocess_command, "_process_parallel") + + list(multiprocess_command.process_parallel(_double_value, [1, 2, 3])) + + spy_parallel.assert_called_once() + spy_sequential.assert_not_called() diff --git a/src/documents/tests/management/test_management_sanity_checker.py b/src/documents/tests/management/test_management_sanity_checker.py new file mode 100644 index 0000000000..f0752ef106 --- /dev/null +++ b/src/documents/tests/management/test_management_sanity_checker.py @@ -0,0 +1,208 @@ +"""Tests for the document_sanity_checker management command. + +Verifies Rich rendering (table, panel, summary) and end-to-end CLI behavior. +""" + +from __future__ import annotations + +from io import StringIO +from pathlib import Path +from typing import TYPE_CHECKING + +import pytest +from django.core.management import call_command +from rich.console import Console + +from documents.management.commands.document_sanity_checker import Command +from documents.sanity_checker import SanityCheckMessages +from documents.tests.factories import DocumentFactory + +if TYPE_CHECKING: + from documents.models import Document + from documents.tests.conftest import PaperlessDirs + + +def _render_to_string(messages: SanityCheckMessages) -> str: + """Render command output to a plain string for assertion.""" + buf = StringIO() + cmd = Command() + cmd.console = Console(file=buf, width=120, no_color=True) + cmd._render_results(messages) + return buf.getvalue() + + +# --------------------------------------------------------------------------- +# Rich rendering +# --------------------------------------------------------------------------- + + +class TestRenderResultsNoIssues: + """No DB access needed -- renders an empty SanityCheckMessages.""" + + def test_shows_panel(self) -> None: + output = _render_to_string(SanityCheckMessages()) + assert "No issues detected" in output + assert "Sanity Check" in output + + +@pytest.mark.django_db +class TestRenderResultsWithIssues: + def test_error_row(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.error(sample_doc.pk, "Original missing") + output = _render_to_string(msgs) + assert "Sanity Check Results" in output + assert "ERROR" in output + assert "Original missing" in output + assert f"#{sample_doc.pk}" in output + assert sample_doc.title in output + + def test_warning_row(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.warning(sample_doc.pk, "Suspicious file") + output = _render_to_string(msgs) + assert "WARN" in output + assert "Suspicious file" in output + + def test_info_row(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.info(sample_doc.pk, "No OCR data") + output = _render_to_string(msgs) + assert "INFO" in output + assert "No OCR data" in output + + @pytest.mark.usefixtures("_media_settings") + def test_global_message(self) -> None: + msgs = SanityCheckMessages() + msgs.warning(None, "Orphaned file: /tmp/stray.pdf") + output = _render_to_string(msgs) + assert "(global)" in output + assert "Orphaned file" in output + + def test_multiple_messages_same_doc(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.error(sample_doc.pk, "Thumbnail missing") + msgs.error(sample_doc.pk, "Checksum mismatch") + output = _render_to_string(msgs) + assert "Thumbnail missing" in output + assert "Checksum mismatch" in output + + @pytest.mark.usefixtures("_media_settings") + def test_unknown_doc_pk(self) -> None: + msgs = SanityCheckMessages() + msgs.error(99999, "Ghost document") + output = _render_to_string(msgs) + assert "#99999" in output + assert "Unknown" in output + + +@pytest.mark.django_db +class TestRenderResultsSummary: + def test_errors_only(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.error(sample_doc.pk, "broken") + output = _render_to_string(msgs) + assert "1 document(s) with" in output + assert "errors" in output + + def test_warnings_only(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.warning(sample_doc.pk, "odd") + output = _render_to_string(msgs) + assert "1 document(s) with" in output + assert "warnings" in output + + def test_infos_only(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.info(sample_doc.pk, "no OCR") + output = _render_to_string(msgs) + assert "1 document(s) with infos" in output + + def test_empty_messages(self) -> None: + msgs = SanityCheckMessages() + output = _render_to_string(msgs) + assert "No issues detected." in output + + def test_document_errors_and_global_warnings(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.error(sample_doc.pk, "broken") + msgs.warning(None, "orphan") + output = _render_to_string(msgs) + assert "1 document(s) with" in output + assert "errors" in output + assert "1 global warning(s)" in output + assert "2 document(s)" not in output + + def test_global_warnings_only(self) -> None: + msgs = SanityCheckMessages() + msgs.warning(None, "extra file") + output = _render_to_string(msgs) + assert "1 global warning(s)" in output + assert "document(s) with" not in output + + def test_all_levels_combined(self, sample_doc: Document) -> None: + msgs = SanityCheckMessages() + msgs.error(sample_doc.pk, "broken") + msgs.warning(sample_doc.pk, "odd") + msgs.info(sample_doc.pk, "fyi") + msgs.warning(None, "extra file") + output = _render_to_string(msgs) + assert "1 document(s) with errors" in output + assert "1 document(s) with warnings" in output + assert "1 document(s) with infos" in output + assert "1 global warning(s)" in output + + +# --------------------------------------------------------------------------- +# End-to-end command execution +# --------------------------------------------------------------------------- + + +@pytest.mark.django_db +@pytest.mark.management +class TestDocumentSanityCheckerCommand: + def test_no_issues(self, sample_doc: Document) -> None: + out = StringIO() + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) + assert "No issues detected" in out.getvalue() + + def test_missing_original(self, sample_doc: Document) -> None: + Path(sample_doc.source_path).unlink() + out = StringIO() + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) + output = out.getvalue() + assert "ERROR" in output + assert "Original of document does not exist" in output + + @pytest.mark.usefixtures("_media_settings") + def test_checksum_mismatch(self, paperless_dirs: PaperlessDirs) -> None: + """Lightweight document with zero-byte files triggers checksum mismatch.""" + doc = DocumentFactory( + title="test", + content="test", + filename="test.pdf", + checksum="abc", + ) + Path(doc.source_path).touch() + Path(doc.thumbnail_path).touch() + + out = StringIO() + call_command( + "document_sanity_checker", + "--no-progress-bar", + stdout=out, + skip_checks=True, + ) + output = out.getvalue() + assert "ERROR" in output + assert "Checksum mismatch. Stored: abc, actual:" in output diff --git a/src/documents/tests/samples/barcodes/split-by-tag-basic.pdf b/src/documents/tests/samples/barcodes/split-by-tag-basic.pdf new file mode 100644 index 0000000000..e7959fab91 Binary files /dev/null and b/src/documents/tests/samples/barcodes/split-by-tag-basic.pdf differ diff --git a/src/documents/tests/samples/barcodes/split-by-tag-mixed-asn.pdf b/src/documents/tests/samples/barcodes/split-by-tag-mixed-asn.pdf new file mode 100644 index 0000000000..8bdca9ffc1 Binary files /dev/null and b/src/documents/tests/samples/barcodes/split-by-tag-mixed-asn.pdf differ diff --git a/src/documents/tests/samples/barcodes/split-by-tag-multiple-per-page.pdf b/src/documents/tests/samples/barcodes/split-by-tag-multiple-per-page.pdf new file mode 100644 index 0000000000..5c4d97c630 Binary files /dev/null and b/src/documents/tests/samples/barcodes/split-by-tag-multiple-per-page.pdf differ diff --git a/src/documents/tests/samples/documents/originals/0000004.pdf b/src/documents/tests/samples/documents/originals/0000004.pdf new file mode 100644 index 0000000000..953bb88ab8 Binary files /dev/null and b/src/documents/tests/samples/documents/originals/0000004.pdf differ diff --git a/src/documents/tests/samples/documents/originals/0000004.pdf.gpg b/src/documents/tests/samples/documents/originals/0000004.pdf.gpg deleted file mode 100644 index 754efcbf6f..0000000000 Binary files a/src/documents/tests/samples/documents/originals/0000004.pdf.gpg and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000004.webp b/src/documents/tests/samples/documents/thumbnails/0000004.webp new file mode 100644 index 0000000000..a7ff623b24 Binary files /dev/null and b/src/documents/tests/samples/documents/thumbnails/0000004.webp differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg b/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg deleted file mode 100644 index 3abc69d360..0000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg and /dev/null differ diff --git a/src/documents/tests/samples/malicious.svg b/src/documents/tests/samples/malicious.svg deleted file mode 100644 index 11fb65821a..0000000000 --- a/src/documents/tests/samples/malicious.svg +++ /dev/null @@ -1,4 +0,0 @@ - - Hello - - diff --git a/src/documents/tests/test_admin.py b/src/documents/tests/test_admin.py index 61a579dc74..de2f07df54 100644 --- a/src/documents/tests/test_admin.py +++ b/src/documents/tests/test_admin.py @@ -27,7 +27,7 @@ def setUp(self) -> None: super().setUp() self.doc_admin = DocumentAdmin(model=Document, admin_site=AdminSite()) - def test_save_model(self): + def test_save_model(self) -> None: doc = Document.objects.create(title="test") doc.title = "new title" @@ -35,7 +35,7 @@ def test_save_model(self): self.assertEqual(Document.objects.get(id=doc.id).title, "new title") self.assertEqual(self.get_document_from_index(doc)["id"], doc.id) - def test_delete_model(self): + def test_delete_model(self) -> None: doc = Document.objects.create(title="test") index.add_or_update_document(doc) self.assertIsNotNone(self.get_document_from_index(doc)) @@ -45,7 +45,7 @@ def test_delete_model(self): self.assertRaises(Document.DoesNotExist, Document.objects.get, id=doc.id) self.assertIsNone(self.get_document_from_index(doc)) - def test_delete_queryset(self): + def test_delete_queryset(self) -> None: docs = [] for i in range(42): doc = Document.objects.create( @@ -67,7 +67,7 @@ def test_delete_queryset(self): for doc in docs: self.assertIsNone(self.get_document_from_index(doc)) - def test_created(self): + def test_created(self) -> None: doc = Document.objects.create( title="test", created=timezone.make_aware(timezone.datetime(2020, 4, 12)), @@ -98,7 +98,7 @@ def setUp(self) -> None: super().setUp() self.user_admin = PaperlessUserAdmin(model=User, admin_site=AdminSite()) - def test_request_is_passed_to_form(self): + def test_request_is_passed_to_form(self) -> None: user = User.objects.create(username="test", is_superuser=False) non_superuser = User.objects.create(username="requestuser") request = types.SimpleNamespace(user=non_superuser) @@ -106,7 +106,7 @@ def test_request_is_passed_to_form(self): form = formType(data={}, instance=user) self.assertEqual(form.request, request) - def test_only_superuser_can_change_superuser(self): + def test_only_superuser_can_change_superuser(self) -> None: superuser = User.objects.create_superuser(username="superuser", password="test") non_superuser = User.objects.create(username="requestuser") user = User.objects.create(username="test", is_superuser=False) @@ -128,7 +128,7 @@ def test_only_superuser_can_change_superuser(self): self.assertTrue(form.is_valid()) self.assertEqual({}, form.errors) - def test_superuser_can_only_be_modified_by_superuser(self): + def test_superuser_can_only_be_modified_by_superuser(self) -> None: superuser = User.objects.create_superuser(username="superuser", password="test") user = User.objects.create( username="test", diff --git a/src/documents/tests/test_api_app_config.py b/src/documents/tests/test_api_app_config.py index 750aeddbfd..b946bc1bf3 100644 --- a/src/documents/tests/test_api_app_config.py +++ b/src/documents/tests/test_api_app_config.py @@ -1,8 +1,11 @@ import json +from io import BytesIO from pathlib import Path +from unittest.mock import patch from django.contrib.auth.models import User from django.core.files.uploadedfile import SimpleUploadedFile +from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase @@ -20,7 +23,7 @@ def setUp(self) -> None: user = User.objects.create_superuser(username="temp_admin") self.client.force_authenticate(user=user) - def test_api_get_config(self): + def test_api_get_config(self) -> None: """ GIVEN: - API request to get app config @@ -65,10 +68,18 @@ def test_api_get_config(self): "barcode_max_pages": None, "barcode_enable_tag": None, "barcode_tag_mapping": None, + "barcode_tag_split": None, + "ai_enabled": False, + "llm_embedding_backend": None, + "llm_embedding_model": None, + "llm_backend": None, + "llm_model": None, + "llm_api_key": None, + "llm_endpoint": None, }, ) - def test_api_get_ui_settings_with_config(self): + def test_api_get_ui_settings_with_config(self) -> None: """ GIVEN: - Existing config with app_title, app_logo specified @@ -91,7 +102,7 @@ def test_api_get_ui_settings_with_config(self): | response.data["settings"], ) - def test_api_update_config(self): + def test_api_update_config(self) -> None: """ GIVEN: - API request to update app config @@ -114,7 +125,7 @@ def test_api_update_config(self): config = ApplicationConfiguration.objects.first() self.assertEqual(config.color_conversion_strategy, ColorConvertChoices.RGB) - def test_api_update_config_empty_fields(self): + def test_api_update_config_empty_fields(self) -> None: """ GIVEN: - API request to update app config with empty string for user_args JSONField and language field @@ -141,7 +152,7 @@ def test_api_update_config_empty_fields(self): self.assertEqual(config.language, None) self.assertEqual(config.barcode_tag_mapping, None) - def test_api_replace_app_logo(self): + def test_api_replace_app_logo(self) -> None: """ GIVEN: - Existing config with app_logo specified @@ -190,7 +201,7 @@ def test_api_replace_app_logo(self): ) self.assertFalse(Path(old_logo.path).exists()) - def test_api_rejects_malicious_svg_logo(self): + def test_api_rejects_malicious_svg_logo(self) -> None: """ GIVEN: - An SVG logo containing a

      Some Text

      Has to be rewritten to work.. - This image should not be shown. + This image should not be shown.

      and an embedded image.
      diff --git a/src/paperless_mail/tests/samples/sample.html b/src/paperless_mail/tests/samples/sample.html index 584cd5d640..9d535dba64 100644 --- a/src/paperless_mail/tests/samples/sample.html +++ b/src/paperless_mail/tests/samples/sample.html @@ -6,7 +6,7 @@

      Some Text

      Has to be rewritten to work.. - This image should not be shown. + This image should not be shown.

      and an embedded image.
      diff --git a/src/paperless_mail/tests/test_api.py b/src/paperless_mail/tests/test_api.py index dd63c67abf..ce3668f7a6 100644 --- a/src/paperless_mail/tests/test_api.py +++ b/src/paperless_mail/tests/test_api.py @@ -21,7 +21,7 @@ class TestAPIMailAccounts(DirectoriesMixin, APITestCase): ENDPOINT = "/api/mail_accounts/" - def setUp(self): + def setUp(self) -> None: self.bogus_mailbox = BogusMailBox() patcher = mock.patch("paperless_mail.mail.MailBox") @@ -36,7 +36,7 @@ def setUp(self): self.user.save() self.client.force_authenticate(user=self.user) - def test_get_mail_accounts(self): + def test_get_mail_accounts(self) -> None: """ GIVEN: - Configured mail accounts @@ -73,7 +73,7 @@ def test_get_mail_accounts(self): self.assertEqual(returned_account1["imap_security"], account1.imap_security) self.assertEqual(returned_account1["character_set"], account1.character_set) - def test_create_mail_account(self): + def test_create_mail_account(self) -> None: """ WHEN: - API request is made to add a mail account @@ -108,7 +108,7 @@ def test_create_mail_account(self): self.assertEqual(returned_account1.imap_security, account1["imap_security"]) self.assertEqual(returned_account1.character_set, account1["character_set"]) - def test_delete_mail_account(self): + def test_delete_mail_account(self) -> None: """ GIVEN: - Existing mail account @@ -136,7 +136,7 @@ def test_delete_mail_account(self): self.assertEqual(len(MailAccount.objects.all()), 0) - def test_update_mail_account(self): + def test_update_mail_account(self) -> None: """ GIVEN: - Existing mail accounts @@ -184,7 +184,7 @@ def test_update_mail_account(self): self.assertEqual(returned_account2.name, "Updated Name 2") self.assertEqual(returned_account2.password, "123xyz") - def test_mail_account_test_fail(self): + def test_mail_account_test_fail(self) -> None: """ GIVEN: - Errnoeous mail account details @@ -210,7 +210,7 @@ def test_mail_account_test_fail(self): self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - def test_mail_account_test_success(self): + def test_mail_account_test_success(self) -> None: """ GIVEN: - Working mail account details @@ -236,7 +236,7 @@ def test_mail_account_test_success(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["success"], True) - def test_mail_account_test_existing(self): + def test_mail_account_test_existing(self) -> None: """ GIVEN: - Testing server details for an existing account with obfuscated password (***) @@ -272,7 +272,25 @@ def test_mail_account_test_existing(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["success"], True) - def test_get_mail_accounts_owner_aware(self): + def test_mail_account_test_existing_nonexistent_id_forbidden(self) -> None: + response = self.client.post( + f"{self.ENDPOINT}test/", + json.dumps( + { + "id": 999999, + "imap_server": "server.example.com", + "imap_port": 443, + "imap_security": MailAccount.ImapSecurity.SSL, + "username": "admin", + "password": "******", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content.decode(), "Insufficient permissions") + + def test_get_mail_accounts_owner_aware(self) -> None: """ GIVEN: - Configured accounts with different users @@ -343,7 +361,7 @@ def test_get_mail_accounts_owner_aware(self): class TestAPIMailRules(DirectoriesMixin, APITestCase): ENDPOINT = "/api/mail_rules/" - def setUp(self): + def setUp(self) -> None: super().setUp() self.user = User.objects.create_user(username="temp_admin") @@ -351,7 +369,7 @@ def setUp(self): self.user.save() self.client.force_authenticate(user=self.user) - def test_get_mail_rules(self): + def test_get_mail_rules(self) -> None: """ GIVEN: - Configured mail accounts and rules @@ -415,7 +433,7 @@ def test_get_mail_rules(self): self.assertEqual(returned_rule1["order"], rule1.order) self.assertEqual(returned_rule1["attachment_type"], rule1.attachment_type) - def test_create_mail_rule(self): + def test_create_mail_rule(self) -> None: """ GIVEN: - Configured mail account exists @@ -520,7 +538,7 @@ def test_create_mail_rule(self): rule1["assign_owner_from_rule"], ) - def test_delete_mail_rule(self): + def test_delete_mail_rule(self) -> None: """ GIVEN: - Existing mail rule @@ -564,7 +582,7 @@ def test_delete_mail_rule(self): self.assertEqual(len(MailRule.objects.all()), 0) - def test_update_mail_rule(self): + def test_update_mail_rule(self) -> None: """ GIVEN: - Existing mail rule @@ -614,7 +632,7 @@ def test_update_mail_rule(self): self.assertEqual(returned_rule1.name, "Updated Name 1") self.assertEqual(returned_rule1.action, MailRule.MailAction.DELETE) - def test_get_mail_rules_owner_aware(self): + def test_get_mail_rules_owner_aware(self) -> None: """ GIVEN: - Configured rules with different users @@ -683,7 +701,7 @@ def test_get_mail_rules_owner_aware(self): self.assertEqual(response.data["results"][1]["name"], rule2.name) self.assertEqual(response.data["results"][2]["name"], rule4.name) - def test_mailrule_maxage_validation(self): + def test_mailrule_maxage_validation(self) -> None: """ GIVEN: - An existing mail account @@ -728,7 +746,7 @@ def test_mailrule_maxage_validation(self): class TestAPIProcessedMails(DirectoriesMixin, APITestCase): ENDPOINT = "/api/processed_mail/" - def setUp(self): + def setUp(self) -> None: super().setUp() self.user = User.objects.create_user(username="temp_admin") @@ -736,7 +754,7 @@ def setUp(self): self.user.save() self.client.force_authenticate(user=self.user) - def test_get_processed_mails_owner_aware(self): + def test_get_processed_mails_owner_aware(self) -> None: """ GIVEN: - Configured processed mails with different users @@ -821,7 +839,7 @@ def test_get_processed_mails_owner_aware(self): returned_ids = {r["id"] for r in response.data["results"]} self.assertSetEqual(returned_ids, {pm1.id, pm2.id, pm4.id}) - def test_get_processed_mails_filter_by_rule(self): + def test_get_processed_mails_filter_by_rule(self) -> None: """ GIVEN: - Processed mails belonging to two different rules @@ -893,7 +911,7 @@ def test_get_processed_mails_filter_by_rule(self): returned_ids = {r["id"] for r in response.data["results"]} self.assertSetEqual(returned_ids, {pm1.id, pm2.id}) - def test_bulk_delete_processed_mails(self): + def test_bulk_delete_processed_mails(self) -> None: """ GIVEN: - Processed mails belonging to two different rules and different users diff --git a/src/paperless_mail/tests/test_live_mail.py b/src/paperless_mail/tests/test_live_mail.py index ecf9f73b65..cfd7f88d0f 100644 --- a/src/paperless_mail/tests/test_live_mail.py +++ b/src/paperless_mail/tests/test_live_mail.py @@ -1,6 +1,3 @@ -import os -import warnings - import pytest from paperless_mail.mail import MailAccountHandler @@ -9,53 +6,53 @@ 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( - "PAPERLESS_MAIL_TEST_HOST" not in os.environ - or not len(os.environ["PAPERLESS_MAIL_TEST_HOST"]), - reason="Live server testing not enabled", -) -@pytest.mark.django_db() -class TestMailLiveServer: - def test_process_non_gmail_server_flag( +@pytest.mark.live +@pytest.mark.greenmail +@pytest.mark.django_db +class TestMailGreenmail: + """ + Mail tests using local Greenmail server + """ + + def test_process_flag( self, mail_account_handler: MailAccountHandler, - live_mail_account: MailAccount, - ): - try: - rule1 = MailRule.objects.create( - name="testrule", - account=live_mail_account, - action=MailRule.MailAction.FLAG, - ) - - mail_account_handler.handle_mail_account(live_mail_account) - - rule1.delete() + greenmail_mail_account: MailAccount, + ) -> None: + """ + Test processing mail with FLAG action. + """ + rule = MailRule.objects.create( + name="testrule", + account=greenmail_mail_account, + action=MailRule.MailAction.FLAG, + ) + try: + mail_account_handler.handle_mail_account(greenmail_mail_account) except MailError as e: pytest.fail(f"Failure: {e}") - except Exception as e: - warnings.warn(f"Unhandled exception: {e}") + finally: + rule.delete() - def test_process_non_gmail_server_tag( + def test_process_tag( self, mail_account_handler: MailAccountHandler, - live_mail_account: MailAccount, - ): - try: - rule2 = MailRule.objects.create( - name="testrule", - account=live_mail_account, - action=MailRule.MailAction.TAG, - ) - - mail_account_handler.handle_mail_account(live_mail_account) - - rule2.delete() + greenmail_mail_account: MailAccount, + ) -> None: + """ + Test processing mail with TAG action. + """ + rule = MailRule.objects.create( + name="testrule", + account=greenmail_mail_account, + action=MailRule.MailAction.TAG, + action_parameter="TestTag", + ) + try: + mail_account_handler.handle_mail_account(greenmail_mail_account) except MailError as e: pytest.fail(f"Failure: {e}") - except Exception as e: - warnings.warn(f"Unhandled exception: {e}") + finally: + rule.delete() diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 70f7be50fb..72ee5331ab 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -1,6 +1,5 @@ import dataclasses import email.contentmanager -import random import time import uuid from collections import namedtuple @@ -9,6 +8,7 @@ from unittest import mock import pytest +from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.core.management import call_command from django.db import DatabaseError @@ -51,30 +51,30 @@ class _AttachmentDef: class BogusFolderManager: current_folder = "INBOX" - def set(self, new_folder): + def set(self, new_folder) -> None: if new_folder not in ["INBOX", "spam"]: raise MailboxFolderSelectError(None, "uhm") self.current_folder = new_folder class BogusClient: - def __init__(self, messages): + def __init__(self, messages) -> None: self.messages: list[MailMessage] = messages self.capabilities: list[str] = [] def __enter__(self): return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type, exc_val, exc_tb) -> None: pass - def authenticate(self, mechanism, authobject): + def authenticate(self, mechanism, authobject) -> None: # authobject must be a callable object auth_bytes = authobject(None) if auth_bytes != b"\x00admin\x00w57\xc3\xa4\xc3\xb6\xc3\xbcw4b6huwb6nhu": raise MailboxLoginError("BAD", "OK") - def uid(self, command, *args): + def uid(self, command, *args) -> None: if command == "STORE": for message in self.messages: if message.uid == args[0]: @@ -94,7 +94,7 @@ class BogusMailBox(AbstractContextManager): # A dummy access token ACCESS_TOKEN = "ea7e075cd3acf2c54c48e600398d5d5a" - def __init__(self): + def __init__(self) -> None: self.messages: list[MailMessage] = [] self.messages_spam: list[MailMessage] = [] self.folder = BogusFolderManager() @@ -104,25 +104,25 @@ def __init__(self): def __enter__(self): return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type, exc_val, exc_tb) -> None: pass - def updateClient(self): + def updateClient(self) -> None: self.client = BogusClient(self.messages) - def login(self, username, password): + def login(self, username, password) -> None: # This will raise a UnicodeEncodeError if the password is not ASCII only password.encode("ascii") # Otherwise, check for correct values if username != self.USERNAME or password != self.ASCII_PASSWORD: raise MailboxLoginError("BAD", "OK") - def login_utf8(self, username, password): + def login_utf8(self, username, password) -> None: # Expected to only be called with the UTF-8 password if username != self.USERNAME or password != self.UTF_PASSWORD: raise MailboxLoginError("BAD", "OK") - def xoauth2(self, username: str, access_token: str): + def xoauth2(self, username: str, access_token: str) -> None: if username != self.USERNAME or access_token != self.ACCESS_TOKEN: raise MailboxLoginError("BAD", "OK") @@ -148,11 +148,7 @@ def fetch(self, criteria, mark_seen, charset="", *, bulk=True): if "TO" in criteria: to_ = criteria[criteria.index("TO") + 1].strip('"') - msg = [] - for m in self.messages: - for to_addrs in m.to: - if to_ in to_addrs: - msg.append(m) + msg = filter(lambda m: any(to_ in to_addr for to_addr in m.to), msg) if "UNFLAGGED" in criteria: msg = filter(lambda m: not m.flagged, msg) @@ -166,10 +162,10 @@ def fetch(self, criteria, mark_seen, charset="", *, bulk=True): return list(msg) - def delete(self, uid_list): + def delete(self, uid_list) -> None: self.messages = list(filter(lambda m: m.uid not in uid_list, self.messages)) - def flag(self, uid_list, flag_set, value): + def flag(self, uid_list, flag_set, value) -> None: for message in self.messages: if message.uid in uid_list: for flag in flag_set: @@ -182,7 +178,7 @@ def flag(self, uid_list, flag_set, value): if hasattr(message, "flags"): del message.flags - def move(self, uid_list, folder): + def move(self, uid_list, folder) -> None: if folder == "spam": self.messages_spam += list( filter(lambda m: m.uid in uid_list, self.messages), @@ -203,8 +199,8 @@ def fake_magic_from_buffer(buffer, *, mime=False): class MessageBuilder: - def __init__(self): - self._used_uids = set() + def __init__(self) -> None: + self._next_uid = 1 def create_message( self, @@ -257,10 +253,8 @@ def create_message( # TODO: Unsure how to add a uid to the actual EmailMessage. This hacks it in, # based on how imap_tools uses regex to extract it. # This should be a large enough pool - uid = random.randint(1, 10000) - while uid in self._used_uids: - uid = random.randint(1, 10000) - self._used_uids.add(uid) + uid = self._next_uid + self._next_uid += 1 imap_msg._raw_uid_data = f"UID {uid}".encode() @@ -274,7 +268,10 @@ def create_message( return imap_msg -def reset_bogus_mailbox(bogus_mailbox: BogusMailBox, message_builder: MessageBuilder): +def reset_bogus_mailbox( + bogus_mailbox: BogusMailBox, + message_builder: MessageBuilder, +) -> None: bogus_mailbox.messages = [] bogus_mailbox.messages_spam = [] bogus_mailbox.messages.append( @@ -310,7 +307,7 @@ def reset_bogus_mailbox(bogus_mailbox: BogusMailBox, message_builder: MessageBui class MailMocker(DirectoriesMixin, FileSystemAssertsMixin, TestCase): - def setUp(self): + def setUp(self) -> None: self.bogus_mailbox = BogusMailBox() self.messageBuilder = MessageBuilder() @@ -330,7 +327,7 @@ def setUp(self): def assert_queue_consumption_tasks_call_args( self, expected_call_args: list[list[dict[str, str]]], - ): + ) -> None: """ Verifies that queue_consumption_tasks has been called with the expected arguments. @@ -377,7 +374,7 @@ def assert_queue_consumption_tasks_call_args( else: self.fail("No match for expected arg") - def apply_mail_actions(self): + def apply_mail_actions(self) -> None: """ Applies pending actions to mails by inspecting calls to the queue_consumption_tasks method. """ @@ -387,7 +384,12 @@ def apply_mail_actions(self): apply_mail_action([], rule.pk, message.uid, message.subject, message.date) -def assert_eventually_equals(getter_fn, expected_value, timeout=1.0, interval=0.05): +def assert_eventually_equals( + getter_fn, + expected_value, + timeout=1.0, + interval=0.05, +) -> None: """ Repeatedly calls `getter_fn()` until the result equals `expected_value`, or times out after `timeout` seconds. @@ -395,7 +397,7 @@ def assert_eventually_equals(getter_fn, expected_value, timeout=1.0, interval=0. deadline = time.time() + timeout while time.time() < deadline: if getter_fn() == expected_value: - return + return None time.sleep(interval) actual = getter_fn() raise AssertionError(f"Expected {expected_value}, but got {actual}") @@ -407,14 +409,14 @@ class TestMail( FileSystemAssertsMixin, TestCase, ): - def setUp(self): + def setUp(self) -> None: self.mailMocker = MailMocker() self.mailMocker.setUp() self.mail_account_handler = MailAccountHandler() super().setUp() - def test_get_correspondent(self): + def test_get_correspondent(self) -> None: message = namedtuple("MailMessage", []) message.from_ = "someone@somewhere.com" message.from_values = EmailAddress( @@ -473,7 +475,7 @@ def test_get_correspondent(self): c = handler._get_correspondent(message, rule) self.assertEqual(c, someone_else) - def test_get_title(self): + def test_get_title(self) -> None: message = namedtuple("MailMessage", []) message.subject = "the message title" att = namedtuple("Attachment", []) @@ -497,7 +499,7 @@ def test_get_title(self): ) self.assertEqual(handler._get_title(message, att, rule), None) - def test_handle_message(self): + def test_handle_message(self) -> None: message = self.mailMocker.messageBuilder.create_message( subject="the message title", from_="Myself", @@ -526,7 +528,7 @@ def test_handle_message(self): ], ) - def test_handle_empty_message(self): + def test_handle_empty_message(self) -> None: message = namedtuple("MailMessage", []) message.attachments = [] @@ -537,7 +539,7 @@ def test_handle_empty_message(self): self.mailMocker._queue_consumption_tasks_mock.assert_not_called() self.assertEqual(result, 0) - def test_handle_unknown_mime_type(self): + def test_handle_unknown_mime_type(self) -> None: message = self.mailMocker.messageBuilder.create_message( attachments=[ _AttachmentDef(filename="f1.pdf"), @@ -566,7 +568,7 @@ def test_handle_unknown_mime_type(self): ], ) - def test_handle_disposition(self): + def test_handle_disposition(self) -> None: message = self.mailMocker.messageBuilder.create_message( attachments=[ _AttachmentDef( @@ -594,7 +596,7 @@ def test_handle_disposition(self): ], ) - def test_handle_inline_files(self): + def test_handle_inline_files(self) -> None: message = self.mailMocker.messageBuilder.create_message( attachments=[ _AttachmentDef( @@ -624,7 +626,7 @@ def test_handle_inline_files(self): ], ) - def test_filename_filter(self): + def test_filename_filter(self) -> None: """ GIVEN: - Email with multiple similar named attachments @@ -745,7 +747,7 @@ class FilterTestCase: ) @pytest.mark.flaky(reruns=4) - def test_filename_filter_inline_no_consumption(self): + def test_filename_filter_inline_no_consumption(self) -> None: """ GIVEN: - Rule that processes all attachments but filters by filename @@ -787,7 +789,7 @@ def test_filename_filter_inline_no_consumption(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 1) - def test_handle_mail_account_mark_read(self): + def test_handle_mail_account_mark_read(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -816,7 +818,8 @@ def test_handle_mail_account_mark_read(self): ) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) - def test_handle_mail_account_delete(self): + @pytest.mark.flaky(reruns=4) + def test_handle_mail_account_delete(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -838,7 +841,7 @@ def test_handle_mail_account_delete(self): assert_eventually_equals(lambda: len(self.mailMocker.bogus_mailbox.messages), 1) - def test_handle_mail_account_delete_no_filters(self): + def test_handle_mail_account_delete_no_filters(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -860,8 +863,84 @@ def test_handle_mail_account_delete_no_filters(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 0) + def test_handle_mail_account_overlapping_rules_only_first_consumes(self) -> None: + """ + GIVEN: + - Multiple rules that match the same mail + WHEN: + - Mail account is processed + THEN: + - Only the first rule should be applied + """ + account = MailAccount.objects.create( + name="test", + imap_server="", + username="admin", + password="secret", + ) + + first_rule = MailRule.objects.create( + name="testrule-first", + account=account, + action=MailRule.MailAction.DELETE, + filter_subject="Claim", + order=1, + ) + _ = MailRule.objects.create( + name="testrule-second", + account=account, + action=MailRule.MailAction.DELETE, + filter_subject="Claim", + order=2, + ) + + self.mail_account_handler.handle_mail_account(account) + self.mailMocker.apply_mail_actions() + + self.assertEqual(self.mailMocker._queue_consumption_tasks_mock.call_count, 1) + queued_rule = self.mailMocker._queue_consumption_tasks_mock.call_args.kwargs[ + "rule" + ] + self.assertEqual(queued_rule.id, first_rule.id) + + def test_handle_mail_account_skip_duplicate_uids_from_fetch(self) -> None: + """ + GIVEN: + - Multiple mails with the same UID returned from the mailbox fetch method + WHEN: + - Mail account is processed + THEN: + - Only one of the mails should be processed, to avoid duplicate processing due to fetch issues + """ + account = MailAccount.objects.create( + name="test", + imap_server="", + username="admin", + password="secret", + ) + _ = MailRule.objects.create( + name="testrule", + account=account, + action=MailRule.MailAction.DELETE, + filter_subject="Duplicated mail", + ) + + duplicated_message = self.mailMocker.messageBuilder.create_message( + subject="Duplicated mail", + ) + self.mailMocker.bogus_mailbox.messages = [ + duplicated_message, + duplicated_message, + ] + self.mailMocker.bogus_mailbox.updateClient() + + self.mail_account_handler.handle_mail_account(account) + self.mailMocker.apply_mail_actions() + + self.assertEqual(self.mailMocker._queue_consumption_tasks_mock.call_count, 1) + @pytest.mark.flaky(reruns=4) - def test_handle_mail_account_flag(self): + def test_handle_mail_account_flag(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -892,7 +971,7 @@ def test_handle_mail_account_flag(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) @pytest.mark.flaky(reruns=4) - def test_handle_mail_account_move(self): + def test_handle_mail_account_move(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -917,7 +996,7 @@ def test_handle_mail_account_move(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 2) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages_spam), 1) - def test_handle_mail_account_move_no_filters(self): + def test_handle_mail_account_move_no_filters(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -942,7 +1021,7 @@ def test_handle_mail_account_move_no_filters(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 0) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages_spam), 3) - def test_handle_mail_account_tag(self): + def test_handle_mail_account_tag(self) -> None: account = MailAccount.objects.create( name="test", imap_server="", @@ -982,7 +1061,7 @@ def test_handle_mail_account_tag(self): 0, ) - def test_handle_mail_account_tag_gmail(self): + def test_handle_mail_account_tag_gmail(self) -> None: self.mailMocker.bogus_mailbox._host = "imap.gmail.com" self.mailMocker.bogus_mailbox.client.capabilities = ["X-GM-EXT-1"] @@ -1016,7 +1095,7 @@ def test_handle_mail_account_tag_gmail(self): ) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) - def test_tag_mail_action_applemail_wrong_input(self): + def test_tag_mail_action_applemail_wrong_input(self) -> None: self.assertRaises( MailError, TagMailAction, @@ -1024,7 +1103,7 @@ def test_tag_mail_action_applemail_wrong_input(self): supports_gmail_labels=False, ) - def test_handle_mail_account_tag_applemail(self): + def test_handle_mail_account_tag_applemail(self) -> None: # all mails will be FLAGGED afterwards account = MailAccount.objects.create( @@ -1056,7 +1135,7 @@ def test_handle_mail_account_tag_applemail(self): ) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) - def test_error_login(self): + def test_error_login(self) -> None: """ GIVEN: - Account configured with incorrect password @@ -1079,7 +1158,7 @@ def test_error_login(self): self.mail_account_handler.handle_mail_account(account) @pytest.mark.flaky(reruns=4) - def test_error_skip_account(self): + def test_error_skip_account(self) -> None: _ = MailAccount.objects.create( name="test", imap_server="", @@ -1107,7 +1186,8 @@ def test_error_skip_account(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 2) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages_spam), 1) - def test_error_skip_rule(self): + @pytest.mark.flaky(reruns=4) + def test_error_skip_rule(self) -> None: account = MailAccount.objects.create( name="test2", imap_server="", @@ -1138,7 +1218,7 @@ def test_error_skip_rule(self): self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 2) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages_spam), 1) - def test_error_folder_set(self): + def test_error_folder_set(self) -> None: """ GIVEN: - Mail rule with non-existent folder @@ -1171,7 +1251,7 @@ def test_error_folder_set(self): self.mailMocker.bogus_mailbox.folder.list.assert_called_once() self.mailMocker._queue_consumption_tasks_mock.assert_not_called() - def test_error_folder_set_error_listing(self): + def test_error_folder_set_error_listing(self) -> None: """ GIVEN: - Mail rule with non-existent folder @@ -1206,8 +1286,8 @@ def test_error_folder_set_error_listing(self): @pytest.mark.flaky(reruns=4) @mock.patch("paperless_mail.mail.MailAccountHandler._get_correspondent") - def test_error_skip_mail(self, m): - def get_correspondent_fake(message, rule): + def test_error_skip_mail(self, m) -> None: + def get_correspondent_fake(message, rule) -> None: if message.from_ == "amazon@amazon.de": raise ValueError("Does not compute.") else: @@ -1241,7 +1321,7 @@ def get_correspondent_fake(message, rule): "amazon@amazon.de", ) - def test_error_create_correspondent(self): + def test_error_create_correspondent(self) -> None: account = MailAccount.objects.create( name="test2", imap_server="", @@ -1290,7 +1370,7 @@ def test_error_create_correspondent(self): ) @pytest.mark.flaky(reruns=4) - def test_filters(self): + def test_filters(self) -> None: account = MailAccount.objects.create( name="test3", imap_server="", @@ -1340,7 +1420,7 @@ def test_filters(self): expected_mail_count, ) - def test_auth_plain_fallback(self): + def test_auth_plain_fallback(self) -> None: """ GIVEN: - Mail account with password containing non-ASCII characters @@ -1380,7 +1460,7 @@ def test_auth_plain_fallback(self): ) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) - def test_auth_plain_fallback_fails_still(self): + def test_auth_plain_fallback_fails_still(self) -> None: """ GIVEN: - Mail account with password containing non-ASCII characters @@ -1411,7 +1491,7 @@ def test_auth_plain_fallback_fails_still(self): account, ) - def test_auth_with_valid_token(self): + def test_auth_with_valid_token(self) -> None: """ GIVEN: - Mail account configured with access token @@ -1452,7 +1532,7 @@ def test_auth_with_valid_token(self): ) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) - def test_disabled_rule(self): + def test_disabled_rule(self) -> None: """ GIVEN: - Mail rule is disabled @@ -1492,7 +1572,7 @@ def test_disabled_rule(self): class TestPostConsumeAction(TestCase): - def setUp(self): + def setUp(self) -> None: self.account = MailAccount.objects.create( name="test", imap_server="imap.test.com", @@ -1584,15 +1664,15 @@ class TestManagementCommand(TestCase): @mock.patch( "paperless_mail.management.commands.mail_fetcher.tasks.process_mail_accounts", ) - def test_mail_fetcher(self, m): - call_command("mail_fetcher") + def test_mail_fetcher(self, m) -> None: + call_command("mail_fetcher", skip_checks=True) m.assert_called_once() class TestTasks(TestCase): @mock.patch("paperless_mail.tasks.MailAccountHandler.handle_mail_account") - def test_all_accounts(self, m): + def test_all_accounts(self, m) -> None: m.side_effect = lambda account: 6 MailAccount.objects.create( @@ -1626,7 +1706,7 @@ def test_all_accounts(self, m): self.assertIn("No new", result) @mock.patch("paperless_mail.tasks.MailAccountHandler.handle_mail_account") - def test_accounts_no_enabled_rules(self, m): + def test_accounts_no_enabled_rules(self, m) -> None: m.side_effect = lambda account: 6 MailAccount.objects.create( @@ -1656,7 +1736,7 @@ def test_accounts_no_enabled_rules(self, m): self.assertEqual(m.call_count, 0) @mock.patch("paperless_mail.tasks.MailAccountHandler.handle_mail_account") - def test_process_with_account_ids(self, m): + def test_process_with_account_ids(self, m) -> None: m.side_effect = lambda account: 6 account_a = MailAccount.objects.create( @@ -1689,19 +1769,56 @@ def test_process_with_account_ids(self, m): result = tasks.process_mail_accounts(account_ids=[account_b.id]) self.assertIn("No new", result) + @mock.patch("paperless_mail.tasks.MailAccountHandler.handle_mail_account") + def test_rule_with_stop_processing(self, m): + """ + GIVEN: + - Mail account with a rule with stop_processing=True + WHEN: + - Mail account is processed + THEN: + - Should only process the first rule + """ + m.side_effect = lambda account: 6 + + account = MailAccount.objects.create( + name="A", + imap_server="A", + username="A", + password="A", + ) + MailRule.objects.create( + name="A", + account=account, + stop_processing=True, + ) + MailRule.objects.create( + name="B", + account=account, + ) + + result = tasks.process_mail_accounts() + + self.assertEqual(m.call_count, 1) + self.assertIn("Added 6", result) + class TestMailAccountTestView(APITestCase): - def setUp(self): + def setUp(self) -> None: self.mailMocker = MailMocker() self.mailMocker.setUp() self.user = User.objects.create_user( username="testuser", password="testpassword", ) + self.user.user_permissions.add( + *Permission.objects.filter(codename__in=["add_mailaccount"]), + ) + self.user.save() self.client.force_authenticate(user=self.user) self.url = "/api/mail_accounts/test/" - def test_mail_account_test_view_success(self): + def test_mail_account_test_view_success(self) -> None: data = { "imap_server": "imap.example.com", "imap_port": 993, @@ -1715,7 +1832,7 @@ def test_mail_account_test_view_success(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data, {"success": True}) - def test_mail_account_test_view_mail_error(self): + def test_mail_account_test_view_mail_error(self) -> None: data = { "imap_server": "imap.example.com", "imap_port": 993, @@ -1774,8 +1891,8 @@ def test_mail_account_test_view_refresh_token( ) def test_mail_account_test_view_refresh_token_fails( self, - mock_mock_refresh_account_oauth_token, - ): + mock_mock_refresh_account_oauth_token: mock.MagicMock, + ) -> None: """ GIVEN: - Mail account with expired token @@ -1814,9 +1931,59 @@ def test_mail_account_test_view_refresh_token_fails( expected_str = "Unable to refresh oauth token" self.assertIn(expected_str, error_str) + def test_mail_account_test_view_existing_forbidden_for_other_owner(self) -> None: + other_user = User.objects.create_user( + username="otheruser", + password="testpassword", + ) + existing_account = MailAccount.objects.create( + name="Owned account", + imap_server="imap.example.com", + imap_port=993, + imap_security=MailAccount.ImapSecurity.SSL, + username="admin", + password="secret", + owner=other_user, + ) + data = { + "id": existing_account.id, + "imap_server": "imap.example.com", + "imap_port": 993, + "imap_security": MailAccount.ImapSecurity.SSL, + "username": "admin", + "password": "****", + "is_token": False, + } + + response = self.client.post(self.url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content.decode(), "Insufficient permissions") + + def test_mail_account_test_view_requires_add_permission_without_account_id( + self, + ) -> None: + self.user.user_permissions.remove( + *Permission.objects.filter(codename__in=["add_mailaccount"]), + ) + self.user.save() + data = { + "imap_server": "imap.example.com", + "imap_port": 993, + "imap_security": MailAccount.ImapSecurity.SSL, + "username": "admin", + "password": "secret", + "is_token": False, + } + + response = self.client.post(self.url, data, format="json") + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + self.assertEqual(response.content.decode(), "Insufficient permissions") + class TestMailAccountProcess(APITestCase): - def setUp(self): + def setUp(self) -> None: self.mailMocker = MailMocker() self.mailMocker.setUp() self.user = User.objects.create_superuser( @@ -1836,14 +2003,14 @@ def setUp(self): self.url = f"/api/mail_accounts/{self.account.pk}/process/" @mock.patch("paperless_mail.tasks.process_mail_accounts.delay") - def test_mail_account_process_view(self, m): + def test_mail_account_process_view(self, m) -> None: response = self.client.post(self.url) self.assertEqual(response.status_code, status.HTTP_200_OK) m.assert_called_once() class TestMailRuleAPI(APITestCase): - def setUp(self): + def setUp(self) -> None: self.user = User.objects.create_superuser( username="testuser", password="testpassword", @@ -1860,7 +2027,7 @@ def setUp(self): ) self.url = "/api/mail_rules/" - def test_create_mail_rule(self): + def test_create_mail_rule(self) -> None: """ GIVEN: - Valid data for creating a mail rule @@ -1882,7 +2049,7 @@ def test_create_mail_rule(self): rule = MailRule.objects.first() self.assertEqual(rule.name, "Test Rule") - def test_mail_rule_action_parameter_required_for_tag_or_move(self): + def test_mail_rule_action_parameter_required_for_tag_or_move(self) -> None: """ GIVEN: - Valid data for creating a mail rule without action_parameter diff --git a/src/paperless_mail/tests/test_mail_oauth.py b/src/paperless_mail/tests/test_mail_oauth.py index f8f28df65a..651094673f 100644 --- a/src/paperless_mail/tests/test_mail_oauth.py +++ b/src/paperless_mail/tests/test_mail_oauth.py @@ -1,7 +1,6 @@ from datetime import timedelta from unittest import mock -from django.conf import settings from django.contrib.auth.models import Permission from django.contrib.auth.models import User from django.test import TestCase @@ -16,6 +15,13 @@ from paperless_mail.oauth import PaperlessMailOAuth2Manager +@override_settings( + OAUTH_CALLBACK_BASE_URL="http://localhost:8000", + GMAIL_OAUTH_CLIENT_ID="test_gmail_client_id", + GMAIL_OAUTH_CLIENT_SECRET="test_gmail_client_secret", + OUTLOOK_OAUTH_CLIENT_ID="test_outlook_client_id", + OUTLOOK_OAUTH_CLIENT_SECRET="test_outlook_client_secret", +) class TestMailOAuth( TestCase, ): @@ -31,15 +37,9 @@ def setUp(self) -> None: self.user.save() self.client.force_login(self.user) self.mail_account_handler = MailAccountHandler() - # Mock settings - settings.OAUTH_CALLBACK_BASE_URL = "http://localhost:8000" - settings.GMAIL_OAUTH_CLIENT_ID = "test_gmail_client_id" - settings.GMAIL_OAUTH_CLIENT_SECRET = "test_gmail_client_secret" - settings.OUTLOOK_OAUTH_CLIENT_ID = "test_outlook_client_id" - settings.OUTLOOK_OAUTH_CLIENT_SECRET = "test_outlook_client_secret" super().setUp() - def test_generate_paths(self): + def test_generate_paths(self) -> None: """ GIVEN: - Mocked settings for OAuth callback and base URLs @@ -148,7 +148,7 @@ def test_oauth_callback_view_success( ) @mock.patch("httpx_oauth.oauth2.BaseOAuth2.get_access_token") - def test_oauth_callback_view_fails(self, mock_get_access_token): + def test_oauth_callback_view_fails(self, mock_get_access_token) -> None: """ GIVEN: - Mocked settings for Gmail and Outlook OAuth client IDs and secrets @@ -193,7 +193,7 @@ def test_oauth_callback_view_fails(self, mock_get_access_token): self.assertIn("Error getting access token: test_error", cm.output[0]) - def test_oauth_callback_view_insufficient_permissions(self): + def test_oauth_callback_view_insufficient_permissions(self) -> None: """ GIVEN: - Mocked settings for Gmail and Outlook OAuth client IDs and secrets @@ -223,7 +223,7 @@ def test_oauth_callback_view_insufficient_permissions(self): MailAccount.objects.filter(imap_server="outlook.office365.com").exists(), ) - def test_oauth_callback_view_no_code(self): + def test_oauth_callback_view_no_code(self) -> None: """ GIVEN: - Mocked settings for Gmail and Outlook OAuth client IDs and secrets @@ -244,7 +244,7 @@ def test_oauth_callback_view_no_code(self): MailAccount.objects.filter(imap_server="outlook.office365.com").exists(), ) - def test_oauth_callback_view_invalid_state(self): + def test_oauth_callback_view_invalid_state(self) -> None: """ GIVEN: - Mocked settings for Gmail and Outlook OAuth client IDs and secrets diff --git a/src/paperless_mail/tests/test_parsers.py b/src/paperless_mail/tests/test_parsers.py index 0d02b31073..9746731f83 100644 --- a/src/paperless_mail/tests/test_parsers.py +++ b/src/paperless_mail/tests/test_parsers.py @@ -6,6 +6,7 @@ import httpx import pytest from django.test.html import parse_html +from django.utils import timezone from pytest_django.fixtures import SettingsWrapper from pytest_httpx import HTTPXMock from pytest_mock import MockerFixture @@ -24,7 +25,7 @@ def test_parse_error_missing_file( self, mail_parser: MailDocumentParser, sample_dir: Path, - ): + ) -> None: """ GIVEN: - Fresh parser @@ -45,7 +46,7 @@ def test_parse_error_invalid_email( self, mail_parser: MailDocumentParser, broken_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh parser @@ -63,7 +64,7 @@ def test_parse_simple_text_email_file( self, mail_parser: MailDocumentParser, simple_txt_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh parser @@ -97,7 +98,7 @@ def test_extract_metadata_fail( self, caplog: pytest.LogCaptureFixture, mail_parser: MailDocumentParser, - ): + ) -> None: """ GIVEN: - Fresh start @@ -120,7 +121,7 @@ def test_extract_metadata( self, mail_parser: MailDocumentParser, simple_txt_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh start @@ -234,7 +235,7 @@ def test_get_thumbnail( mocker: MockerFixture, mail_parser: MailDocumentParser, simple_txt_email_file: Path, - ): + ) -> None: """ GIVEN: - An E-Mail was parsed @@ -271,7 +272,7 @@ def test_tika_parse_unsuccessful( self, httpx_mock: HTTPXMock, mail_parser: MailDocumentParser, - ): + ) -> None: """ GIVEN: - Fresh start @@ -287,7 +288,11 @@ def test_tika_parse_unsuccessful( parsed = mail_parser.tika_parse("None") assert parsed == "" - def test_tika_parse(self, httpx_mock: HTTPXMock, mail_parser: MailDocumentParser): + def test_tika_parse( + self, + httpx_mock: HTTPXMock, + mail_parser: MailDocumentParser, + ) -> None: """ GIVEN: - Fresh start @@ -314,7 +319,7 @@ def test_tika_parse_exception( self, httpx_mock: HTTPXMock, mail_parser: MailDocumentParser, - ): + ) -> None: """ GIVEN: - Fresh start @@ -334,7 +339,7 @@ def test_tika_parse_unreachable( self, settings: SettingsWrapper, mail_parser: MailDocumentParser, - ): + ) -> None: """ GIVEN: - Fresh start @@ -357,7 +362,7 @@ def test_parse_eml_simple( mocker: MockerFixture, mail_parser: MailDocumentParser, simple_txt_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh start @@ -403,7 +408,7 @@ def test_parse_eml_html( httpx_mock: HTTPXMock, mail_parser: MailDocumentParser, html_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh start @@ -457,7 +462,7 @@ def test_generate_pdf_parse_error( httpx_mock: HTTPXMock, mail_parser: MailDocumentParser, simple_txt_email_file: Path, - ): + ) -> None: """ GIVEN: - Fresh start @@ -477,7 +482,7 @@ def test_generate_pdf_simple_email( mail_parser: MailDocumentParser, simple_txt_email_file: Path, simple_txt_email_pdf_file: Path, - ): + ) -> None: """ GIVEN: - Simple text email with no HTML content @@ -505,7 +510,7 @@ def test_generate_pdf_html_email( mail_parser: MailDocumentParser, html_email_file: Path, html_email_pdf_file: Path, - ): + ) -> None: """ GIVEN: - email with HTML content @@ -545,7 +550,7 @@ def test_generate_pdf_html_email_html_to_pdf_failure( mail_parser: MailDocumentParser, html_email_file: Path, html_email_pdf_file: Path, - ): + ) -> None: """ GIVEN: - email with HTML content @@ -584,7 +589,7 @@ def test_generate_pdf_html_email_merge_failure( mail_parser: MailDocumentParser, html_email_file: Path, html_email_pdf_file: Path, - ): + ) -> None: """ GIVEN: - email with HTML content @@ -621,7 +626,7 @@ def test_mail_to_html( mail_parser: MailDocumentParser, html_email_file: Path, html_email_html_file: Path, - ): + ) -> None: """ GIVEN: - Email message with HTML content @@ -630,20 +635,21 @@ def test_mail_to_html( THEN: - Resulting HTML is as expected """ - mail = mail_parser.parse_file_to_message(html_email_file) - html_file = mail_parser.mail_to_html(mail) + with timezone.override("UTC"): + mail = mail_parser.parse_file_to_message(html_email_file) + html_file = mail_parser.mail_to_html(mail) - expected_html = parse_html(html_email_html_file.read_text()) - actual_html = parse_html(html_file.read_text()) + expected_html = parse_html(html_email_html_file.read_text()) + actual_html = parse_html(html_file.read_text()) - assert expected_html == actual_html + assert expected_html == actual_html def test_generate_pdf_from_mail( self, httpx_mock: HTTPXMock, mail_parser: MailDocumentParser, html_email_file: Path, - ): + ) -> None: """ GIVEN: - Email message with HTML content @@ -675,7 +681,7 @@ def test_generate_pdf_layout_options( mail_parser: MailDocumentParser, html_email_file: Path, html_email_pdf_file: Path, - ): + ) -> None: """ GIVEN: - Email message diff --git a/src/paperless_mail/tests/test_parsers_live.py b/src/paperless_mail/tests/test_parsers_live.py index 2c3ef262aa..8a9487c169 100644 --- a/src/paperless_mail/tests/test_parsers_live.py +++ b/src/paperless_mail/tests/test_parsers_live.py @@ -17,7 +17,7 @@ def extract_text(pdf_path: Path) -> str: """ Using pdftotext from poppler, extracts the text of a PDF into a file, - then reads the file contents and returns it + then reads the file contents and returns it. """ with tempfile.NamedTemporaryFile( mode="w+", @@ -38,82 +38,107 @@ def extract_text(pdf_path: Path) -> str: class MailAttachmentMock: - def __init__(self, payload, content_id): + def __init__(self, payload: bytes, content_id: str) -> None: self.payload = payload self.content_id = content_id self.content_type = "image/png" +@pytest.mark.live +@pytest.mark.nginx @pytest.mark.skipif( "PAPERLESS_CI_TEST" not in os.environ, reason="No Gotenberg/Tika servers to test with", ) -class TestUrlCanary: +class TestNginxService: """ - Verify certain URLs are still available so testing is valid still + Verify the local nginx server is responding correctly. + These tests validate that the test infrastructure is working properly + before running the actual parser tests that depend on HTTP resources. """ - # Wikimedia rejects requests without a browser-like User-Agent header and returns 403. - _WIKIMEDIA_HEADERS = { - "User-Agent": ( - "Mozilla/5.0 (X11; Linux x86_64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/123.0.0.0 Safari/537.36" - ), - } - - def test_online_image_exception_on_not_available(self): + def test_non_existent_resource_returns_404( + self, + nginx_base_url: str, + ) -> None: """ GIVEN: - - Fresh start + - Local nginx server is running WHEN: - - nonexistent image is requested + - A non-existent resource is requested THEN: - - An exception shall be thrown - """ - """ - A public image is used in the html sample file. We have no control - whether this image stays online forever, so here we check if we can detect if is not - available anymore. + - An HTTP 404 status code shall be returned """ + resp = httpx.get( + f"{nginx_base_url}/assets/non-existent.png", + timeout=5.0, + ) with pytest.raises(httpx.HTTPStatusError) as exec_info: - resp = httpx.get( - "https://upload.wikimedia.org/wikipedia/en/f/f7/nonexistent.png", - headers=self._WIKIMEDIA_HEADERS, - ) resp.raise_for_status() assert exec_info.value.response.status_code == httpx.codes.NOT_FOUND - def test_is_online_image_still_available(self): + def test_valid_resource_is_available( + self, + nginx_base_url: str, + ) -> None: """ GIVEN: - - Fresh start + - Local nginx server is running WHEN: - - A public image used in the html sample file is requested + - A valid test fixture resource is requested THEN: - - No exception shall be thrown - """ + - The resource shall be returned with HTTP 200 status code + - The response shall contain the expected content type """ - A public image is used in the html sample file. We have no control - whether this image stays online forever, so here we check if it is still there - """ - - # Now check the URL used in samples/sample.html resp = httpx.get( - "https://upload.wikimedia.org/wikipedia/en/f/f7/RickRoll.png", - headers=self._WIKIMEDIA_HEADERS, + f"{nginx_base_url}/assets/logo_full_white.svg", + timeout=5.0, ) resp.raise_for_status() + assert resp.status_code == httpx.codes.OK + assert "svg" in resp.headers.get("content-type", "").lower() + def test_server_connectivity( + self, + nginx_base_url: str, + ) -> None: + """ + GIVEN: + - Local test fixtures server should be running + WHEN: + - A request is made to the server root + THEN: + - The server shall respond without connection errors + """ + try: + resp = httpx.get( + nginx_base_url, + timeout=5.0, + follow_redirects=True, + ) + # We don't care about the status code, just that we can connect + assert resp.status_code in {200, 404, 403} + except httpx.ConnectError as e: + pytest.fail( + f"Cannot connect to nginx server at {nginx_base_url}. " + f"Ensure the nginx container is running via docker-compose.ci-test.yml. " + f"Error: {e}", + ) + + +@pytest.mark.live +@pytest.mark.gotenberg +@pytest.mark.tika +@pytest.mark.nginx @pytest.mark.skipif( "PAPERLESS_CI_TEST" not in os.environ, reason="No Gotenberg/Tika servers to test with", ) class TestParserLive: @staticmethod - def imagehash(file, hash_size=18): + def imagehash(file: Path, hash_size: int = 18) -> str: return f"{average_hash(Image.open(file), hash_size)}" def test_get_thumbnail( @@ -123,14 +148,15 @@ def test_get_thumbnail( simple_txt_email_file: Path, simple_txt_email_pdf_file: Path, simple_txt_email_thumbnail_file: Path, - ): + ) -> None: """ GIVEN: - - Fresh start + - A simple text email file + - Mocked PDF generation returning a known PDF WHEN: - - The Thumbnail is requested + - The thumbnail is requested THEN: - - The returned thumbnail image file is as expected + - The returned thumbnail image file shall match the expected hash """ mock_generate_pdf = mocker.patch( "paperless_mail.parsers.MailDocumentParser.generate_pdf", @@ -145,22 +171,28 @@ def test_get_thumbnail( assert self.imagehash(thumb) == self.imagehash( simple_txt_email_thumbnail_file, ), ( - f"Created Thumbnail {thumb} differs from expected file {simple_txt_email_thumbnail_file}" + f"Created thumbnail {thumb} differs from expected file " + f"{simple_txt_email_thumbnail_file}" ) - def test_tika_parse_successful(self, mail_parser: MailDocumentParser): + def test_tika_parse_successful(self, mail_parser: MailDocumentParser) -> None: """ GIVEN: - - Fresh start + - HTML content to parse + - Tika server is running WHEN: - - tika parsing is called + - Tika parsing is called THEN: - - a web request to tika shall be done and the reply es returned + - A web request to Tika shall be made + - The parsed text content shall be returned """ - html = '

      Some Text

      ' + html = ( + '' + "

      Some Text

      " + ) expected_text = "Some Text" - # Check successful parsing parsed = mail_parser.tika_parse(html) assert expected_text == parsed.strip() @@ -171,14 +203,17 @@ def test_generate_pdf_gotenberg_merging( html_email_file: Path, merged_pdf_first: Path, merged_pdf_second: Path, - ): + ) -> None: """ GIVEN: - - Intermediary pdfs to be merged + - Intermediary PDFs to be merged + - An HTML email file WHEN: - - pdf generation is requested with html file requiring merging of pdfs + - PDF generation is requested with HTML file requiring merging THEN: - - gotenberg is called to merge files and the resulting file is returned + - Gotenberg shall be called to merge files + - The resulting merged PDF shall be returned + - The merged PDF shall contain text from both source PDFs """ mock_generate_pdf_from_html = mocker.patch( "paperless_mail.parsers.MailDocumentParser.generate_pdf_from_html", @@ -211,16 +246,17 @@ def test_generate_pdf_from_mail( html_email_file: Path, html_email_pdf_file: Path, html_email_thumbnail_file: Path, - ): + ) -> None: """ GIVEN: - - Fresh start + - An HTML email file WHEN: - - pdf generation from simple eml file is requested + - PDF generation from the email file is requested THEN: - - Gotenberg is called and the resulting file is returned and look as expected. + - Gotenberg shall be called to generate the PDF + - The archive PDF shall contain the expected content + - The generated thumbnail shall match the expected image hash """ - util_call_with_backoff(mail_parser.parse, [html_email_file, "message/rfc822"]) # Check the archive PDF @@ -228,7 +264,7 @@ def test_generate_pdf_from_mail( archive_text = extract_text(archive_path) expected_archive_text = extract_text(html_email_pdf_file) - # Archive includes the HTML content, so use in + # Archive includes the HTML content assert expected_archive_text in archive_text # Check the thumbnail @@ -238,9 +274,12 @@ def test_generate_pdf_from_mail( ) generated_thumbnail_hash = self.imagehash(generated_thumbnail) - # The created pdf is not reproducible. But the converted image should always look the same. + # The created PDF is not reproducible, but the converted image + # should always look the same expected_hash = self.imagehash(html_email_thumbnail_file) assert generated_thumbnail_hash == expected_hash, ( - f"PDF looks different. Check if {generated_thumbnail} looks weird." + f"PDF thumbnail differs from expected. " + f"Generated: {generated_thumbnail}, " + f"Hash: {generated_thumbnail_hash} vs {expected_hash}" ) diff --git a/src/paperless_mail/tests/test_preprocessor.py b/src/paperless_mail/tests/test_preprocessor.py index 90df77ba8a..5d665831fe 100644 --- a/src/paperless_mail/tests/test_preprocessor.py +++ b/src/paperless_mail/tests/test_preprocessor.py @@ -1,5 +1,7 @@ import email import email.contentmanager +import shutil +import subprocess import tempfile from email.message import Message from email.mime.application import MIMEApplication @@ -19,7 +21,7 @@ class MessageEncryptor: - def __init__(self): + def __init__(self) -> None: self.gpg_home = tempfile.mkdtemp() self.gpg = gnupg.GPG(gnupghome=self.gpg_home) self._testUser = "testuser@example.com" @@ -34,6 +36,30 @@ def __init__(self): ) self.gpg.gen_key(input_data) + def cleanup(self) -> None: + """ + Kill the gpg-agent process and clean up the temporary GPG home directory. + + This uses gpgconf to properly terminate the agent, which is the officially + recommended cleanup method from the GnuPG project. python-gnupg does not + provide built-in cleanup methods as it's only a wrapper around the gpg CLI. + """ + # Kill the gpg-agent using the official GnuPG cleanup tool + try: + subprocess.run( + ["gpgconf", "--kill", "gpg-agent"], + env={"GNUPGHOME": self.gpg_home}, + check=False, + capture_output=True, + timeout=5, + ) + except (FileNotFoundError, subprocess.TimeoutExpired): + # gpgconf not found or hung - agent will timeout eventually + pass + + # Clean up the temporary directory + shutil.rmtree(self.gpg_home, ignore_errors=True) + @staticmethod def get_email_body_without_headers(email_message: Message) -> bytes: """ @@ -85,42 +111,54 @@ def encrypt(self, message): class TestMailMessageGpgDecryptor(TestMail): - def setUp(self): - self.messageEncryptor = MessageEncryptor() + @classmethod + def setUpClass(cls) -> None: + """Create GPG encryptor once for all tests in this class.""" + super().setUpClass() + cls.messageEncryptor = MessageEncryptor() + + @classmethod + def tearDownClass(cls) -> None: + """Clean up GPG resources after all tests complete.""" + if hasattr(cls, "messageEncryptor"): + cls.messageEncryptor.cleanup() + super().tearDownClass() + + def setUp(self) -> None: with override_settings( EMAIL_GNUPG_HOME=self.messageEncryptor.gpg_home, EMAIL_ENABLE_GPG_DECRYPTOR=True, ): super().setUp() - def test_preprocessor_is_able_to_run(self): + def test_preprocessor_is_able_to_run(self) -> None: with override_settings( EMAIL_GNUPG_HOME=self.messageEncryptor.gpg_home, EMAIL_ENABLE_GPG_DECRYPTOR=True, ): self.assertTrue(MailMessageDecryptor.able_to_run()) - def test_preprocessor_is_able_to_run2(self): + def test_preprocessor_is_able_to_run2(self) -> None: with override_settings( EMAIL_GNUPG_HOME=None, EMAIL_ENABLE_GPG_DECRYPTOR=True, ): self.assertTrue(MailMessageDecryptor.able_to_run()) - def test_is_not_able_to_run_disabled(self): + def test_is_not_able_to_run_disabled(self) -> None: with override_settings( EMAIL_ENABLE_GPG_DECRYPTOR=False, ): self.assertFalse(MailMessageDecryptor.able_to_run()) - def test_is_not_able_to_run_bogus_path(self): + def test_is_not_able_to_run_bogus_path(self) -> None: with override_settings( EMAIL_ENABLE_GPG_DECRYPTOR=True, EMAIL_GNUPG_HOME="_)@# notapath &%#$", ): self.assertFalse(MailMessageDecryptor.able_to_run()) - def test_fails_at_initialization(self): + def test_fails_at_initialization(self) -> None: with ( mock.patch("gnupg.GPG.__init__") as mock_run, override_settings( @@ -136,17 +174,32 @@ def side_effect(*args, **kwargs): handler = MailAccountHandler() self.assertEqual(len(handler._message_preprocessors), 0) - def test_decrypt_fails(self): + def test_decrypt_fails(self) -> None: encrypted_message, _ = self.create_encrypted_unencrypted_message_pair() + # This test creates its own empty GPG home to test decryption failure empty_gpg_home = tempfile.mkdtemp() - with override_settings( - EMAIL_ENABLE_GPG_DECRYPTOR=True, - EMAIL_GNUPG_HOME=empty_gpg_home, - ): - message_decryptor = MailMessageDecryptor() - self.assertRaises(Exception, message_decryptor.run, encrypted_message) - - def test_decrypt_encrypted_mail(self): + try: + with override_settings( + EMAIL_ENABLE_GPG_DECRYPTOR=True, + EMAIL_GNUPG_HOME=empty_gpg_home, + ): + message_decryptor = MailMessageDecryptor() + self.assertRaises(Exception, message_decryptor.run, encrypted_message) + finally: + # Clean up the temporary GPG home used only by this test + try: + subprocess.run( + ["gpgconf", "--kill", "gpg-agent"], + env={"GNUPGHOME": empty_gpg_home}, + check=False, + capture_output=True, + timeout=5, + ) + except (FileNotFoundError, subprocess.TimeoutExpired): + pass + shutil.rmtree(empty_gpg_home, ignore_errors=True) + + def test_decrypt_encrypted_mail(self) -> None: """ Creates a mail with attachments. Then encrypts it with a new key. Verifies that this encrypted message can be decrypted with attachments intact. @@ -188,7 +241,7 @@ def create_encrypted_unencrypted_message_pair(self): encrypted_message = self.messageEncryptor.encrypt(message) return encrypted_message, message - def test_handle_encrypted_message(self): + def test_handle_encrypted_message(self) -> None: message = self.mailMocker.messageBuilder.create_message( subject="the message title", from_="Myself", diff --git a/src/paperless_mail/views.py b/src/paperless_mail/views.py index b54bcb5f71..b8ac2c4855 100644 --- a/src/paperless_mail/views.py +++ b/src/paperless_mail/views.py @@ -86,13 +86,34 @@ def test(self, request): request.data["name"] = datetime.datetime.now().isoformat() serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) + existing_account = None + account_id = request.data.get("id") - # account exists, use the password from there instead of *** and refresh_token / expiration + # testing a new connection requires add permission + if account_id is None and not request.user.has_perms( + ["paperless_mail.add_mailaccount"], + ): + return HttpResponseForbidden("Insufficient permissions") + + # testing an existing account requires change permission on that account + if account_id is not None: + try: + existing_account = MailAccount.objects.get(pk=account_id) + except (TypeError, ValueError, MailAccount.DoesNotExist): + return HttpResponseForbidden("Insufficient permissions") + + if not has_perms_owner_aware( + request.user, + "change_mailaccount", + existing_account, + ): + return HttpResponseForbidden("Insufficient permissions") + + # account exists, use the password from there instead of *** if ( len(serializer.validated_data.get("password").replace("*", "")) == 0 - and request.data["id"] is not None + and existing_account is not None ): - existing_account = MailAccount.objects.get(pk=request.data["id"]) serializer.validated_data["password"] = existing_account.password serializer.validated_data["account_type"] = existing_account.account_type serializer.validated_data["refresh_token"] = existing_account.refresh_token @@ -106,7 +127,8 @@ def test(self, request): ) as M: try: if ( - account.is_token + existing_account is not None + and account.is_token and account.expiration is not None and account.expiration < timezone.now() ): @@ -248,6 +270,7 @@ def get(self, request, format=None): imap_server=imap_server, refresh_token=refresh_token, expiration=timezone.now() + timedelta(seconds=expires_in), + owner=request.user, defaults=defaults, ) return HttpResponseRedirect( diff --git a/src/paperless_remote/__init__.py b/src/paperless_remote/__init__.py new file mode 100644 index 0000000000..5380ea5ac8 --- /dev/null +++ b/src/paperless_remote/__init__.py @@ -0,0 +1,4 @@ +# this is here so that django finds the checks. +from paperless_remote.checks import check_remote_parser_configured + +__all__ = ["check_remote_parser_configured"] diff --git a/src/paperless_remote/apps.py b/src/paperless_remote/apps.py new file mode 100644 index 0000000000..1997b0ae9b --- /dev/null +++ b/src/paperless_remote/apps.py @@ -0,0 +1,14 @@ +from django.apps import AppConfig + +from paperless_remote.signals import remote_consumer_declaration + + +class PaperlessRemoteParserConfig(AppConfig): + name = "paperless_remote" + + def ready(self) -> None: + from documents.signals import document_consumer_declaration + + document_consumer_declaration.connect(remote_consumer_declaration) + + AppConfig.ready(self) diff --git a/src/paperless_remote/checks.py b/src/paperless_remote/checks.py new file mode 100644 index 0000000000..b9abb05929 --- /dev/null +++ b/src/paperless_remote/checks.py @@ -0,0 +1,17 @@ +from django.conf import settings +from django.core.checks import Error +from django.core.checks import register + + +@register() +def check_remote_parser_configured(app_configs, **kwargs): + if settings.REMOTE_OCR_ENGINE == "azureai" and not ( + settings.REMOTE_OCR_ENDPOINT and settings.REMOTE_OCR_API_KEY + ): + return [ + Error( + "Azure AI remote parser requires endpoint and API key to be configured.", + ), + ] + + return [] diff --git a/src/paperless_remote/signals.py b/src/paperless_remote/signals.py new file mode 100644 index 0000000000..2300be7601 --- /dev/null +++ b/src/paperless_remote/signals.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from typing import Any + + +def get_parser(*args: Any, **kwargs: Any) -> Any: + from paperless.parsers.remote import RemoteDocumentParser + + # The new RemoteDocumentParser does not accept the progress_callback + # kwarg injected by the old signal-based consumer. logging_group is + # forwarded as a positional arg. + # Phase 4 will replace this signal path with the new ParserRegistry. + kwargs.pop("progress_callback", None) + return RemoteDocumentParser(*args, **kwargs) + + +def get_supported_mime_types() -> dict[str, str]: + from django.conf import settings + + from paperless.parsers.remote import RemoteDocumentParser + from paperless.parsers.remote import RemoteEngineConfig + + config = RemoteEngineConfig( + engine=settings.REMOTE_OCR_ENGINE, + api_key=settings.REMOTE_OCR_API_KEY, + endpoint=settings.REMOTE_OCR_ENDPOINT, + ) + if not config.engine_is_valid(): + return {} + return RemoteDocumentParser.supported_mime_types() + + +def remote_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: + return { + "parser": get_parser, + "weight": 5, + "mime_types": get_supported_mime_types(), + } diff --git a/src/paperless_remote/tests/__init__.py b/src/paperless_remote/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/paperless_remote/tests/test_checks.py b/src/paperless_remote/tests/test_checks.py new file mode 100644 index 0000000000..0512fb2577 --- /dev/null +++ b/src/paperless_remote/tests/test_checks.py @@ -0,0 +1,24 @@ +from unittest import TestCase + +from django.test import override_settings + +from paperless_remote import check_remote_parser_configured + + +class TestChecks(TestCase): + @override_settings(REMOTE_OCR_ENGINE=None) + def test_no_engine(self) -> None: + msgs = check_remote_parser_configured(None) + self.assertEqual(len(msgs), 0) + + @override_settings(REMOTE_OCR_ENGINE="azureai") + @override_settings(REMOTE_OCR_API_KEY="somekey") + @override_settings(REMOTE_OCR_ENDPOINT=None) + def test_azure_no_endpoint(self) -> None: + msgs = check_remote_parser_configured(None) + self.assertEqual(len(msgs), 1) + self.assertTrue( + msgs[0].msg.startswith( + "Azure AI remote parser requires endpoint and API key to be configured.", + ), + ) diff --git a/src/paperless_tesseract/apps.py b/src/paperless_tesseract/apps.py index f634349fb3..8ade88400c 100644 --- a/src/paperless_tesseract/apps.py +++ b/src/paperless_tesseract/apps.py @@ -6,7 +6,7 @@ class PaperlessTesseractConfig(AppConfig): name = "paperless_tesseract" - def ready(self): + def ready(self) -> None: from documents.signals import document_consumer_declaration document_consumer_declaration.connect(tesseract_consumer_declaration) diff --git a/src/paperless_tesseract/parsers.py b/src/paperless_tesseract/parsers.py index e3b0deed05..73532caa0d 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless_tesseract/parsers.py @@ -221,7 +221,7 @@ def construct_ocrmypdf_parameters( if TYPE_CHECKING: assert isinstance(self.settings, OcrConfig) ocrmypdf_args = { - "input_file": input_file, + "input_file_or_options": input_file, "output_file": output_file, # need to use threads, since this will be run in daemonized # processes via the task library. @@ -285,7 +285,7 @@ def construct_ocrmypdf_parameters( "for compatibility with img2pdf", ) # Replace the input file with the non-alpha - ocrmypdf_args["input_file"] = self.remove_alpha(input_file) + ocrmypdf_args["input_file_or_options"] = self.remove_alpha(input_file) if dpi: self.log.debug(f"Detected DPI for image {input_file}: {dpi}") @@ -330,7 +330,7 @@ def construct_ocrmypdf_parameters( return ocrmypdf_args - def parse(self, document_path: Path, mime_type, file_name=None): + def parse(self, document_path: Path, mime_type, file_name=None) -> None: # This forces tesseract to use one core per page. os.environ["OMP_THREAD_LIMIT"] = "1" VALID_TEXT_LENGTH = 50 diff --git a/src/paperless_tesseract/tests/test_checks.py b/src/paperless_tesseract/tests/test_checks.py index 79991bab1e..ab3ba0c16b 100644 --- a/src/paperless_tesseract/tests/test_checks.py +++ b/src/paperless_tesseract/tests/test_checks.py @@ -8,11 +8,11 @@ class TestChecks(TestCase): - def test_default_language(self): + def test_default_language(self) -> None: check_default_language_available(None) @override_settings(OCR_LANGUAGE="") - def test_no_language(self): + def test_no_language(self) -> None: msgs = check_default_language_available(None) self.assertEqual(len(msgs), 1) self.assertTrue( @@ -23,7 +23,7 @@ def test_no_language(self): @override_settings(OCR_LANGUAGE="ita") @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_invalid_language(self, m): + def test_invalid_language(self, m) -> None: m.return_value = ["deu", "eng"] msgs = check_default_language_available(None) self.assertEqual(len(msgs), 1) @@ -31,7 +31,7 @@ def test_invalid_language(self, m): @override_settings(OCR_LANGUAGE="chi_sim") @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_multi_part_language(self, m): + def test_multi_part_language(self, m) -> None: """ GIVEN: - An OCR language which is multi part (ie chi-sim) @@ -49,7 +49,7 @@ def test_multi_part_language(self, m): @override_settings(OCR_LANGUAGE="chi-sim") @mock.patch("paperless_tesseract.checks.get_tesseract_langs") - def test_multi_part_language_bad_format(self, m): + def test_multi_part_language_bad_format(self, m) -> None: """ GIVEN: - An OCR language which is multi part (ie chi-sim) diff --git a/src/paperless_tesseract/tests/test_parser.py b/src/paperless_tesseract/tests/test_parser.py index 57f1c8157a..2703f30dde 100644 --- a/src/paperless_tesseract/tests/test_parser.py +++ b/src/paperless_tesseract/tests/test_parser.py @@ -1,5 +1,6 @@ import shutil import tempfile +import unicodedata import uuid from pathlib import Path from unittest import mock @@ -19,7 +20,7 @@ class TestParser(DirectoriesMixin, FileSystemAssertsMixin, TestCase): SAMPLE_FILES = Path(__file__).resolve().parent / "samples" - def assertContainsStrings(self, content, strings): + def assertContainsStrings(self, content, strings) -> None: # Asserts that all strings appear in content, in the given order. indices = [] for s in strings: @@ -29,7 +30,7 @@ def assertContainsStrings(self, content, strings): self.fail(f"'{s}' is not in '{content}'") self.assertListEqual(indices, sorted(indices)) - def test_post_process_text(self): + def test_post_process_text(self) -> None: text_cases = [ ("simple string", "simple string"), ("simple newline\n testing string", "simple newline\ntesting string"), @@ -47,7 +48,7 @@ def test_post_process_text(self): f"strip_exceess_whitespace({source}) != '{result}', but '{actual_result}'", ) - def test_get_text_from_pdf(self): + def test_get_text_from_pdf(self) -> None: parser = RasterisedDocumentParser(uuid.uuid4()) text = parser.extract_text( None, @@ -56,7 +57,7 @@ def test_get_text_from_pdf(self): self.assertContainsStrings(text.strip(), ["This is a test document."]) - def test_get_page_count(self): + def test_get_page_count(self) -> None: """ GIVEN: - PDF file with a single page @@ -80,7 +81,7 @@ def test_get_page_count(self): ) self.assertEqual(page_count, 6) - def test_get_page_count_password_protected(self): + def test_get_page_count_password_protected(self) -> None: """ GIVEN: - Password protected PDF file @@ -98,7 +99,7 @@ def test_get_page_count_password_protected(self): self.assertEqual(page_count, None) self.assertIn("Unable to determine PDF page count", cm.output[0]) - def test_thumbnail(self): + def test_thumbnail(self) -> None: parser = RasterisedDocumentParser(uuid.uuid4()) thumb = parser.get_thumbnail( str(self.SAMPLE_FILES / "simple-digital.pdf"), @@ -107,8 +108,8 @@ def test_thumbnail(self): self.assertIsFile(thumb) @mock.patch("documents.parsers.run_convert") - def test_thumbnail_fallback(self, m): - def call_convert(input_file, output_file, **kwargs): + def test_thumbnail_fallback(self, m) -> None: + def call_convert(input_file, output_file, **kwargs) -> None: if ".pdf" in str(input_file): raise ParseError("Does not compute.") else: @@ -123,7 +124,7 @@ def call_convert(input_file, output_file, **kwargs): ) self.assertIsFile(thumb) - def test_thumbnail_encrypted(self): + def test_thumbnail_encrypted(self) -> None: parser = RasterisedDocumentParser(uuid.uuid4()) thumb = parser.get_thumbnail( str(self.SAMPLE_FILES / "encrypted.pdf"), @@ -131,7 +132,7 @@ def test_thumbnail_encrypted(self): ) self.assertIsFile(thumb) - def test_get_dpi(self): + def test_get_dpi(self) -> None: parser = RasterisedDocumentParser(None) dpi = parser.get_dpi(str(self.SAMPLE_FILES / "simple-no-dpi.png")) @@ -140,7 +141,7 @@ def test_get_dpi(self): dpi = parser.get_dpi(str(self.SAMPLE_FILES / "simple.png")) self.assertEqual(dpi, 72) - def test_simple_digital(self): + def test_simple_digital(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( @@ -152,7 +153,7 @@ def test_simple_digital(self): self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - def test_with_form(self): + def test_with_form(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( @@ -168,7 +169,7 @@ def test_with_form(self): ) @override_settings(OCR_MODE="redo") - def test_with_form_error(self): + def test_with_form_error(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( @@ -183,7 +184,7 @@ def test_with_form_error(self): ) @override_settings(OCR_MODE="skip") - def test_signed(self): + def test_signed(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "signed.pdf"), "application/pdf") @@ -198,7 +199,7 @@ def test_signed(self): ) @override_settings(OCR_MODE="skip") - def test_encrypted(self): + def test_encrypted(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( @@ -210,7 +211,7 @@ def test_encrypted(self): self.assertEqual(parser.get_text(), "") @override_settings(OCR_MODE="redo") - def test_with_form_error_notext(self): + def test_with_form_error_notext(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "with-form.pdf"), @@ -223,7 +224,7 @@ def test_with_form_error_notext(self): ) @override_settings(OCR_MODE="force") - def test_with_form_force(self): + def test_with_form_force(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( @@ -236,7 +237,7 @@ def test_with_form_force(self): ["Please enter your name in here:", "This is a PDF document with a form."], ) - def test_image_simple(self): + def test_image_simple(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.png"), "image/png") @@ -245,7 +246,7 @@ def test_image_simple(self): self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - def test_image_simple_alpha(self): + def test_image_simple_alpha(self) -> None: parser = RasterisedDocumentParser(None) with tempfile.TemporaryDirectory() as tempdir: @@ -261,7 +262,7 @@ def test_image_simple_alpha(self): self.assertContainsStrings(parser.get_text(), ["This is a test document."]) - def test_image_calc_a4_dpi(self): + def test_image_calc_a4_dpi(self) -> None: parser = RasterisedDocumentParser(None) dpi = parser.calculate_a4_dpi( @@ -271,11 +272,11 @@ def test_image_calc_a4_dpi(self): self.assertEqual(dpi, 62) @mock.patch("paperless_tesseract.parsers.RasterisedDocumentParser.calculate_a4_dpi") - def test_image_dpi_fail(self, m): + def test_image_dpi_fail(self, m) -> None: m.return_value = None parser = RasterisedDocumentParser(None) - def f(): + def f() -> None: parser.parse( str(self.SAMPLE_FILES / "simple-no-dpi.png"), "image/png", @@ -284,7 +285,7 @@ def f(): self.assertRaises(ParseError, f) @override_settings(OCR_IMAGE_DPI=72, MAX_IMAGE_PIXELS=0) - def test_image_no_dpi_default(self): + def test_image_no_dpi_default(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple-no-dpi.png"), "image/png") @@ -296,7 +297,7 @@ def test_image_no_dpi_default(self): ["this is a test document."], ) - def test_multi_page(self): + def test_multi_page(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "multi-page-digital.pdf"), @@ -309,7 +310,7 @@ def test_multi_page(self): ) @override_settings(OCR_PAGES=2, OCR_MODE="skip") - def test_multi_page_pages_skip(self): + def test_multi_page_pages_skip(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "multi-page-digital.pdf"), @@ -322,7 +323,7 @@ def test_multi_page_pages_skip(self): ) @override_settings(OCR_PAGES=2, OCR_MODE="redo") - def test_multi_page_pages_redo(self): + def test_multi_page_pages_redo(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "multi-page-digital.pdf"), @@ -335,7 +336,7 @@ def test_multi_page_pages_redo(self): ) @override_settings(OCR_PAGES=2, OCR_MODE="force") - def test_multi_page_pages_force(self): + def test_multi_page_pages_force(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "multi-page-digital.pdf"), @@ -348,7 +349,7 @@ def test_multi_page_pages_force(self): ) @override_settings(OCR_MODE="skip") - def test_multi_page_analog_pages_skip(self): + def test_multi_page_analog_pages_skip(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "multi-page-images.pdf"), @@ -361,7 +362,7 @@ def test_multi_page_analog_pages_skip(self): ) @override_settings(OCR_PAGES=2, OCR_MODE="redo") - def test_multi_page_analog_pages_redo(self): + def test_multi_page_analog_pages_redo(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -383,7 +384,7 @@ def test_multi_page_analog_pages_redo(self): self.assertNotIn("page 3", parser.get_text().lower()) @override_settings(OCR_PAGES=1, OCR_MODE="force") - def test_multi_page_analog_pages_force(self): + def test_multi_page_analog_pages_force(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -406,7 +407,7 @@ def test_multi_page_analog_pages_force(self): self.assertNotIn("page 3", parser.get_text().lower()) @override_settings(OCR_MODE="skip_noarchive") - def test_skip_noarchive_withtext(self): + def test_skip_noarchive_withtext(self) -> None: """ GIVEN: - File with existing text layer @@ -429,7 +430,7 @@ def test_skip_noarchive_withtext(self): ) @override_settings(OCR_MODE="skip_noarchive") - def test_skip_noarchive_notext(self): + def test_skip_noarchive_notext(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -454,7 +455,7 @@ def test_skip_noarchive_notext(self): self.assertIsNotNone(parser.archive_path) @override_settings(OCR_SKIP_ARCHIVE_FILE="never") - def test_skip_archive_never_withtext(self): + def test_skip_archive_never_withtext(self) -> None: """ GIVEN: - File with existing text layer @@ -477,7 +478,7 @@ def test_skip_archive_never_withtext(self): ) @override_settings(OCR_SKIP_ARCHIVE_FILE="never") - def test_skip_archive_never_withimages(self): + def test_skip_archive_never_withimages(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -500,7 +501,7 @@ def test_skip_archive_never_withimages(self): ) @override_settings(OCR_SKIP_ARCHIVE_FILE="with_text") - def test_skip_archive_withtext_withtext(self): + def test_skip_archive_withtext_withtext(self) -> None: """ GIVEN: - File with existing text layer @@ -523,7 +524,7 @@ def test_skip_archive_withtext_withtext(self): ) @override_settings(OCR_SKIP_ARCHIVE_FILE="with_text") - def test_skip_archive_withtext_withimages(self): + def test_skip_archive_withtext_withimages(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -546,7 +547,7 @@ def test_skip_archive_withtext_withimages(self): ) @override_settings(OCR_SKIP_ARCHIVE_FILE="always") - def test_skip_archive_always_withtext(self): + def test_skip_archive_always_withtext(self) -> None: """ GIVEN: - File with existing text layer @@ -569,7 +570,7 @@ def test_skip_archive_always_withtext(self): ) @override_settings(OCR_SKIP_ARCHIVE_FILE="always") - def test_skip_archive_always_withimages(self): + def test_skip_archive_always_withimages(self) -> None: """ GIVEN: - File with text contained in images but no text layer @@ -592,7 +593,7 @@ def test_skip_archive_always_withimages(self): ) @override_settings(OCR_MODE="skip") - def test_multi_page_mixed(self): + def test_multi_page_mixed(self) -> None: """ GIVEN: - File with some text contained in images and some in text layer @@ -621,7 +622,7 @@ def test_multi_page_mixed(self): self.assertIn("[OCR skipped on page(s) 4-6]", sidecar) @override_settings(OCR_MODE="redo") - def test_single_page_mixed(self): + def test_single_page_mixed(self) -> None: """ GIVEN: - File with some text contained in images and some in text layer @@ -660,7 +661,7 @@ def test_single_page_mixed(self): ) @override_settings(OCR_MODE="skip_noarchive") - def test_multi_page_mixed_no_archive(self): + def test_multi_page_mixed_no_archive(self) -> None: """ GIVEN: - File with some text contained in images and some in text layer @@ -683,7 +684,7 @@ def test_multi_page_mixed_no_archive(self): ) @override_settings(OCR_MODE="skip", OCR_ROTATE_PAGES=True) - def test_rotate(self): + def test_rotate(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "rotated.pdf"), "application/pdf") self.assertContainsStrings( @@ -696,7 +697,7 @@ def test_rotate(self): ], ) - def test_multi_page_tiff(self): + def test_multi_page_tiff(self) -> None: """ GIVEN: - Multi-page TIFF image @@ -716,7 +717,7 @@ def test_multi_page_tiff(self): ["page 1", "page 2", "page 3"], ) - def test_multi_page_tiff_alpha(self): + def test_multi_page_tiff_alpha(self) -> None: """ GIVEN: - Multi-page TIFF image @@ -740,7 +741,7 @@ def test_multi_page_tiff_alpha(self): ["page 1", "page 2", "page 3"], ) - def test_multi_page_tiff_alpha_srgb(self): + def test_multi_page_tiff_alpha_srgb(self) -> None: """ GIVEN: - Multi-page TIFF image @@ -767,7 +768,7 @@ def test_multi_page_tiff_alpha_srgb(self): ["page 1", "page 2", "page 3"], ) - def test_ocrmypdf_parameters(self): + def test_ocrmypdf_parameters(self) -> None: parser = RasterisedDocumentParser(None) params = parser.construct_ocrmypdf_parameters( input_file="input.pdf", @@ -777,7 +778,7 @@ def test_ocrmypdf_parameters(self): safe_fallback=False, ) - self.assertEqual(params["input_file"], "input.pdf") + self.assertEqual(params["input_file_or_options"], "input.pdf") self.assertEqual(params["output_file"], "output.pdf") self.assertEqual(params["sidecar"], "sidecar.txt") @@ -831,7 +832,7 @@ def test_ocrmypdf_parameters(self): params = parser.construct_ocrmypdf_parameters("", "", "", "") self.assertNotIn("max_image_mpixels", params) - def test_rtl_language_detection(self): + def test_rtl_language_detection(self) -> None: """ GIVEN: - File with text in an RTL language @@ -847,11 +848,21 @@ def test_rtl_language_detection(self): "application/pdf", ) - # Copied from the PDF to here. Don't even look at it - self.assertIn("ةﯾﻠﺧﺎدﻻ ةرازو", parser.get_text()) + # OCR output for RTL text varies across platforms/versions due to + # bidi controls and presentation forms; normalize before assertion. + normalized_text = "".join( + char + for char in unicodedata.normalize("NFKC", parser.get_text()) + if unicodedata.category(char) != "Cf" and not char.isspace() + ) + + self.assertIn("ةرازو", normalized_text) + self.assertTrue( + any(token in normalized_text for token in ("ةیلخادلا", "الاخليد")), + ) @mock.patch("ocrmypdf.ocr") - def test_gs_rendering_error(self, m): + def test_gs_rendering_error(self, m) -> None: m.side_effect = SubprocessOutputError("Ghostscript PDF/A rendering failed") parser = RasterisedDocumentParser(None) @@ -866,39 +877,39 @@ def test_gs_rendering_error(self, m): class TestParserFileTypes(DirectoriesMixin, FileSystemAssertsMixin, TestCase): SAMPLE_FILES = Path(__file__).parent / "samples" - def test_bmp(self): + def test_bmp(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.bmp"), "image/bmp") self.assertIsFile(parser.archive_path) self.assertIn("this is a test document", parser.get_text().lower()) - def test_jpg(self): + def test_jpg(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.jpg"), "image/jpeg") self.assertIsFile(parser.archive_path) self.assertIn("this is a test document", parser.get_text().lower()) - def test_heic(self): + def test_heic(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.heic"), "image/heic") self.assertIsFile(parser.archive_path) self.assertIn("pizza", parser.get_text().lower()) @override_settings(OCR_IMAGE_DPI=200) - def test_gif(self): + def test_gif(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.gif"), "image/gif") self.assertIsFile(parser.archive_path) self.assertIn("this is a test document", parser.get_text().lower()) - def test_tiff(self): + def test_tiff(self) -> None: parser = RasterisedDocumentParser(None) parser.parse(str(self.SAMPLE_FILES / "simple.tif"), "image/tiff") self.assertIsFile(parser.archive_path) self.assertIn("this is a test document", parser.get_text().lower()) @override_settings(OCR_IMAGE_DPI=72) - def test_webp(self): + def test_webp(self) -> None: parser = RasterisedDocumentParser(None) parser.parse( str(self.SAMPLE_FILES / "document.webp"), diff --git a/src/paperless_tesseract/tests/test_parser_custom_settings.py b/src/paperless_tesseract/tests/test_parser_custom_settings.py index 7621092dc1..a4db8a2aa3 100644 --- a/src/paperless_tesseract/tests/test_parser_custom_settings.py +++ b/src/paperless_tesseract/tests/test_parser_custom_settings.py @@ -27,7 +27,7 @@ def get_params(): safe_fallback=False, ) - def test_db_settings_ocr_pages(self): + def test_db_settings_ocr_pages(self) -> None: """ GIVEN: - Django settings defines different value for OCR_PAGES than @@ -45,7 +45,7 @@ def test_db_settings_ocr_pages(self): params = self.get_params() self.assertEqual(params["pages"], "1-5") - def test_db_settings_ocr_language(self): + def test_db_settings_ocr_language(self) -> None: """ GIVEN: - Django settings defines different value for OCR_LANGUAGE than @@ -63,7 +63,7 @@ def test_db_settings_ocr_language(self): params = self.get_params() self.assertEqual(params["language"], "fra+ita") - def test_db_settings_ocr_output_type(self): + def test_db_settings_ocr_output_type(self) -> None: """ GIVEN: - Django settings defines different value for OCR_OUTPUT_TYPE than @@ -81,7 +81,7 @@ def test_db_settings_ocr_output_type(self): params = self.get_params() self.assertEqual(params["output_type"], "pdfa") - def test_db_settings_ocr_mode(self): + def test_db_settings_ocr_mode(self) -> None: """ GIVEN: - Django settings defines different value for OCR_MODE than @@ -101,7 +101,7 @@ def test_db_settings_ocr_mode(self): self.assertNotIn("redo_ocr", params) self.assertNotIn("force_ocr", params) - def test_db_settings_ocr_clean(self): + def test_db_settings_ocr_clean(self) -> None: """ GIVEN: - Django settings defines different value for OCR_CLEAN than @@ -129,7 +129,7 @@ def test_db_settings_ocr_clean(self): self.assertTrue(params["clean_final"]) self.assertNotIn("clean", params) - def test_db_settings_ocr_deskew(self): + def test_db_settings_ocr_deskew(self) -> None: """ GIVEN: - Django settings defines different value for OCR_DESKEW than @@ -147,7 +147,7 @@ def test_db_settings_ocr_deskew(self): params = self.get_params() self.assertTrue(params["deskew"]) - def test_db_settings_ocr_rotate(self): + def test_db_settings_ocr_rotate(self) -> None: """ GIVEN: - Django settings defines different value for OCR_ROTATE_PAGES @@ -159,6 +159,7 @@ def test_db_settings_ocr_rotate(self): """ with override_settings(OCR_ROTATE_PAGES=False, OCR_ROTATE_PAGES_THRESHOLD=30.0): instance = ApplicationConfiguration.objects.all().first() + assert instance is not None instance.rotate_pages = True instance.rotate_pages_threshold = 15.0 instance.save() @@ -167,7 +168,7 @@ def test_db_settings_ocr_rotate(self): self.assertTrue(params["rotate_pages"]) self.assertAlmostEqual(params["rotate_pages_threshold"], 15.0) - def test_db_settings_ocr_max_pixels(self): + def test_db_settings_ocr_max_pixels(self) -> None: """ GIVEN: - Django settings defines different value for OCR_MAX_IMAGE_PIXELS than @@ -185,7 +186,7 @@ def test_db_settings_ocr_max_pixels(self): params = self.get_params() self.assertAlmostEqual(params["max_image_mpixels"], 1.0) - def test_db_settings_ocr_color_convert(self): + def test_db_settings_ocr_color_convert(self) -> None: """ GIVEN: - Django settings defines different value for OCR_COLOR_CONVERSION_STRATEGY than @@ -206,7 +207,7 @@ def test_db_settings_ocr_color_convert(self): "UseDeviceIndependentColor", ) - def test_ocr_user_args(self): + def test_ocr_user_args(self) -> None: """ GIVEN: - Django settings defines different value for OCR_USER_ARGS than diff --git a/src/paperless_text/apps.py b/src/paperless_text/apps.py index 0dd7b22064..619d718861 100644 --- a/src/paperless_text/apps.py +++ b/src/paperless_text/apps.py @@ -6,7 +6,7 @@ class PaperlessTextConfig(AppConfig): name = "paperless_text" - def ready(self): + def ready(self) -> None: from documents.signals import document_consumer_declaration document_consumer_declaration.connect(text_consumer_declaration) diff --git a/src/paperless_text/parsers.py b/src/paperless_text/parsers.py deleted file mode 100644 index 4e37ccd822..0000000000 --- a/src/paperless_text/parsers.py +++ /dev/null @@ -1,50 +0,0 @@ -from pathlib import Path - -from django.conf import settings -from PIL import Image -from PIL import ImageDraw -from PIL import ImageFont - -from documents.parsers import DocumentParser - - -class TextDocumentParser(DocumentParser): - """ - This parser directly parses a text document (.txt, .md, or .csv) - """ - - logging_name = "paperless.parsing.text" - - def get_thumbnail(self, document_path: Path, mime_type, file_name=None) -> Path: - # Avoid reading entire file into memory - max_chars = 100_000 - file_size_limit = 50 * 1024 * 1024 - - if document_path.stat().st_size > file_size_limit: - text = "[File too large to preview]" - else: - with Path(document_path).open("r", encoding="utf-8", errors="replace") as f: - text = f.read(max_chars) - - img = Image.new("RGB", (500, 700), color="white") - draw = ImageDraw.Draw(img) - font = ImageFont.truetype( - font=settings.THUMBNAIL_FONT_NAME, - size=20, - layout_engine=ImageFont.Layout.BASIC, - ) - draw.multiline_text((5, 5), text, font=font, fill="black", spacing=4) - - out_path = self.tempdir / "thumb.webp" - img.save(out_path, format="WEBP") - - return out_path - - def parse(self, document_path, mime_type, file_name=None): - self.text = self.read_file_handle_unicode_errors(document_path) - - def get_settings(self): - """ - This parser does not implement additional settings yet - """ - return None diff --git a/src/paperless_text/signals.py b/src/paperless_text/signals.py index 05804c6d67..916f0a7c04 100644 --- a/src/paperless_text/signals.py +++ b/src/paperless_text/signals.py @@ -1,10 +1,23 @@ -def get_parser(*args, **kwargs): - from paperless_text.parsers import TextDocumentParser +from __future__ import annotations +from typing import Any + + +def get_parser(*args: Any, **kwargs: Any) -> Any: + from paperless.parsers.text import TextDocumentParser + + # TextDocumentParser accepts logging_group for constructor compatibility but + # does not store or use it (no legacy DocumentParser base class). + # progress_callback is also not used. Both may arrive as a positional arg + # (consumer) or a keyword arg (views); *args absorbs the positional form, + # kwargs.pop handles the keyword form. Phase 4 will replace this signal + # path with the new ParserRegistry so the shim can be removed at that point. + kwargs.pop("logging_group", None) + kwargs.pop("progress_callback", None) return TextDocumentParser(*args, **kwargs) -def text_consumer_declaration(sender, **kwargs): +def text_consumer_declaration(sender: Any, **kwargs: Any) -> dict[str, Any]: return { "parser": get_parser, "weight": 10, diff --git a/src/paperless_text/tests/conftest.py b/src/paperless_text/tests/conftest.py deleted file mode 100644 index 1d9e4fc2f8..0000000000 --- a/src/paperless_text/tests/conftest.py +++ /dev/null @@ -1,30 +0,0 @@ -from collections.abc import Generator -from pathlib import Path - -import pytest - -from paperless_text.parsers import TextDocumentParser - - -@pytest.fixture(scope="session") -def sample_dir() -> Path: - return (Path(__file__).parent / Path("samples")).resolve() - - -@pytest.fixture() -def text_parser() -> Generator[TextDocumentParser, None, None]: - try: - parser = TextDocumentParser(logging_group=None) - yield parser - finally: - parser.cleanup() - - -@pytest.fixture(scope="session") -def sample_txt_file(sample_dir: Path) -> Path: - return sample_dir / "test.txt" - - -@pytest.fixture(scope="session") -def malformed_txt_file(sample_dir: Path) -> Path: - return sample_dir / "decode_error.txt" diff --git a/src/paperless_text/tests/test_parser.py b/src/paperless_text/tests/test_parser.py deleted file mode 100644 index 5fea367444..0000000000 --- a/src/paperless_text/tests/test_parser.py +++ /dev/null @@ -1,61 +0,0 @@ -import tempfile -from pathlib import Path - -from paperless_text.parsers import TextDocumentParser - - -class TestTextParser: - def test_thumbnail(self, text_parser: TextDocumentParser, sample_txt_file: Path): - # just make sure that it does not crash - f = text_parser.get_thumbnail(sample_txt_file, "text/plain") - assert f.exists() - assert f.is_file() - - def test_parse(self, text_parser: TextDocumentParser, sample_txt_file: Path): - text_parser.parse(sample_txt_file, "text/plain") - - assert text_parser.get_text() == "This is a test file.\n" - assert text_parser.get_archive_path() is None - - def test_parse_invalid_bytes( - self, - text_parser: TextDocumentParser, - malformed_txt_file: Path, - ): - """ - GIVEN: - - Text file which contains invalid UTF bytes - WHEN: - - The file is parsed - THEN: - - Parsing continues - - Invalid bytes are removed - """ - - text_parser.parse(malformed_txt_file, "text/plain") - - assert text_parser.get_text() == "Pantothens�ure\n" - assert text_parser.get_archive_path() is None - - def test_thumbnail_large_file(self, text_parser: TextDocumentParser): - """ - GIVEN: - - A very large text file (>50MB) - WHEN: - - A thumbnail is requested - THEN: - - A thumbnail is created without reading the entire file into memory - """ - with tempfile.NamedTemporaryFile( - delete=False, - mode="w", - encoding="utf-8", - suffix=".txt", - ) as tmp: - tmp.write("A" * (51 * 1024 * 1024)) # 51 MB of 'A' - large_file = Path(tmp.name) - - thumb = text_parser.get_thumbnail(large_file, "text/plain") - assert thumb.exists() - assert thumb.is_file() - large_file.unlink() diff --git a/src/paperless_tika/apps.py b/src/paperless_tika/apps.py index 6fad68df86..714a051883 100644 --- a/src/paperless_tika/apps.py +++ b/src/paperless_tika/apps.py @@ -7,7 +7,7 @@ class PaperlessTikaConfig(AppConfig): name = "paperless_tika" - def ready(self): + def ready(self) -> None: from documents.signals import document_consumer_declaration if settings.TIKA_ENABLED: diff --git a/src/paperless_tika/parsers.py b/src/paperless_tika/parsers.py deleted file mode 100644 index 40aa8e581e..0000000000 --- a/src/paperless_tika/parsers.py +++ /dev/null @@ -1,136 +0,0 @@ -from pathlib import Path - -import httpx -from django.conf import settings -from django.utils import timezone -from gotenberg_client import GotenbergClient -from gotenberg_client.options import PdfAFormat -from tika_client import TikaClient - -from documents.parsers import DocumentParser -from documents.parsers import ParseError -from documents.parsers import make_thumbnail_from_pdf -from paperless.config import OutputTypeConfig -from paperless.models import OutputTypeChoices - - -class TikaDocumentParser(DocumentParser): - """ - This parser sends documents to a local tika server - """ - - logging_name = "paperless.parsing.tika" - - def get_thumbnail(self, document_path, mime_type, file_name=None): - if not self.archive_path: - self.archive_path = self.convert_to_pdf(document_path, file_name) - - return make_thumbnail_from_pdf( - self.archive_path, - self.tempdir, - self.logging_group, - ) - - def extract_metadata(self, document_path, mime_type): - try: - with TikaClient( - tika_url=settings.TIKA_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client: - parsed = client.metadata.from_file(document_path, mime_type) - return [ - { - "namespace": "", - "prefix": "", - "key": key, - "value": parsed.data[key], - } - for key in parsed.data - ] - except Exception as e: - self.log.warning( - f"Error while fetching document metadata for {document_path}: {e}", - ) - return [] - - def parse(self, document_path: Path, mime_type: str, file_name=None): - self.log.info(f"Sending {document_path} to Tika server") - - try: - with TikaClient( - tika_url=settings.TIKA_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client: - try: - parsed = client.tika.as_text.from_file(document_path, mime_type) - except httpx.HTTPStatusError as err: - # Workaround https://issues.apache.org/jira/browse/TIKA-4110 - # Tika fails with some files as multi-part form data - if err.response.status_code == httpx.codes.INTERNAL_SERVER_ERROR: - parsed = client.tika.as_text.from_buffer( - document_path.read_bytes(), - mime_type, - ) - else: # pragma: no cover - raise - except Exception as err: - raise ParseError( - f"Could not parse {document_path} with tika server at " - f"{settings.TIKA_ENDPOINT}: {err}", - ) from err - - self.text = parsed.content - if self.text is not None: - self.text = self.text.strip() - - self.date = parsed.created - if self.date is not None and timezone.is_naive(self.date): - self.date = timezone.make_aware(self.date) - - self.archive_path = self.convert_to_pdf(document_path, file_name) - - def convert_to_pdf(self, document_path: Path, file_name): - pdf_path = Path(self.tempdir) / "convert.pdf" - - self.log.info(f"Converting {document_path} to PDF as {pdf_path}") - - with ( - GotenbergClient( - host=settings.TIKA_GOTENBERG_ENDPOINT, - timeout=settings.CELERY_TASK_TIME_LIMIT, - ) as client, - client.libre_office.to_pdf() as route, - ): - # Set the output format of the resulting PDF - if settings.OCR_OUTPUT_TYPE in { - OutputTypeChoices.PDF_A, - OutputTypeChoices.PDF_A2, - }: - route.pdf_format(PdfAFormat.A2b) - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: - self.log.warning( - "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", - ) - route.pdf_format(PdfAFormat.A2b) - elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A3: - route.pdf_format(PdfAFormat.A3b) - - route.convert(document_path) - - try: - response = route.run() - - pdf_path.write_bytes(response.content) - - return pdf_path - - except Exception as err: - raise ParseError( - f"Error while converting document to PDF: {err}", - ) from err - - def get_settings(self) -> OutputTypeConfig: - """ - This parser only uses the PDF output type configuration currently - """ - return OutputTypeConfig() diff --git a/src/paperless_tika/signals.py b/src/paperless_tika/signals.py index 2b7495e353..f1fd17ef6e 100644 --- a/src/paperless_tika/signals.py +++ b/src/paperless_tika/signals.py @@ -1,7 +1,15 @@ def get_parser(*args, **kwargs): - from paperless_tika.parsers import TikaDocumentParser + from paperless.parsers.tika import TikaDocumentParser - return TikaDocumentParser(*args, **kwargs) + # TikaDocumentParser accepts logging_group for constructor compatibility but + # does not store or use it (no legacy DocumentParser base class). + # progress_callback is also not used. Both may arrive as a positional arg + # (consumer) or a keyword arg (views); *args absorbs the positional form, + # kwargs.pop handles the keyword form. Phase 4 will replace this signal + # path with the new ParserRegistry so the shim can be removed at that point. + kwargs.pop("logging_group", None) + kwargs.pop("progress_callback", None) + return TikaDocumentParser() def tika_consumer_declaration(sender, **kwargs): diff --git a/src/paperless_tika/tests/conftest.py b/src/paperless_tika/tests/conftest.py deleted file mode 100644 index 657192e4e6..0000000000 --- a/src/paperless_tika/tests/conftest.py +++ /dev/null @@ -1,40 +0,0 @@ -from collections.abc import Generator -from pathlib import Path - -import pytest - -from paperless_tika.parsers import TikaDocumentParser - - -@pytest.fixture() -def tika_parser() -> Generator[TikaDocumentParser, None, None]: - try: - parser = TikaDocumentParser(logging_group=None) - yield parser - finally: - parser.cleanup() - - -@pytest.fixture(scope="session") -def sample_dir() -> Path: - return (Path(__file__).parent / Path("samples")).resolve() - - -@pytest.fixture(scope="session") -def sample_odt_file(sample_dir: Path) -> Path: - return sample_dir / "sample.odt" - - -@pytest.fixture(scope="session") -def sample_docx_file(sample_dir: Path) -> Path: - return sample_dir / "sample.docx" - - -@pytest.fixture(scope="session") -def sample_doc_file(sample_dir: Path) -> Path: - return sample_dir / "sample.doc" - - -@pytest.fixture(scope="session") -def sample_broken_odt(sample_dir: Path) -> Path: - return sample_dir / "multi-part-broken.odt" diff --git a/uv.lock b/uv.lock index 84ff2e5a1a..66cfc41ac8 100644 --- a/uv.lock +++ b/uv.lock @@ -1,19 +1,142 @@ version = 1 revision = 3 -requires-python = ">=3.10" +requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'darwin'", + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", - "python_full_version < '3.11' and sys_platform == 'linux'", + "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", + "python_full_version < '3.12' and sys_platform == 'linux'", ] supported-markers = [ "sys_platform == 'darwin'", "sys_platform == 'linux'", ] +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "aiosignal", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "frozenlist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "multidict", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "propcache", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "yarl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, + { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, + { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, +] + [[package]] name = "amqp" version = "5.3.1" @@ -26,31 +149,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/99/fc813cd978842c26c82534010ea849eee9ab3a13ea2b74e95cb9c99e747b/amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", size = 50944, upload-time = "2024-11-12T19:55:41.782Z" }, ] +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + [[package]] name = "anyio" -version = "4.11.0" +version = "4.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "sniffio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] [[package]] name = "asgiref" -version = "3.9.2" +version = "3.11.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7f/bf/0f3ecda32f1cb3bf1dca480aca08a7a8a3bdc4bed2343a103f30731565c9/asgiref-3.9.2.tar.gz", hash = "sha256:a0249afacb66688ef258ffe503528360443e2b9a8d8c4581b6ebefa58c841ef1", size = 36894, upload-time = "2025-09-23T15:00:55.136Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", hash = "sha256:13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4", size = 37969, upload-time = "2025-11-19T15:32:20.106Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d1/69d02ce34caddb0a7ae088b84c356a625a93cd4ff57b2f97644c03fad905/asgiref-3.9.2-py3-none-any.whl", hash = "sha256:0b61526596219d70396548fc003635056856dba5d0d086f86476f10b33c75960", size = 23788, upload-time = "2025-09-23T15:00:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", hash = "sha256:1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d", size = 24096, upload-time = "2025-11-19T15:32:19.004Z" }, ] [[package]] @@ -64,26 +191,41 @@ wheels = [ [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] [[package]] name = "autobahn" -version = "24.4.2" +version = "25.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "cbor2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "cffi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "hyperlink", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "setuptools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "msgpack", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'darwin') or (platform_python_implementation == 'CPython' and sys_platform == 'linux')" }, + { name = "py-ubjson", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "txaio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "u-msgpack-python", marker = "(platform_python_implementation != 'CPython' and sys_platform == 'darwin') or (platform_python_implementation != 'CPython' and sys_platform == 'linux')" }, + { name = "ujson", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/f2/8dffb3b709383ba5b47628b0cc4e43e8d12d59eecbddb62cfccac2e7cf6a/autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9", size = 482700, upload-time = "2024-08-02T09:26:48.241Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/d5/9adf0f5b9eb244e58e898e9f3db4b00c09835ef4b6c37d491886e0376b4f/autobahn-25.12.2.tar.gz", hash = "sha256:754c06a54753aeb7e8d10c5cbf03249ad9e2a1a32bca8be02865c6f00628a98c", size = 13893652, upload-time = "2025-12-15T11:13:19.086Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/ee/a6475f39ef6c6f41c33da6b193e0ffd2c6048f52e1698be6253c59301b72/autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81", size = 666965, upload-time = "2024-08-02T09:26:44.274Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/923e4f11dc9d12b9f5a014f36d591c479d623d54dda3bdcbd688cd12f052/autobahn-25.12.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16df879672c60f1f3fe452138c80f0fd221b3cb2ee5a14390c80f33b994104c1", size = 2053413, upload-time = "2025-12-15T11:12:58.167Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0d/3d39637a1e32f555ce5fabec4a723a035556ef918b14140faea05e7de902/autobahn-25.12.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ffe28048ef96eb0f925f24c2569bd72332e120f4cb31cd6c40dd66718a5f85e", size = 2224850, upload-time = "2025-12-15T11:13:00.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/36452c06cbcad6d04587aeb87dfa987ef94be4a427b9f2155783d166bd97/autobahn-25.12.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:220748f21e91bd4a538d2d3de640cc17ee30b79f1c04a6c3dcdef321d531ee1c", size = 2225453, upload-time = "2025-12-15T11:13:02.865Z" }, + { url = "https://files.pythonhosted.org/packages/83/30/ef9c47038e4e9257319d6e1b87668b3df360a0c488d66ccff9d11aaff6ba/autobahn-25.12.2-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:bc17f6cab9438156d2701c293c76fd02a144f9be0a992c065dfee1935ce4845b", size = 1960447, upload-time = "2025-12-15T11:13:05.007Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e4/f3d5cb70bc0b9b5523d940734b2e0a251510d051a50d2e723f321e890859/autobahn-25.12.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5297a782fc7d0a26842438ef1342549ceee29496cda52672ac44635c79eeb94", size = 2053955, upload-time = "2025-12-15T11:13:06.052Z" }, + { url = "https://files.pythonhosted.org/packages/ea/49/4e592a19ae58fd9c796821a882b22598fac295ede50f899cc9d14a0282b6/autobahn-25.12.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0c3f1d5dafda52f8dc962ab583b6f3473b7b7186cab082d05372ed43a8261a5", size = 2225441, upload-time = "2025-12-15T11:13:07.527Z" }, + { url = "https://files.pythonhosted.org/packages/54/b7/0a0e3ecb2af7e452f5f359d19bdc647cbc8658f3f498bfa3bf8545cf4768/autobahn-25.12.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c840ee136bfaf6560467160129b0b25a0e33c9a51e2b251e98c5474f27583915", size = 1960463, upload-time = "2025-12-15T11:13:10.183Z" }, + { url = "https://files.pythonhosted.org/packages/19/8b/4215ac49d6b793b592fb08698f3a0e21a59eb3520be7f7ed288fcb52d919/autobahn-25.12.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9abda5cf817c0f8a19a55a67a031adf2fc70ed351719b5bd9e6fa0f5f4bc8f89", size = 2225590, upload-time = "2025-12-15T11:13:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/d6/99/b4a3da42471d3ec36e2dca0c1a5368a079fed9f73b159ce3f049c4a4983b/autobahn-25.12.2-pp311-pypy311_pp73-macosx_15_0_arm64.whl", hash = "sha256:0c226329ddec154c6f3b491ea3e4713035f0326c96ebfd6b305bf90f27a2fba1", size = 1955357, upload-time = "2025-12-15T11:13:13.581Z" }, + { url = "https://files.pythonhosted.org/packages/89/81/67f19dd7395a9f1123a1f071314f8d1c4879c1869adeb8d99a236e756ac0/autobahn-25.12.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f079393a7626eb448c8accf21151f5f206d02f8e9cee4313d62a5ca30a3aaed", size = 623173, upload-time = "2025-12-15T11:13:14.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/eb/857eab3d25e3b9cc9e7e741d6193808ad91de0befb38cf10658bd339c205/autobahn-25.12.2-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b3a6c7d54a9f0434a435d88b86555510e5d0a84aa87042e292f29f707cab237", size = 2178008, upload-time = "2025-12-15T11:13:15.881Z" }, ] [[package]] @@ -95,110 +237,117 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/ff/1175b0b7371e46244032d43a56862d0af455823b5280a50c63d99cc50f18/automat-25.4.16-py3-none-any.whl", hash = "sha256:04e9bce696a8d5671ee698005af6e5a9fa15354140a87f4870744604dcdd3ba1", size = 42842, upload-time = "2025-04-16T20:12:14.447Z" }, ] +[[package]] +name = "azure-ai-documentintelligence" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "isodate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/8115cd713e2caa5e44def85f2b7ebd02a74ae74d7113ba20bdd41fd6dd80/azure_ai_documentintelligence-1.0.2.tar.gz", hash = "sha256:4d75a2513f2839365ebabc0e0e1772f5601b3a8c9a71e75da12440da13b63484", size = 170940, upload-time = "2025-03-27T02:46:20.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/75/c9ec040f23082f54ffb1977ff8f364c2d21c79a640a13d1c1809e7fd6b1a/azure_ai_documentintelligence-1.0.2-py3-none-any.whl", hash = "sha256:e1fb446abbdeccc9759d897898a0fe13141ed29f9ad11fc705f951925822ed59", size = 106005, upload-time = "2025-03-27T02:46:22.356Z" }, +] + +[[package]] +name = "azure-core" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/1b/e503e08e755ea94e7d3419c9242315f888fc664211c90d032e40479022bf/azure_core-1.38.0.tar.gz", hash = "sha256:8194d2682245a3e4e3151a667c686464c3786fed7918b394d035bdcd61bb5993", size = 363033, upload-time = "2026-01-12T17:03:05.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/d8/b8fcba9464f02b121f39de2db2bf57f0b216fe11d014513d666e8634380d/azure_core-1.38.0-py3-none-any.whl", hash = "sha256:ab0c9b2cd71fecb1842d52c965c95285d3cfb38902f6766e4a471f1cd8905335", size = 217825, upload-time = "2026-01-12T17:03:07.291Z" }, +] + [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] -name = "backrefs" -version = "5.9" +name = "banks" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/a7/312f673df6a79003279e1f55619abbe7daebbb87c17c976ddc0345c04c7b/backrefs-5.9.tar.gz", hash = "sha256:808548cb708d66b82ee231f962cb36faaf4f2baab032f2fbb783e9c2fdddaa59", size = 5765857, upload-time = "2025-06-22T19:34:13.97Z" } +dependencies = [ + { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "griffe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/64/9a4e17dfe7dc172594ffb877a287859edb40d59e0564bc930941e6c5df9d/banks-2.3.0.tar.gz", hash = "sha256:1ecb439a0b340588fcf9a8072d806540aad03c4b874ab9aff59ac8bc08c112ff", size = 182736, upload-time = "2026-01-21T10:03:15.114Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/4d/798dc1f30468134906575156c089c492cf79b5a5fd373f07fe26c4d046bf/backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f", size = 380267, upload-time = "2025-06-22T19:34:05.252Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/f0b3375bf0d06014e9787797e6b7cc02b38ac9ff9726ccfe834d94e9991e/backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf", size = 392072, upload-time = "2025-06-22T19:34:06.743Z" }, - { url = "https://files.pythonhosted.org/packages/9d/12/4f345407259dd60a0997107758ba3f221cf89a9b5a0f8ed5b961aef97253/backrefs-5.9-py312-none-any.whl", hash = "sha256:7fdf9771f63e6028d7fee7e0c497c81abda597ea45d6b8f89e8ad76994f5befa", size = 397947, upload-time = "2025-06-22T19:34:08.172Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/fa31834dc27a7f05e5290eae47c82690edc3a7b37d58f7fb35a1bdbf355b/backrefs-5.9-py313-none-any.whl", hash = "sha256:cc37b19fa219e93ff825ed1fed8879e47b4d89aa7a1884860e2db64ccd7c676b", size = 399843, upload-time = "2025-06-22T19:34:09.68Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b29af34b2c9c41645a9f4ff117bae860291780d73880f449e0b5d948c070/backrefs-5.9-py314-none-any.whl", hash = "sha256:df5e169836cc8acb5e440ebae9aad4bf9d15e226d3bad049cf3f6a5c20cc8dc9", size = 411762, upload-time = "2025-06-22T19:34:11.037Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/392bff89415399a979be4a65357a41d92729ae8580a66073d8ec8d810f98/backrefs-5.9-py39-none-any.whl", hash = "sha256:f48ee18f6252b8f5777a22a00a09a85de0ca931658f1dd96d4406a34f3748c60", size = 380265, upload-time = "2025-06-22T19:34:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/27/d6/ccceb03dd5193d180e28411c9f880f2cc9a574251de94b9b8a21ebdf51ec/banks-2.3.0-py3-none-any.whl", hash = "sha256:ac6a5800d468f26a0d80e091c0c6971b69457d580ce34c0217ee2bf6c3f07271", size = 32748, upload-time = "2026-01-21T10:03:14.251Z" }, ] [[package]] name = "billiard" -version = "4.2.2" +version = "4.2.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/6a/1405343016bce8354b29d90aad6b0bf6485b5e60404516e4b9a3a9646cf0/billiard-4.2.2.tar.gz", hash = "sha256:e815017a062b714958463e07ba15981d802dc53d41c5b69d28c5a7c238f8ecf3", size = 155592, upload-time = "2025-09-20T14:44:40.456Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/23/b12ac0bcdfb7360d664f40a00b1bda139cbbbced012c34e375506dbd0143/billiard-4.2.4.tar.gz", hash = "sha256:55f542c371209e03cd5862299b74e52e4fbcba8250ba611ad94276b369b6a85f", size = 156537, upload-time = "2025-11-30T13:28:48.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/80/ef8dff49aae0e4430f81842f7403e14e0ca59db7bbaf7af41245b67c6b25/billiard-4.2.2-py3-none-any.whl", hash = "sha256:4bc05dcf0d1cc6addef470723aac2a6232f3c7ed7475b0b580473a9145829457", size = 86896, upload-time = "2025-09-20T14:44:39.157Z" }, + { url = "https://files.pythonhosted.org/packages/cb/87/8bab77b323f16d67be364031220069f79159117dd5e43eeb4be2fef1ac9b/billiard-4.2.4-py3-none-any.whl", hash = "sha256:525b42bdec68d2b983347ac312f892db930858495db601b5836ac24e6477cde5", size = 87070, upload-time = "2025-11-30T13:28:47.016Z" }, ] [[package]] name = "bleach" -version = "6.2.0" +version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, ] [[package]] name = "brotli" -version = "1.1.0" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270, upload-time = "2023-09-07T14:05:41.643Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/3a/dbf4fb970c1019a57b5e492e1e0eae745d32e59ba4d6161ab5422b08eefe/Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752", size = 873045, upload-time = "2023-09-07T14:03:16.894Z" }, - { url = "https://files.pythonhosted.org/packages/dd/11/afc14026ea7f44bd6eb9316d800d439d092c8d508752055ce8d03086079a/Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9", size = 446218, upload-time = "2023-09-07T14:03:18.917Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/7545a6e7729db43cb36c4287ae388d6885c85a86dd251768a47015dfde32/Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3", size = 2903872, upload-time = "2023-09-07T14:03:20.398Z" }, - { url = "https://files.pythonhosted.org/packages/32/23/35331c4d9391fcc0f29fd9bec2c76e4b4eeab769afbc4b11dd2e1098fb13/Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d", size = 2941254, upload-time = "2023-09-07T14:03:21.914Z" }, - { url = "https://files.pythonhosted.org/packages/3b/24/1671acb450c902edb64bd765d73603797c6c7280a9ada85a195f6b78c6e5/Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e", size = 2857293, upload-time = "2023-09-07T14:03:24Z" }, - { url = "https://files.pythonhosted.org/packages/d5/00/40f760cc27007912b327fe15bf6bfd8eaecbe451687f72a8abc587d503b3/Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da", size = 3002385, upload-time = "2023-09-07T14:03:26.248Z" }, - { url = "https://files.pythonhosted.org/packages/b8/cb/8aaa83f7a4caa131757668c0fb0c4b6384b09ffa77f2fba9570d87ab587d/Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80", size = 2911104, upload-time = "2023-09-07T14:03:27.849Z" }, - { url = "https://files.pythonhosted.org/packages/bc/c4/65456561d89d3c49f46b7fbeb8fe6e449f13bdc8ea7791832c5d476b2faf/Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d", size = 2809981, upload-time = "2023-09-07T14:03:29.92Z" }, - { url = "https://files.pythonhosted.org/packages/05/1b/cf49528437bae28abce5f6e059f0d0be6fecdcc1d3e33e7c54b3ca498425/Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0", size = 2935297, upload-time = "2023-09-07T14:03:32.035Z" }, - { url = "https://files.pythonhosted.org/packages/81/ff/190d4af610680bf0c5a09eb5d1eac6e99c7c8e216440f9c7cfd42b7adab5/Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e", size = 2930735, upload-time = "2023-09-07T14:03:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/80/7d/f1abbc0c98f6e09abd3cad63ec34af17abc4c44f308a7a539010f79aae7a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c", size = 2933107, upload-time = "2024-10-18T12:32:09.016Z" }, - { url = "https://files.pythonhosted.org/packages/34/ce/5a5020ba48f2b5a4ad1c0522d095ad5847a0be508e7d7569c8630ce25062/Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1", size = 2845400, upload-time = "2024-10-18T12:32:11.134Z" }, - { url = "https://files.pythonhosted.org/packages/44/89/fa2c4355ab1eecf3994e5a0a7f5492c6ff81dfcb5f9ba7859bd534bb5c1a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2", size = 3031985, upload-time = "2024-10-18T12:32:12.813Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/79196b4a1674143d19dca400866b1a4d1a089040df7b93b88ebae81f3447/Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec", size = 2927099, upload-time = "2024-10-18T12:32:14.733Z" }, - { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068, upload-time = "2023-09-07T14:03:37.779Z" }, - { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244, upload-time = "2023-09-07T14:03:39.223Z" }, - { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500, upload-time = "2023-09-07T14:03:40.858Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950, upload-time = "2023-09-07T14:03:42.896Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527, upload-time = "2023-09-07T14:03:44.552Z" }, - { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489, upload-time = "2023-09-07T14:03:46.594Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080, upload-time = "2023-09-07T14:03:48.204Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051, upload-time = "2023-09-07T14:03:50.348Z" }, - { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172, upload-time = "2023-09-07T14:03:52.395Z" }, - { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023, upload-time = "2023-09-07T14:03:53.96Z" }, - { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871, upload-time = "2024-10-18T12:32:16.688Z" }, - { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784, upload-time = "2024-10-18T12:32:18.459Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905, upload-time = "2024-10-18T12:32:20.192Z" }, - { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467, upload-time = "2024-10-18T12:32:21.774Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693, upload-time = "2024-10-18T12:32:23.824Z" }, - { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489, upload-time = "2024-10-18T12:32:25.641Z" }, - { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081, upload-time = "2023-09-07T14:03:57.967Z" }, - { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244, upload-time = "2023-09-07T14:03:59.319Z" }, - { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505, upload-time = "2023-09-07T14:04:01.327Z" }, - { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152, upload-time = "2023-09-07T14:04:03.033Z" }, - { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252, upload-time = "2023-09-07T14:04:04.675Z" }, - { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955, upload-time = "2023-09-07T14:04:06.585Z" }, - { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304, upload-time = "2023-09-07T14:04:08.668Z" }, - { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452, upload-time = "2023-09-07T14:04:10.736Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751, upload-time = "2023-09-07T14:04:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757, upload-time = "2023-09-07T14:04:14.551Z" }, - { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146, upload-time = "2024-10-18T12:32:27.257Z" }, - { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055, upload-time = "2024-10-18T12:32:29.376Z" }, - { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102, upload-time = "2024-10-18T12:32:31.371Z" }, - { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029, upload-time = "2024-10-18T12:32:33.293Z" }, - { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681, upload-time = "2024-10-18T12:32:34.942Z" }, - { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475, upload-time = "2024-10-18T12:32:36.485Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173, upload-time = "2024-10-18T12:32:37.978Z" }, - { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803, upload-time = "2024-10-18T12:32:39.606Z" }, - { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946, upload-time = "2024-10-18T12:32:41.679Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707, upload-time = "2024-10-18T12:32:43.478Z" }, - { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231, upload-time = "2024-10-18T12:32:45.224Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157, upload-time = "2024-10-18T12:32:46.894Z" }, - { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122, upload-time = "2024-10-18T12:32:48.844Z" }, - { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206, upload-time = "2024-10-18T12:32:51.198Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, + { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, + { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, + { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, + { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, + { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, + { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, ] [[package]] @@ -210,9 +359,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/0e/7d8225aab3bc1a0f5811f8e1b557aa034ac04bdf641925b30d3caf586b28/cached_property-2.0.1-py3-none-any.whl", hash = "sha256:f617d70ab1100b7bcf6e42228f9ddcb78c676ffa167278d9f730d1c2fba69ccb", size = 7428, upload-time = "2024-10-25T15:43:54.711Z" }, ] +[[package]] +name = "cbor2" +version = "5.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/8e/8b4fdde28e42ffcd741a37f4ffa9fb59cd4fe01625b544dfcfd9ccb54f01/cbor2-5.8.0.tar.gz", hash = "sha256:b19c35fcae9688ac01ef75bad5db27300c2537eb4ee00ed07e05d8456a0d4931", size = 107825, upload-time = "2025-12-30T18:44:22.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/4b/623435ef9b98e86b6956a41863d39ff4fe4d67983948b5834f55499681dd/cbor2-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ac191640093e6c7fbcb174c006ffec4106c3d8ab788e70272c1c4d933cbe11", size = 69875, upload-time = "2025-12-30T18:43:35.888Z" }, + { url = "https://files.pythonhosted.org/packages/58/17/f664201080b2a7d0f57c16c8e9e5922013b92f202e294863ec7e75b7ff7f/cbor2-5.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fddee9103a17d7bed5753f0c7fc6663faa506eb953e50d8287804eccf7b048e6", size = 268316, upload-time = "2025-12-30T18:43:37.161Z" }, + { url = "https://files.pythonhosted.org/packages/d0/e1/072745b4ff01afe9df2cd627f8fc51a1acedb5d3d1253765625d2929db91/cbor2-5.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d2ea26fad620aba5e88d7541be8b10c5034a55db9a23809b7cb49f36803f05b", size = 258874, upload-time = "2025-12-30T18:43:38.878Z" }, + { url = "https://files.pythonhosted.org/packages/a7/10/61c262b886d22b62c56e8aac6d10fa06d0953c997879ab882a31a624952b/cbor2-5.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:de68b4b310b072b082d317adc4c5e6910173a6d9455412e6183d72c778d1f54c", size = 261971, upload-time = "2025-12-30T18:43:40.401Z" }, + { url = "https://files.pythonhosted.org/packages/7e/42/b7862f5e64364b10ad120ea53e87ec7e891fb268cb99c572348e647cf7e9/cbor2-5.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:418d2cf0e03e90160fa1474c05a40fe228bbb4a92d1628bdbbd13a48527cb34d", size = 254151, upload-time = "2025-12-30T18:43:41.938Z" }, + { url = "https://files.pythonhosted.org/packages/2f/4f/3a16e3e8fd7e5fd86751a4f1aad218a8d19a96e75ec3989c3e95a8fe1d8f/cbor2-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b3f91fa699a5ce22470e973601c62dd9d55dc3ca20ee446516ac075fcab27c9", size = 70270, upload-time = "2025-12-30T18:43:46.005Z" }, + { url = "https://files.pythonhosted.org/packages/38/81/0d0cf0796fe8081492a61c45278f03def21a929535a492dd97c8438f5dbe/cbor2-5.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:518c118a5e00001854adb51f3164e647aa99b6a9877d2a733a28cb5c0a4d6857", size = 286242, upload-time = "2025-12-30T18:43:47.026Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/fdab6c10190cfb8d639e01f2b168f2406fc847a2a6bc00e7de78c3381d0a/cbor2-5.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cff2a1999e49cd51c23d1b6786a012127fd8f722c5946e82bd7ab3eb307443f3", size = 285412, upload-time = "2025-12-30T18:43:48.563Z" }, + { url = "https://files.pythonhosted.org/packages/31/59/746a8e630996217a3afd523f583fcf7e3d16640d63f9a03f0f4e4f74b5b1/cbor2-5.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c4492160212374973cdc14e46f0565f2462721ef922b40f7ea11e7d613dfb2a", size = 278041, upload-time = "2025-12-30T18:43:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a3/f3bbeb6dedd45c6e0cddd627ea790dea295eaf82c83f0e2159b733365ebd/cbor2-5.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:546c7c7c4c6bcdc54a59242e0e82cea8f332b17b4465ae628718fef1fce401ca", size = 278185, upload-time = "2025-12-30T18:43:51.192Z" }, + { url = "https://files.pythonhosted.org/packages/a6/0d/5a3f20bafaefeb2c1903d961416f051c0950f0d09e7297a3aa6941596b29/cbor2-5.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6d8d104480845e2f28c6165b4c961bbe58d08cb5638f368375cfcae051c28015", size = 70332, upload-time = "2025-12-30T18:43:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/57/66/177a3f089e69db69c987453ab4934086408c3338551e4984734597be9f80/cbor2-5.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43efee947e5ab67d406d6e0dc61b5dee9d2f5e89ae176f90677a3741a20ca2e7", size = 285985, upload-time = "2025-12-30T18:43:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/9e17b8e4ed80a2ce97e2dfa5915c169dbb31599409ddb830f514b57f96cc/cbor2-5.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be7ae582f50be539e09c134966d0fd63723fc4789b8dff1f6c2e3f24ae3eaf32", size = 285173, upload-time = "2025-12-30T18:43:57.321Z" }, + { url = "https://files.pythonhosted.org/packages/cc/33/9f92e107d78f88ac22723ac15d0259d220ba98c1d855e51796317f4c4114/cbor2-5.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50f5c709561a71ea7970b4cd2bf9eda4eccacc0aac212577080fdfe64183e7f5", size = 278395, upload-time = "2025-12-30T18:43:58.497Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3f/46b80050a4a35ce5cf7903693864a9fdea7213567dc8faa6e25cb375c182/cbor2-5.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6790ecc73aa93e76d2d9076fc42bf91a9e69f2295e5fa702e776dbe986465bd", size = 278330, upload-time = "2025-12-30T18:43:59.656Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0c/0654233d7543ac8a50f4785f172430ddc97538ba418eb305d6e529d1a120/cbor2-5.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ad72381477133046ce217617d839ea4e9454f8b77d9a6351b229e214102daeb7", size = 70710, upload-time = "2025-12-30T18:44:03.209Z" }, + { url = "https://files.pythonhosted.org/packages/84/62/4671d24e557d7f5a74a01b422c538925140c0495e57decde7e566f91d029/cbor2-5.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6da25190fad3434ce99876b11d4ca6b8828df6ca232cf7344cd14ae1166fb718", size = 285005, upload-time = "2025-12-30T18:44:05.109Z" }, + { url = "https://files.pythonhosted.org/packages/87/85/0c67d763a08e848c9a80d7e4723ba497cce676f41bc7ca1828ae90a0a872/cbor2-5.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c13919e3a24c5a6d286551fa288848a4cedc3e507c58a722ccd134e461217d99", size = 282435, upload-time = "2025-12-30T18:44:06.465Z" }, + { url = "https://files.pythonhosted.org/packages/b2/01/0650972b4dbfbebcfbe37cbba7fc3cd9019a8da6397ab3446e07175e342b/cbor2-5.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f8c40d32e5972047a777f9bf730870828f3cf1c43b3eb96fd0429c57a1d3b9e6", size = 277493, upload-time = "2025-12-30T18:44:07.609Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6c/7704a4f32adc7f10f3b41ec067f500a4458f7606397af5e4cf2d368fd288/cbor2-5.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7627894bc0b3d5d0807f31e3107e11b996205470c4429dc2bb4ef8bfe7f64e1e", size = 276085, upload-time = "2025-12-30T18:44:09.021Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4f/101071f880b4da05771128c0b89f41e334cff044dee05fb013c8f4be661c/cbor2-5.8.0-py3-none-any.whl", hash = "sha256:3727d80f539567b03a7aa11890e57798c67092c38df9e6c23abb059e0f65069c", size = 24374, upload-time = "2025-12-30T18:44:21.476Z" }, +] + [[package]] name = "celery" -version = "5.5.3" +version = "5.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "billiard", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -222,11 +400,12 @@ dependencies = [ { name = "click-repl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "kombu", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tzlocal", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "vine", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/7d/6c289f407d219ba36d8b384b42489ebdd0c84ce9c413875a8aae0c85f35b/celery-5.5.3.tar.gz", hash = "sha256:6c972ae7968c2b5281227f01c3a3f984037d21c5129d07bf3550cc2afc6b10a5", size = 1667144, upload-time = "2025-06-01T11:08:12.563Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/9d/3d13596519cfa7207a6f9834f4b082554845eb3cd2684b5f8535d50c7c44/celery-5.6.2.tar.gz", hash = "sha256:4a8921c3fcf2ad76317d3b29020772103581ed2454c4c042cc55dcc43585009b", size = 1718802, upload-time = "2026-01-04T12:35:58.012Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/af/0dcccc7fdcdf170f9a1585e5e96b6fb0ba1749ef6be8c89a6202284759bd/celery-5.5.3-py3-none-any.whl", hash = "sha256:0b5761a07057acee94694464ca482416b959568904c9dfa41ce8413a7d65d525", size = 438775, upload-time = "2025-06-01T11:08:09.94Z" }, + { url = "https://files.pythonhosted.org/packages/dd/bd/9ecd619e456ae4ba73b6583cc313f26152afae13e9a82ac4fe7f8856bfd1/celery-5.6.2-py3-none-any.whl", hash = "sha256:3ffafacbe056951b629c7abcf9064c4a2366de0bdfc9fdba421b97ebb68619a5", size = 445502, upload-time = "2026-01-04T12:35:55.894Z" }, ] [package.optional-dependencies] @@ -236,23 +415,23 @@ redis = [ [[package]] name = "celery-types" -version = "0.23.0" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/d1/0823e71c281e4ad0044e278cf1577d1a68e05f2809424bf94e1614925c5d/celery_types-0.23.0.tar.gz", hash = "sha256:402ed0555aea3cd5e1e6248f4632e4f18eec8edb2435173f9e6dc08449fa101e", size = 31479, upload-time = "2025-03-03T23:56:51.547Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/25/2276a1f00f8ab9fc88128c939333933a24db7df1d75aa57ecc27b7dd3a22/celery_types-0.24.0.tar.gz", hash = "sha256:c93fbcd0b04a9e9c2f55d5540aca4aa1ea4cc06a870c0c8dee5062fdd59663fe", size = 33148, upload-time = "2025-12-23T17:16:30.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/8b/92bb54dd74d145221c3854aa245c84f4dc04cc9366147496182cec8e88e3/celery_types-0.23.0-py3-none-any.whl", hash = "sha256:0cc495b8d7729891b7e070d0ec8d4906d2373209656a6e8b8276fe1ed306af9a", size = 50189, upload-time = "2025-03-03T23:56:50.458Z" }, + { url = "https://files.pythonhosted.org/packages/3a/7e/3252cba5f5c9a65a3f52a69734d8e51e023db8981022b503e8183cf0225e/celery_types-0.24.0-py3-none-any.whl", hash = "sha256:a21e04681e68719a208335e556a79909da4be9c5e0d6d2fd0dd4c5615954b3fd", size = 60473, upload-time = "2025-12-23T17:16:29.89Z" }, ] [[package]] name = "certifi" -version = "2025.8.3" +version = "2026.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -264,16 +443,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, @@ -320,26 +489,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, ] -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, -] - [[package]] name = "channels" -version = "4.3.1" +version = "4.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/a0/46450fcf9e56af18a6b0440ba49db6635419bb7bc84142c35f4143b1a66c/channels-4.3.1.tar.gz", hash = "sha256:97413ffd674542db08e16a9ef09cd86ec0113e5f8125fbd33cf0854adcf27cdb", size = 26896, upload-time = "2025-08-01T13:25:19.952Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/92/b18d4bb54d14986a8b35215a1c9e6a7f9f4d57ca63ac9aee8290ebb4957d/channels-4.3.2.tar.gz", hash = "sha256:f2bb6bfb73ad7fb4705041d07613c7b4e69528f01ef8cb9fb6c21d9295f15667", size = 27023, upload-time = "2025-11-20T15:13:05.102Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/1c/eae1c2a8c195760376e7f65d0bdcc3e966695d29cfbe5c54841ce5c71408/channels-4.3.1-py3-none-any.whl", hash = "sha256:b091d4b26f91d807de3e84aead7ba785314f27eaf5bac31dd51b1c956b883859", size = 31286, upload-time = "2025-08-01T13:25:18.845Z" }, + { url = "https://files.pythonhosted.org/packages/16/34/c32915288b7ef482377b6adc401192f98c6a99b3a145423d3b8aed807898/channels-4.3.2-py3-none-any.whl", hash = "sha256:fef47e9055a603900cf16cef85f050d522d9ac4b3daccf24835bd9580705c176", size = 31313, upload-time = "2025-11-20T15:13:02.357Z" }, ] [[package]] @@ -359,65 +519,72 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/98/f3b8013223728a99b908c9344da3aa04ee6e3fa235f19409033eda92fb78/charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", size = 207695, upload-time = "2025-08-09T07:55:36.452Z" }, - { url = "https://files.pythonhosted.org/packages/21/40/5188be1e3118c82dcb7c2a5ba101b783822cfb413a0268ed3be0468532de/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", size = 147153, upload-time = "2025-08-09T07:55:38.467Z" }, - { url = "https://files.pythonhosted.org/packages/37/60/5d0d74bc1e1380f0b72c327948d9c2aca14b46a9efd87604e724260f384c/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", size = 160428, upload-time = "2025-08-09T07:55:40.072Z" }, - { url = "https://files.pythonhosted.org/packages/85/9a/d891f63722d9158688de58d050c59dc3da560ea7f04f4c53e769de5140f5/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", size = 157627, upload-time = "2025-08-09T07:55:41.706Z" }, - { url = "https://files.pythonhosted.org/packages/65/1a/7425c952944a6521a9cfa7e675343f83fd82085b8af2b1373a2409c683dc/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", size = 152388, upload-time = "2025-08-09T07:55:43.262Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c9/a2c9c2a355a8594ce2446085e2ec97fd44d323c684ff32042e2a6b718e1d/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", size = 150077, upload-time = "2025-08-09T07:55:44.903Z" }, - { url = "https://files.pythonhosted.org/packages/3b/38/20a1f44e4851aa1c9105d6e7110c9d020e093dfa5836d712a5f074a12bf7/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", size = 161631, upload-time = "2025-08-09T07:55:46.346Z" }, - { url = "https://files.pythonhosted.org/packages/a4/fa/384d2c0f57edad03d7bec3ebefb462090d8905b4ff5a2d2525f3bb711fac/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", size = 159210, upload-time = "2025-08-09T07:55:47.539Z" }, - { url = "https://files.pythonhosted.org/packages/33/9e/eca49d35867ca2db336b6ca27617deed4653b97ebf45dfc21311ce473c37/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", size = 153739, upload-time = "2025-08-09T07:55:48.744Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, - { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, - { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, - { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, - { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, - { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, - { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, - { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, - { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, - { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, - { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, - { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, - { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, - { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, - { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, - { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, - { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, - { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, - { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, - { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] [[package]] name = "click" -version = "8.2.1" +version = "8.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] @@ -468,14 +635,14 @@ wheels = [ [[package]] name = "concurrent-log-handler" -version = "0.9.28" +version = "0.9.29" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "portalocker", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/ed/68b9c3a07a2331361a09a194e4375c4ee680a799391cfb1ca924ca2b6523/concurrent_log_handler-0.9.28.tar.gz", hash = "sha256:4cc27969b3420239bd153779266f40d9713ece814e312b7aa753ce62c6eacdb8", size = 30935, upload-time = "2025-06-10T19:02:15.622Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/2c/ba185acc438cff6b58cd8f8dec27e7f4fcabf6968a1facbb6d0cacbde7fe/concurrent_log_handler-0.9.29.tar.gz", hash = "sha256:bc37a76d3f384cbf4a98f693ebd770543edc0f4cd5c6ab6bc70e9e1d7d582265", size = 42114, upload-time = "2026-02-22T18:18:25.758Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/a0/1331c3f12d95adc8d0385dc620001054c509db88376d2e17be36b6353020/concurrent_log_handler-0.9.28-py3-none-any.whl", hash = "sha256:65db25d05506651a61573937880789fc51c7555e7452303042b5a402fd78939c", size = 28983, upload-time = "2025-06-10T19:02:14.223Z" }, + { url = "https://files.pythonhosted.org/packages/4a/f3/3e3188fdb3e53c6343fd1c7de41c55d4db626f07db3877eae77b28d58bd2/concurrent_log_handler-0.9.29-py3-none-any.whl", hash = "sha256:0d6c077fbaef2dae49a25975dcf72a602fe0a6a4ce80a3b7c37696d37e10459a", size = 32052, upload-time = "2026-02-22T18:18:24.558Z" }, ] [[package]] @@ -489,81 +656,71 @@ wheels = [ [[package]] name = "coverage" -version = "7.10.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, - { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, - { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, - { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, - { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, - { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, - { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, - { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, - { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, - { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, - { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, - { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, - { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, - { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, - { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, - { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, - { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, - { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, - { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, - { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, - { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, - { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, - { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, - { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, - { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, - { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, - { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, - { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, - { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, - { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, - { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, - { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, - { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, - { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, - { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, - { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, - { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, - { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, - { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, - { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, - { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, - { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +version = "7.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/01/abca50583a8975bb6e1c59eff67ed8e48bb127c07dad5c28d9e96ccc09ec/coverage-7.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:060ebf6f2c51aff5ba38e1f43a2095e087389b1c69d559fde6049a4b0001320e", size = 218971, upload-time = "2026-01-25T12:57:36.953Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0e/b6489f344d99cd1e5b4d5e1be52dfd3f8a3dc5112aa6c33948da8cabad4e/coverage-7.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1ea8ca9db5e7469cd364552985e15911548ea5b69c48a17291f0cac70484b2e", size = 219473, upload-time = "2026-01-25T12:57:38.934Z" }, + { url = "https://files.pythonhosted.org/packages/17/11/db2f414915a8e4ec53f60b17956c27f21fb68fcf20f8a455ce7c2ccec638/coverage-7.13.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b780090d15fd58f07cf2011943e25a5f0c1c894384b13a216b6c86c8a8a7c508", size = 249896, upload-time = "2026-01-25T12:57:40.365Z" }, + { url = "https://files.pythonhosted.org/packages/80/06/0823fe93913663c017e508e8810c998c8ebd3ec2a5a85d2c3754297bdede/coverage-7.13.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:88a800258d83acb803c38175b4495d293656d5fac48659c953c18e5f539a274b", size = 251810, upload-time = "2026-01-25T12:57:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/b151c3cc41b28cdf7f0166c5fa1271cbc305a8ec0124cce4b04f74791a18/coverage-7.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6326e18e9a553e674d948536a04a80d850a5eeefe2aae2e6d7cf05d54046c01b", size = 253920, upload-time = "2026-01-25T12:57:44.026Z" }, + { url = "https://files.pythonhosted.org/packages/2d/35/e83de0556e54a4729a2b94ea816f74ce08732e81945024adee46851c2264/coverage-7.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59562de3f797979e1ff07c587e2ac36ba60ca59d16c211eceaa579c266c5022f", size = 250025, upload-time = "2026-01-25T12:57:45.624Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/af2eb9c3926ce3ea0d58a0d2516fcbdacf7a9fc9559fe63076beaf3f2596/coverage-7.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27ba1ed6f66b0e2d61bfa78874dffd4f8c3a12f8e2b5410e515ab345ba7bc9c3", size = 251612, upload-time = "2026-01-25T12:57:47.713Z" }, + { url = "https://files.pythonhosted.org/packages/26/62/5be2e25f3d6c711d23b71296f8b44c978d4c8b4e5b26871abfc164297502/coverage-7.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8be48da4d47cc68754ce643ea50b3234557cbefe47c2f120495e7bd0a2756f2b", size = 249670, upload-time = "2026-01-25T12:57:49.378Z" }, + { url = "https://files.pythonhosted.org/packages/b3/51/400d1b09a8344199f9b6a6fc1868005d766b7ea95e7882e494fa862ca69c/coverage-7.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2a47a4223d3361b91176aedd9d4e05844ca67d7188456227b6bf5e436630c9a1", size = 249395, upload-time = "2026-01-25T12:57:50.86Z" }, + { url = "https://files.pythonhosted.org/packages/e0/36/f02234bc6e5230e2f0a63fd125d0a2093c73ef20fdf681c7af62a140e4e7/coverage-7.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6f141b468740197d6bd38f2b26ade124363228cc3f9858bd9924ab059e00059", size = 250298, upload-time = "2026-01-25T12:57:52.287Z" }, + { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, + { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, + { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, + { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, + { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f0/3d3eac7568ab6096ff23791a526b0048a1ff3f49d0e236b2af6fb6558e88/coverage-7.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed75de7d1217cf3b99365d110975f83af0528c849ef5180a12fd91b5064df9d6", size = 219168, upload-time = "2026-01-25T12:58:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a6/f8b5cfeddbab95fdef4dcd682d82e5dcff7a112ced57a959f89537ee9995/coverage-7.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97e596de8fa9bada4d88fde64a3f4d37f1b6131e4faa32bad7808abc79887ddc", size = 219537, upload-time = "2026-01-25T12:58:24.932Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e6/8d8e6e0c516c838229d1e41cadcec91745f4b1031d4db17ce0043a0423b4/coverage-7.13.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:68c86173562ed4413345410c9480a8d64864ac5e54a5cda236748031e094229f", size = 250528, upload-time = "2026-01-25T12:58:26.567Z" }, + { url = "https://files.pythonhosted.org/packages/8e/78/befa6640f74092b86961f957f26504c8fba3d7da57cc2ab7407391870495/coverage-7.13.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7be4d613638d678b2b3773b8f687537b284d7074695a43fe2fbbfc0e31ceaed1", size = 253132, upload-time = "2026-01-25T12:58:28.251Z" }, + { url = "https://files.pythonhosted.org/packages/9d/10/1630db1edd8ce675124a2ee0f7becc603d2bb7b345c2387b4b95c6907094/coverage-7.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7f63ce526a96acd0e16c4af8b50b64334239550402fb1607ce6a584a6d62ce9", size = 254374, upload-time = "2026-01-25T12:58:30.294Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/0d9381647b1e8e6d310ac4140be9c428a0277330991e0c35bdd751e338a4/coverage-7.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:406821f37f864f968e29ac14c3fccae0fec9fdeba48327f0341decf4daf92d7c", size = 250762, upload-time = "2026-01-25T12:58:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5636dfc9a7c871ee8776af83ee33b4c26bc508ad6cee1e89b6419a366582/coverage-7.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ee68e5a4e3e5443623406b905db447dceddffee0dceb39f4e0cd9ec2a35004b5", size = 252502, upload-time = "2026-01-25T12:58:33.961Z" }, + { url = "https://files.pythonhosted.org/packages/02/2a/7ff2884d79d420cbb2d12fed6fff727b6d0ef27253140d3cdbbd03187ee0/coverage-7.13.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2ee0e58cca0c17dd9c6c1cdde02bb705c7b3fbfa5f3b0b5afeda20d4ebff8ef4", size = 250463, upload-time = "2026-01-25T12:58:35.529Z" }, + { url = "https://files.pythonhosted.org/packages/91/c0/ba51087db645b6c7261570400fc62c89a16278763f36ba618dc8657a187b/coverage-7.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e5bbb5018bf76a56aabdb64246b5288d5ae1b7d0dd4d0534fe86df2c2992d1c", size = 250288, upload-time = "2026-01-25T12:58:37.226Z" }, + { url = "https://files.pythonhosted.org/packages/03/07/44e6f428551c4d9faf63ebcefe49b30e5c89d1be96f6a3abd86a52da9d15/coverage-7.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a55516c68ef3e08e134e818d5e308ffa6b1337cc8b092b69b24287bf07d38e31", size = 252063, upload-time = "2026-01-25T12:58:38.821Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f7/080376c029c8f76fadfe43911d0daffa0cbdc9f9418a0eead70c56fb7f4b/coverage-7.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e64fa5a1e41ce5df6b547cbc3d3699381c9e2c2c369c67837e716ed0f549d48e", size = 219861, upload-time = "2026-01-25T12:58:46.586Z" }, + { url = "https://files.pythonhosted.org/packages/42/11/0b5e315af5ab35f4c4a70e64d3314e4eec25eefc6dec13be3a7d5ffe8ac5/coverage-7.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b01899e82a04085b6561eb233fd688474f57455e8ad35cd82286463ba06332b7", size = 220207, upload-time = "2026-01-25T12:58:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0c/0874d0318fb1062117acbef06a09cf8b63f3060c22265adaad24b36306b7/coverage-7.13.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:838943bea48be0e2768b0cf7819544cdedc1bbb2f28427eabb6eb8c9eb2285d3", size = 261504, upload-time = "2026-01-25T12:58:49.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/5e/1cd72c22ecb30751e43a72f40ba50fcef1b7e93e3ea823bd9feda8e51f9a/coverage-7.13.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:93d1d25ec2b27e90bcfef7012992d1f5121b51161b8bffcda756a816cf13c2c3", size = 263582, upload-time = "2026-01-25T12:58:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/8acf356707c7a42df4d0657020308e23e5a07397e81492640c186268497c/coverage-7.13.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93b57142f9621b0d12349c43fc7741fe578e4bc914c1e5a54142856cfc0bf421", size = 266008, upload-time = "2026-01-25T12:58:53.234Z" }, + { url = "https://files.pythonhosted.org/packages/41/41/ea1730af99960309423c6ea8d6a4f1fa5564b2d97bd1d29dda4b42611f04/coverage-7.13.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f06799ae1bdfff7ccb8665d75f8291c69110ba9585253de254688aa8a1ccc6c5", size = 260762, upload-time = "2026-01-25T12:58:55.372Z" }, + { url = "https://files.pythonhosted.org/packages/22/fa/02884d2080ba71db64fdc127b311db60e01fe6ba797d9c8363725e39f4d5/coverage-7.13.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f9405ab4f81d490811b1d91c7a20361135a2df4c170e7f0b747a794da5b7f23", size = 263571, upload-time = "2026-01-25T12:58:57.52Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/4083aaaeba9b3112f55ac57c2ce7001dc4d8fa3fcc228a39f09cc84ede27/coverage-7.13.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f9ab1d5b86f8fbc97a5b3cd6280a3fd85fef3b028689d8a2c00918f0d82c728c", size = 261200, upload-time = "2026-01-25T12:58:59.255Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d2/aea92fa36d61955e8c416ede9cf9bf142aa196f3aea214bb67f85235a050/coverage-7.13.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:f674f59712d67e841525b99e5e2b595250e39b529c3bda14764e4f625a3fa01f", size = 260095, upload-time = "2026-01-25T12:59:01.066Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ae/04ffe96a80f107ea21b22b2367175c621da920063260a1c22f9452fd7866/coverage-7.13.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c6cadac7b8ace1ba9144feb1ae3cb787a6065ba6d23ffc59a934b16406c26573", size = 262284, upload-time = "2026-01-25T12:59:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/55/53/1da9e51a0775634b04fcc11eb25c002fc58ee4f92ce2e8512f94ac5fc5bf/coverage-7.13.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:387a825f43d680e7310e6f325b2167dd093bc8ffd933b83e9aa0983cf6e0a2ef", size = 219213, upload-time = "2026-01-25T12:59:11.909Z" }, + { url = "https://files.pythonhosted.org/packages/46/35/b3caac3ebbd10230fea5a33012b27d19e999a17c9285c4228b4b2e35b7da/coverage-7.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f0d7fea9d8e5d778cd5a9e8fc38308ad688f02040e883cdc13311ef2748cb40f", size = 219549, upload-time = "2026-01-25T12:59:13.638Z" }, + { url = "https://files.pythonhosted.org/packages/76/9c/e1cf7def1bdc72c1907e60703983a588f9558434a2ff94615747bd73c192/coverage-7.13.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e080afb413be106c95c4ee96b4fffdc9e2fa56a8bbf90b5c0918e5c4449412f5", size = 250586, upload-time = "2026-01-25T12:59:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ba/49/f54ec02ed12be66c8d8897270505759e057b0c68564a65c429ccdd1f139e/coverage-7.13.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a7fc042ba3c7ce25b8a9f097eb0f32a5ce1ccdb639d9eec114e26def98e1f8a4", size = 253093, upload-time = "2026-01-25T12:59:17.491Z" }, + { url = "https://files.pythonhosted.org/packages/fb/5e/aaf86be3e181d907e23c0f61fccaeb38de8e6f6b47aed92bf57d8fc9c034/coverage-7.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0ba505e021557f7f8173ee8cd6b926373d8653e5ff7581ae2efce1b11ef4c27", size = 254446, upload-time = "2026-01-25T12:59:19.752Z" }, + { url = "https://files.pythonhosted.org/packages/28/c8/a5fa01460e2d75b0c853b392080d6829d3ca8b5ab31e158fa0501bc7c708/coverage-7.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7de326f80e3451bd5cc7239ab46c73ddb658fe0b7649476bc7413572d36cd548", size = 250615, upload-time = "2026-01-25T12:59:21.928Z" }, + { url = "https://files.pythonhosted.org/packages/86/0b/6d56315a55f7062bb66410732c24879ccb2ec527ab6630246de5fe45a1df/coverage-7.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:abaea04f1e7e34841d4a7b343904a3f59481f62f9df39e2cd399d69a187a9660", size = 252452, upload-time = "2026-01-25T12:59:23.592Z" }, + { url = "https://files.pythonhosted.org/packages/30/19/9bc550363ebc6b0ea121977ee44d05ecd1e8bf79018b8444f1028701c563/coverage-7.13.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9f93959ee0c604bccd8e0697be21de0887b1f73efcc3aa73a3ec0fd13feace92", size = 250418, upload-time = "2026-01-25T12:59:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/580530a31ca2f0cc6f07a8f2ab5460785b02bb11bdf815d4c4d37a4c5169/coverage-7.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:13fe81ead04e34e105bf1b3c9f9cdf32ce31736ee5d90a8d2de02b9d3e1bcb82", size = 250231, upload-time = "2026-01-25T12:59:27.888Z" }, + { url = "https://files.pythonhosted.org/packages/e2/42/dd9093f919dc3088cb472893651884bd675e3df3d38a43f9053656dca9a2/coverage-7.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d6d16b0f71120e365741bca2cb473ca6fe38930bc5431c5e850ba949f708f892", size = 251888, upload-time = "2026-01-25T12:59:29.636Z" }, + { url = "https://files.pythonhosted.org/packages/b6/60/a3820c7232db63be060e4019017cd3426751c2699dab3c62819cdbcea387/coverage-7.13.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f61d349f5b7cd95c34017f1927ee379bfbe9884300d74e07cf630ccf7a610c1b", size = 219950, upload-time = "2026-01-25T12:59:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/fd/37/e4ef5975fdeb86b1e56db9a82f41b032e3d93a840ebaf4064f39e770d5c5/coverage-7.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a43d34ce714f4ca674c0d90beb760eb05aad906f2c47580ccee9da8fe8bfb417", size = 220209, upload-time = "2026-01-25T12:59:38.339Z" }, + { url = "https://files.pythonhosted.org/packages/54/df/d40e091d00c51adca1e251d3b60a8b464112efa3004949e96a74d7c19a64/coverage-7.13.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bff1b04cb9d4900ce5c56c4942f047dc7efe57e2608cb7c3c8936e9970ccdbee", size = 261576, upload-time = "2026-01-25T12:59:40.446Z" }, + { url = "https://files.pythonhosted.org/packages/c5/44/5259c4bed54e3392e5c176121af9f71919d96dde853386e7730e705f3520/coverage-7.13.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6ae99e4560963ad8e163e819e5d77d413d331fd00566c1e0856aa252303552c1", size = 263704, upload-time = "2026-01-25T12:59:42.346Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/ae9f005827abcbe2c70157459ae86053971c9fa14617b63903abbdce26d9/coverage-7.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e79a8c7d461820257d9aa43716c4efc55366d7b292e46b5b37165be1d377405d", size = 266109, upload-time = "2026-01-25T12:59:44.073Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c0/8e279c1c0f5b1eaa3ad9b0fb7a5637fc0379ea7d85a781c0fe0bb3cfc2ab/coverage-7.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:060ee84f6a769d40c492711911a76811b4befb6fba50abb450371abb720f5bd6", size = 260686, upload-time = "2026-01-25T12:59:45.804Z" }, + { url = "https://files.pythonhosted.org/packages/b2/47/3a8112627e9d863e7cddd72894171c929e94491a597811725befdcd76bce/coverage-7.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bca209d001fd03ea2d978f8a4985093240a355c93078aee3f799852c23f561a", size = 263568, upload-time = "2026-01-25T12:59:47.929Z" }, + { url = "https://files.pythonhosted.org/packages/92/bc/7ea367d84afa3120afc3ce6de294fd2dcd33b51e2e7fbe4bbfd200f2cb8c/coverage-7.13.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6b8092aa38d72f091db61ef83cb66076f18f02da3e1a75039a4f218629600e04", size = 261174, upload-time = "2026-01-25T12:59:49.717Z" }, + { url = "https://files.pythonhosted.org/packages/33/b7/f1092dcecb6637e31cc2db099581ee5c61a17647849bae6b8261a2b78430/coverage-7.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4a3158dc2dcce5200d91ec28cd315c999eebff355437d2765840555d765a6e5f", size = 260017, upload-time = "2026-01-25T12:59:51.463Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cd/f3d07d4b95fbe1a2ef0958c15da614f7e4f557720132de34d2dc3aa7e911/coverage-7.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3973f353b2d70bd9796cc12f532a05945232ccae966456c8ed7034cb96bbfd6f", size = 262337, upload-time = "2026-01-25T12:59:53.407Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, ] [package.optional-dependencies] @@ -573,43 +730,54 @@ toml = [ [[package]] name = "cryptography" -version = "44.0.3" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/d6/1411ab4d6108ab167d06254c5be517681f1e331f90edf1379895bcb87020/cryptography-44.0.3.tar.gz", hash = "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053", size = 711096, upload-time = "2025-05-02T19:36:04.667Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/53/c776d80e9d26441bb3868457909b4e74dd9ccabd182e10b2b0ae7a07e265/cryptography-44.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", size = 6670281, upload-time = "2025-05-02T19:34:50.665Z" }, - { url = "https://files.pythonhosted.org/packages/6a/06/af2cf8d56ef87c77319e9086601bef621bedf40f6f59069e1b6d1ec498c5/cryptography-44.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", size = 3959305, upload-time = "2025-05-02T19:34:53.042Z" }, - { url = "https://files.pythonhosted.org/packages/ae/01/80de3bec64627207d030f47bf3536889efee8913cd363e78ca9a09b13c8e/cryptography-44.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", size = 4171040, upload-time = "2025-05-02T19:34:54.675Z" }, - { url = "https://files.pythonhosted.org/packages/bd/48/bb16b7541d207a19d9ae8b541c70037a05e473ddc72ccb1386524d4f023c/cryptography-44.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", size = 3963411, upload-time = "2025-05-02T19:34:56.61Z" }, - { url = "https://files.pythonhosted.org/packages/42/b2/7d31f2af5591d217d71d37d044ef5412945a8a8e98d5a2a8ae4fd9cd4489/cryptography-44.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", size = 3689263, upload-time = "2025-05-02T19:34:58.591Z" }, - { url = "https://files.pythonhosted.org/packages/25/50/c0dfb9d87ae88ccc01aad8eb93e23cfbcea6a6a106a9b63a7b14c1f93c75/cryptography-44.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", size = 4196198, upload-time = "2025-05-02T19:35:00.988Z" }, - { url = "https://files.pythonhosted.org/packages/66/c9/55c6b8794a74da652690c898cb43906310a3e4e4f6ee0b5f8b3b3e70c441/cryptography-44.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", size = 3966502, upload-time = "2025-05-02T19:35:03.091Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f7/7cb5488c682ca59a02a32ec5f975074084db4c983f849d47b7b67cc8697a/cryptography-44.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", size = 4196173, upload-time = "2025-05-02T19:35:05.018Z" }, - { url = "https://files.pythonhosted.org/packages/d2/0b/2f789a8403ae089b0b121f8f54f4a3e5228df756e2146efdf4a09a3d5083/cryptography-44.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", size = 4087713, upload-time = "2025-05-02T19:35:07.187Z" }, - { url = "https://files.pythonhosted.org/packages/1d/aa/330c13655f1af398fc154089295cf259252f0ba5df93b4bc9d9c7d7f843e/cryptography-44.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", size = 4299064, upload-time = "2025-05-02T19:35:08.879Z" }, - { url = "https://files.pythonhosted.org/packages/34/a3/ad08e0bcc34ad436013458d7528e83ac29910943cea42ad7dd4141a27bbb/cryptography-44.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", size = 6673501, upload-time = "2025-05-02T19:35:13.775Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f0/7491d44bba8d28b464a5bc8cc709f25a51e3eac54c0a4444cf2473a57c37/cryptography-44.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", size = 3960307, upload-time = "2025-05-02T19:35:15.917Z" }, - { url = "https://files.pythonhosted.org/packages/f7/c8/e5c5d0e1364d3346a5747cdcd7ecbb23ca87e6dea4f942a44e88be349f06/cryptography-44.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", size = 4170876, upload-time = "2025-05-02T19:35:18.138Z" }, - { url = "https://files.pythonhosted.org/packages/73/96/025cb26fc351d8c7d3a1c44e20cf9a01e9f7cf740353c9c7a17072e4b264/cryptography-44.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", size = 3964127, upload-time = "2025-05-02T19:35:19.864Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/eb6522db7d9f84e8833ba3bf63313f8e257729cf3a8917379473fcfd6601/cryptography-44.0.3-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", size = 3689164, upload-time = "2025-05-02T19:35:21.449Z" }, - { url = "https://files.pythonhosted.org/packages/68/fb/d61a4defd0d6cee20b1b8a1ea8f5e25007e26aeb413ca53835f0cae2bcd1/cryptography-44.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", size = 4198081, upload-time = "2025-05-02T19:35:23.187Z" }, - { url = "https://files.pythonhosted.org/packages/1b/50/457f6911d36432a8811c3ab8bd5a6090e8d18ce655c22820994913dd06ea/cryptography-44.0.3-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", size = 3967716, upload-time = "2025-05-02T19:35:25.426Z" }, - { url = "https://files.pythonhosted.org/packages/35/6e/dca39d553075980ccb631955c47b93d87d27f3596da8d48b1ae81463d915/cryptography-44.0.3-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", size = 4197398, upload-time = "2025-05-02T19:35:27.678Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/d1f2fe681eabc682067c66a74addd46c887ebacf39038ba01f8860338d3d/cryptography-44.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", size = 4087900, upload-time = "2025-05-02T19:35:29.312Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f5/3599e48c5464580b73b236aafb20973b953cd2e7b44c7c2533de1d888446/cryptography-44.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", size = 4301067, upload-time = "2025-05-02T19:35:31.547Z" }, - { url = "https://files.pythonhosted.org/packages/7f/10/abcf7418536df1eaba70e2cfc5c8a0ab07aa7aa02a5cbc6a78b9d8b4f121/cryptography-44.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", size = 3393192, upload-time = "2025-05-02T19:35:37.468Z" }, - { url = "https://files.pythonhosted.org/packages/06/59/ecb3ef380f5891978f92a7f9120e2852b1df6f0a849c277b8ea45b865db2/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", size = 3898419, upload-time = "2025-05-02T19:35:39.065Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d0/35e2313dbb38cf793aa242182ad5bc5ef5c8fd4e5dbdc380b936c7d51169/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", size = 4117892, upload-time = "2025-05-02T19:35:40.839Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c8/31fb6e33b56c2c2100d76de3fd820afaa9d4d0b6aea1ccaf9aaf35dc7ce3/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", size = 3900855, upload-time = "2025-05-02T19:35:42.599Z" }, - { url = "https://files.pythonhosted.org/packages/43/2a/08cc2ec19e77f2a3cfa2337b429676406d4bb78ddd130a05c458e7b91d73/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", size = 4117619, upload-time = "2025-05-02T19:35:44.774Z" }, - { url = "https://files.pythonhosted.org/packages/8d/4b/c11ad0b6c061902de5223892d680e89c06c7c4d606305eb8de56c5427ae6/cryptography-44.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", size = 3390230, upload-time = "2025-05-02T19:35:49.062Z" }, - { url = "https://files.pythonhosted.org/packages/58/11/0a6bf45d53b9b2290ea3cec30e78b78e6ca29dc101e2e296872a0ffe1335/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", size = 3895216, upload-time = "2025-05-02T19:35:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/0a/27/b28cdeb7270e957f0077a2c2bfad1b38f72f1f6d699679f97b816ca33642/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", size = 4115044, upload-time = "2025-05-02T19:35:53.044Z" }, - { url = "https://files.pythonhosted.org/packages/35/b0/ec4082d3793f03cb248881fecefc26015813199b88f33e3e990a43f79835/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", size = 3898034, upload-time = "2025-05-02T19:35:54.72Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7f/adf62e0b8e8d04d50c9a91282a57628c00c54d4ae75e2b02a223bd1f2613/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", size = 4114449, upload-time = "2025-05-02T19:35:57.139Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, ] [[package]] @@ -626,9 +794,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/34/6171ab34715ed210bcd6c2b38839cc792993cff4fe2493f50bc92b0086a0/daphne-4.2.1-py3-none-any.whl", hash = "sha256:881e96b387b95b35ad85acd855f229d7f5b79073d6649089c8a33f661885e055", size = 29015, upload-time = "2025-07-02T12:57:03.793Z" }, ] +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-inspect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, +] + [[package]] name = "dateparser" -version = "1.2.2" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -636,21 +817,39 @@ dependencies = [ { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "tzlocal", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/30/064144f0df1749e7bb5faaa7f52b007d7c2d08ec08fed8411aba87207f68/dateparser-1.2.2.tar.gz", hash = "sha256:986316f17cb8cdc23ea8ce563027c5ef12fc725b6fb1d137c14ca08777c5ecf7", size = 329840, upload-time = "2025-06-26T09:29:23.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/668dfb8c073a5dde3efb80fa382de1502e3b14002fd386a8c1b0b49e92a9/dateparser-1.3.0.tar.gz", hash = "sha256:5bccf5d1ec6785e5be71cc7ec80f014575a09b4923e762f850e57443bddbf1a5", size = 337152, upload-time = "2026-02-04T16:00:06.162Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/c7/95349670e193b2891176e1b8e5f43e12b31bff6d9994f70e74ab385047f6/dateparser-1.3.0-py3-none-any.whl", hash = "sha256:8dc678b0a526e103379f02ae44337d424bd366aac727d3c6cf52ce1b01efbb5a", size = 318688, upload-time = "2026-02-04T16:00:04.652Z" }, +] + +[[package]] +name = "deepmerge" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/22/f020c047ae1346613db9322638186468238bcfa8849b4668a22b97faad65/dateparser-1.2.2-py3-none-any.whl", hash = "sha256:5a5d7211a09013499867547023a2a0c91d5a27d15dd4dbcea676ea9fe66f2482", size = 315453, upload-time = "2025-06-26T09:29:21.412Z" }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] [[package]] name = "deprecated" -version = "1.2.18" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, ] [[package]] @@ -666,36 +865,48 @@ wheels = [ ] [[package]] -name = "distlib" -version = "0.4.0" +name = "dirtyjson" +version = "1.0.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/04/d24f6e645ad82ba0ef092fa17d9ef7a21953781663648a01c9371d9e8e98/dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd", size = 30782, upload-time = "2022-11-28T23:32:33.319Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, + { url = "https://files.pythonhosted.org/packages/68/69/1bcf70f81de1b4a9f21b3a62ec0c83bdff991c88d6cc2267d02408457e88/dirtyjson-1.0.8-py3-none-any.whl", hash = "sha256:125e27248435a58acace26d5c2c4c11a1c0de0a9c5124c5a94ba78e517d74f53", size = 25197, upload-time = "2022-11-28T23:32:31.219Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] [[package]] name = "django" -version = "5.2.7" +version = "5.2.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sqlparse", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/96/bd84e2bb997994de8bcda47ae4560991084e86536541d7214393880f01a8/django-5.2.7.tar.gz", hash = "sha256:e0f6f12e2551b1716a95a63a1366ca91bbcd7be059862c1b18f989b1da356cdd", size = 10865812, upload-time = "2025-10-01T14:22:12.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b9445fc0695b03746f355c05b2eecc54c34e05198c686f4fc4406b722b52/django-5.2.12.tar.gz", hash = "sha256:6b809af7165c73eff5ce1c87fdae75d4da6520d6667f86401ecf55b681eb1eeb", size = 10860574, upload-time = "2026-03-03T13:56:05.509Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/ef/81f3372b5dd35d8d354321155d1a38894b2b766f576d0abffac4d8ae78d9/django-5.2.7-py3-none-any.whl", hash = "sha256:59a13a6515f787dec9d97a0438cd2efac78c8aca1c80025244b0fe507fe0754b", size = 8307145, upload-time = "2025-10-01T14:22:49.476Z" }, + { url = "https://files.pythonhosted.org/packages/4e/32/4b144e125678efccf5d5b61581de1c4088d6b0286e46096e3b8de0d556c8/django-5.2.12-py3-none-any.whl", hash = "sha256:4853482f395c3a151937f6991272540fcbf531464f254a347bf7c89f53c8cff7", size = 8310245, upload-time = "2026-03-03T13:56:01.174Z" }, ] [[package]] name = "django-allauth" -version = "65.4.1" +version = "65.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/e7/b3232c27da9f43e3db72d16addd90891ee233fa058ddd0588bafcded2ea7/django_allauth-65.4.1.tar.gz", hash = "sha256:60b32aef7dbbcc213319aa4fd8f570e985266ea1162ae6ef7a26a24efca85c8c", size = 1558220, upload-time = "2025-02-07T09:35:18.359Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/c1/d3385f4c3169c1d6eea3c63aed0f36af51478c1d72e46db12bb1a08f8034/django_allauth-65.15.0.tar.gz", hash = "sha256:b404d48cf0c3ee14dacc834c541f30adedba2ff1c433980ecc494d6cb0b395a8", size = 2215709, upload-time = "2026-03-09T13:51:28.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/b8/c8411339171bd8bc075c09ef190fb42195e9a2149e5c5026e094fe62fce0/django_allauth-65.15.0-py3-none-any.whl", hash = "sha256:ad9fc49c49a9368eaa5bb95456b76e2a4f377b3c6862ee8443507816578c098d", size = 2022994, upload-time = "2026-03-09T13:51:19.711Z" }, +] [package.optional-dependencies] mfa = [ @@ -703,34 +914,34 @@ mfa = [ { name = "qrcode", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] socialaccount = [ + { name = "oauthlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pyjwt", extra = ["crypto"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "requests-oauthlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [[package]] name = "django-auditlog" -version = "3.2.1" +version = "3.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/46/9da1d94493832fa18d2f6324a76d387fa232001593866987a96047709f4e/django_auditlog-3.2.1.tar.gz", hash = "sha256:63a4c9f7793e94eed804bc31a04d9b0b58244b1d280e2ed273c8b406bff1f779", size = 72926, upload-time = "2025-07-03T20:08:17.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/e5/2beb2b256775c4fc041ed60cb44f5d77acb6cde307f01567dcf2756721a7/django_auditlog-3.4.1.tar.gz", hash = "sha256:ad07b9db452d5fa8303822cccd78cd3fcb2c2863aeb6abe039ec45739b4d7e33", size = 91611, upload-time = "2025-12-18T08:56:35.378Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/06/67296d050a72dcd76f57f220df621cb27e5b9282ba7ad0f5f74870dce241/django_auditlog-3.2.1-py3-none-any.whl", hash = "sha256:99603ca9d015f7e9b062b1c34f3e0826a3ce6ae6e5950c81bb7e663f7802a899", size = 38330, upload-time = "2025-07-03T20:07:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/91/37/3239143dddb34a3f64582c43f56587a80c9ac136cbd34fc215077f83beb9/django_auditlog-3.4.1-py3-none-any.whl", hash = "sha256:29958ecacfee00144127214f3ccef3f0c203c3659bcb6dd404a0f3d5551a10a5", size = 49541, upload-time = "2025-12-18T08:56:23.483Z" }, ] [[package]] name = "django-cachalot" -version = "2.8.0" +version = "2.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/53/1f781e58028a43028d6c799f2eab15eff65e841e3e288d6f2953e36f01a4/django_cachalot-2.8.0.tar.gz", hash = "sha256:30456720ac9f3fabeb90ce898530fe01130c25a1eca911cd016cfaeab251d627", size = 74673, upload-time = "2025-04-17T00:05:36.387Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/d6/2f4033cc3443b7ce15459247488050cd0b8b56f15a03fcf2650b2483026e/django_cachalot-2.9.0.tar.gz", hash = "sha256:67d3d19a3f6deab7dc5b081b5f78ea926318f64a7b3afb06f28e61d8d31e02b3", size = 76922, upload-time = "2026-01-28T05:23:30.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/05/f5846fd186189ac0a1deddb9c67450c838e5c8ceceb35b5260c61f622599/django_cachalot-2.8.0-py3-none-any.whl", hash = "sha256:315da766a5356c7968318326f7b0579f64571ad909f64cad0601f38153ca4e16", size = 55671, upload-time = "2025-04-17T00:05:34.641Z" }, + { url = "https://files.pythonhosted.org/packages/12/bf/af8ad2aa5a402f278b444ca70729fb12ee96ddb89c19c32a2d7c5189358f/django_cachalot-2.9.0-py3-none-any.whl", hash = "sha256:b80ac4930613a7849988ea772a53598d262a15eaf55e5ec8c78accae7fdd99ff", size = 57814, upload-time = "2026-01-28T05:23:28.741Z" }, ] [[package]] @@ -787,14 +998,14 @@ wheels = [ [[package]] name = "django-filter" -version = "25.1" +version = "25.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/40/c702a6fe8cccac9bf426b55724ebdf57d10a132bae80a17691d0cf0b9bac/django_filter-25.1.tar.gz", hash = "sha256:1ec9eef48fa8da1c0ac9b411744b16c3f4c31176c867886e4c48da369c407153", size = 143021, upload-time = "2025-02-14T16:30:53.238Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/e4/465d2699cd388c0005fb8d6ae6709f239917c6d8790ac35719676fffdcf3/django_filter-25.2.tar.gz", hash = "sha256:760e984a931f4468d096f5541787efb8998c61217b73006163bf2f9523fe8f23", size = 143818, upload-time = "2025-10-05T09:51:31.521Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/a6/70dcd68537c434ba7cb9277d403c5c829caf04f35baf5eb9458be251e382/django_filter-25.1-py3-none-any.whl", hash = "sha256:4fa48677cf5857b9b1347fed23e355ea792464e0fe07244d1fdfb8a806215b80", size = 94114, upload-time = "2025-02-14T16:30:50.435Z" }, + { url = "https://files.pythonhosted.org/packages/c1/40/6a02495c5658beb1f31eb09952d8aa12ef3c2a66342331ce3a35f7132439/django_filter-25.2-py3-none-any.whl", hash = "sha256:9c0f8609057309bba611062fe1b720b4a873652541192d232dd28970383633e3", size = 94145, upload-time = "2025-10-05T09:51:29.728Z" }, ] [[package]] @@ -814,15 +1025,15 @@ wheels = [ [[package]] name = "django-guardian" -version = "3.2.0" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/f9/bcff6a931298b9eb55e1550b55ab964fab747f594ba6d2d81cbe19736c5f/django_guardian-3.2.0.tar.gz", hash = "sha256:9e18ecd2e211b665972690c2d03d27bce0ea4932b5efac24a4bb9d526950a69e", size = 99940, upload-time = "2025-09-16T10:35:53.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/eb/bbeb4efd10d6cca8993697f571f17574e9fa7a912cead3ab39ce1d3793cd/django_guardian-3.3.0.tar.gz", hash = "sha256:abf1487399212cffdce7b3c909182a26fbe7e89746007299a8cab99f3d5ff009", size = 107443, upload-time = "2026-02-24T19:43:28.819Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/23/63a7d868373a73d25c4a5c2dd3cce3aaeb22fbee82560d42b6e93ba01403/django_guardian-3.2.0-py3-none-any.whl", hash = "sha256:0768565a057988a93fc4a1d93649c4a794abfd7473a8408a079cfbf83c559d77", size = 134674, upload-time = "2025-09-16T10:35:51.69Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3c/6517c5e27c6f9c165f989a5884f8798d66d25ce86fe44bf8c19aa4120351/django_guardian-3.3.0-py3-none-any.whl", hash = "sha256:4dca4fce104c7306e41b947a57d1cd6be46d9982548bef194ac8a6ad61d83686", size = 144003, upload-time = "2026-02-24T19:43:27Z" }, ] [[package]] @@ -837,32 +1048,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6d/10/23c0644cf67567bbe4e3a2eeeec0e9c79b701990c0e07c5ee4a4f8897f91/django_multiselectfield-1.0.1-py3-none-any.whl", hash = "sha256:18dc14801f7eca844a48e21cba6d8ec35b9b581f2373bbb2cb75e6994518259a", size = 20481, upload-time = "2025-06-12T14:41:20.107Z" }, ] +[[package]] +name = "django-rich" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/67/e307a5fef657e7992468f567b521534c52e01bdda5a1ae5b12de679a670f/django_rich-2.2.0.tar.gz", hash = "sha256:ecec7842d040024ed8a225699388535e46b87277550c33f46193b52cece2f780", size = 62427, upload-time = "2025-09-18T11:42:17.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/ed/23fa669493d78cd67e7f6734fa380f8690f2b4d75b4f72fd645a52c3b32a/django_rich-2.2.0-py3-none-any.whl", hash = "sha256:a0d2c916bd9750b6e9beb57407aef5e836c8705d7dbe9e4fd4725f7bbe41c407", size = 9210, upload-time = "2025-09-18T11:42:15.779Z" }, +] + [[package]] name = "django-soft-delete" -version = "1.0.21" +version = "1.0.23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/bf/13996c18bffee3bbcf294830c1737bfb5564164b8319c51e6714b6bdf783/django_soft_delete-1.0.21.tar.gz", hash = "sha256:542bd4650d2769105a4363ea7bb7fbdb3c28429dbaa66417160f8f4b5dc689d5", size = 21153, upload-time = "2025-09-17T08:46:30.476Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/98/c7c52a85b070b1703774df817b6460a7714655302a2d503f6447544f1a29/django_soft_delete-1.0.23.tar.gz", hash = "sha256:814659f0d19d4f2afc58b31ff73f88f0af66715ccef3b4fcd8f6b3a011d59b2a", size = 22458, upload-time = "2026-02-21T17:48:41.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/e6/8f4fed14499c63e35ca33cf9f424ad2e14e963ec5545594d7c7dc2f710f4/django_soft_delete-1.0.21-py3-none-any.whl", hash = "sha256:dd91e671d9d431ff96f4db727ce03e7fbb4008ae4541b1d162d5d06cc9becd2a", size = 18681, upload-time = "2025-09-17T08:46:29.272Z" }, + { url = "https://files.pythonhosted.org/packages/91/9e/77375a163c340fff03d037eac7d970ce006626e6c3aea87b5d159f052f8b/django_soft_delete-1.0.23-py3-none-any.whl", hash = "sha256:dd2133d4925d58308680f389daa2e150abf7b81a4f0abbbf2161a9db3b9f1e74", size = 19308, upload-time = "2026-02-21T17:48:39.974Z" }, ] [[package]] name = "django-stubs" -version = "5.2.5" +version = "5.2.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django-stubs-ext", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "types-pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/8e/286150f593481c33f54d14efb58d72178f159d57d31043529d38bbc98e2f/django_stubs-5.2.5.tar.gz", hash = "sha256:fc78384e28d8c5292d60983075a5934f644f7c304c25ae2793fc57aa66d5018b", size = 247794, upload-time = "2025-09-12T19:29:49.636Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/01/86c921e0e19c9fa7e705bf795998dbf55eb183e7be0342a3027dc1bcbc9f/django_stubs-5.2.9.tar.gz", hash = "sha256:c192257120b08785cfe6f2f1c91f1797aceae8e9daa689c336e52c91e8f6a493", size = 257970, upload-time = "2026-01-20T23:59:27.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/02/cdbf7652ef2c9a7a1fed7c279484b7f3806f15b1bb34aec9fef8e8cfacbf/django_stubs-5.2.5-py3-none-any.whl", hash = "sha256:223c1a3324cd4873b7629dec6e9adbe224a94508284c1926b25fddff7a92252b", size = 490196, upload-time = "2025-09-12T19:29:47.954Z" }, + { url = "https://files.pythonhosted.org/packages/0d/05/4c9c419b7051eb4b350100b086be6df487f968ab672d3d370f8ccf7c3746/django_stubs-5.2.9-py3-none-any.whl", hash = "sha256:2317a7130afdaa76f6ff7f623650d7f3bf1b6c86a60f95840e14e6ec6de1a7cd", size = 508656, upload-time = "2026-01-20T23:59:25.12Z" }, ] [package.optional-dependencies] @@ -872,24 +1095,24 @@ compatible-mypy = [ [[package]] name = "django-stubs-ext" -version = "5.2.5" +version = "5.2.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/94/c9b8f4c47084a0fa666da9066c36771098101932688adf2c17a40fab79c2/django_stubs_ext-5.2.5.tar.gz", hash = "sha256:ecc628df29d36cede638567c4e33ff485dd7a99f1552ad0cece8c60e9c3a8872", size = 6489, upload-time = "2025-09-12T19:29:06.008Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/03/9c2be939490d2282328db4611bc5956899f5ff7eabc3e88bd4b964a87373/django_stubs_ext-5.2.9.tar.gz", hash = "sha256:6db4054d1580657b979b7d391474719f1a978773e66c7070a5e246cd445a25a9", size = 6497, upload-time = "2026-01-20T23:58:59.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/fe/a85a105fddffadb4a8d50e500caeee87d836b679d51a19d52dfa0cc6c660/django_stubs_ext-5.2.5-py3-none-any.whl", hash = "sha256:9b4b8ac9d32f7e6c304fd05477f8688fae6ed57f6a0f9f4d074f9e55b5a3da14", size = 9310, upload-time = "2025-09-12T19:29:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f7/0d5f7d7e76fe972d9f560f687fdc0cab4db9e1624fd90728ca29b4ed7a63/django_stubs_ext-5.2.9-py3-none-any.whl", hash = "sha256:230c51575551b0165be40177f0f6805f1e3ebf799b835c85f5d64c371ca6cf71", size = 9974, upload-time = "2026-01-20T23:58:58.438Z" }, ] [[package]] name = "django-treenode" -version = "0.23.2" +version = "0.23.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/f3/274b84607fd64c0844e98659985f964190a46c2460f2523a446c4a946216/django_treenode-0.23.2.tar.gz", hash = "sha256:3c5a6ff5e0c83e34da88749f602b3013dd1ab0527f51952c616e3c21bf265d52", size = 26700, upload-time = "2025-09-04T21:16:53.497Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/58/86edbbd1075bb8bc0962c6feb13bc06822405a10fea8352ad73ab2babdd9/django_treenode-0.23.3.tar.gz", hash = "sha256:714c825d5b925a3d2848d0709f29973941ea41a606b8e2b64cbec46010a8cce3", size = 27812, upload-time = "2025-12-01T23:01:24.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/61/e17d3dee5c6bb24b8faf0c101e17f9a8cafeba6384166176e066c80e8cbb/django_treenode-0.23.2-py3-none-any.whl", hash = "sha256:9363cb50f753654a9acfad6ec4df2a664a5f89dfdf8b55ffd964f27461bef85e", size = 21879, upload-time = "2025-09-04T21:16:51.811Z" }, + { url = "https://files.pythonhosted.org/packages/bc/52/696db237167483324ef38d8d090fb0fcc33dbb70ebe66c75868005fb7c75/django_treenode-0.23.3-py3-none-any.whl", hash = "sha256:8072e1ac688c1ed3ab95a98a797c5e965380de5228a389d60a4ef8b9a6449387", size = 22014, upload-time = "2025-12-01T23:01:23.266Z" }, ] [[package]] @@ -920,18 +1143,17 @@ wheels = [ [[package]] name = "djangorestframework-stubs" -version = "3.16.4" +version = "3.16.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/33/79c0dd2a02ead2702a1b3d25579b56ffdc1bc6d1271c31a0979ce9ad10fa/djangorestframework_stubs-3.16.4.tar.gz", hash = "sha256:f43136bfbef568dd0e10848427c01bd9ef759dd328195949f6f7f9a2292a34f6", size = 31960, upload-time = "2025-09-29T20:11:20.57Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/50/889b1121dc0831aa9f6ece8409d41a5f4667da2a963172516841f343fd35/djangorestframework_stubs-3.16.7.tar.gz", hash = "sha256:e53bc346e9950ebdd1bb2bbc19d7e5c8b7acc894e381df55da69248f47ab78ff", size = 32296, upload-time = "2026-01-13T11:42:48.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/45/63fac5c34313986acc005529fdba638822bae973f2b61a0542a6c8494847/djangorestframework_stubs-3.16.4-py3-none-any.whl", hash = "sha256:3b27353fa797876f55da87eceafe4c2f265a93924fa7763d257e509d865df1b2", size = 56503, upload-time = "2025-09-29T20:11:19.317Z" }, + { url = "https://files.pythonhosted.org/packages/9e/99/7c969728d66388e22fdaba94e1a9c56490954e2f12f598416e380a53b26d/djangorestframework_stubs-3.16.7-py3-none-any.whl", hash = "sha256:70f80050144875f80ce8ac823ff8628f6e3eb7336495394bb9803251721d9358", size = 56522, upload-time = "2026-01-13T11:42:46.118Z" }, ] [package.optional-dependencies] @@ -942,7 +1164,7 @@ compatible-mypy = [ [[package]] name = "drf-spectacular" -version = "0.28.0" +version = "0.29.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -952,21 +1174,21 @@ dependencies = [ { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "uritemplate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/b9/741056455aed00fa51a1df41fad5ad27c8e0d433b6bf490d4e60e2808bc6/drf_spectacular-0.28.0.tar.gz", hash = "sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061", size = 237849, upload-time = "2024-11-30T08:49:02.355Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/0e/a4f50d83e76cbe797eda88fc0083c8ca970cfa362b5586359ef06ec6f70a/drf_spectacular-0.29.0.tar.gz", hash = "sha256:0a069339ea390ce7f14a75e8b5af4a0860a46e833fd4af027411a3e94fc1a0cc", size = 241722, upload-time = "2025-11-02T03:40:26.348Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/66/c2929871393b1515c3767a670ff7d980a6882964a31a4ca2680b30d7212a/drf_spectacular-0.28.0-py3-none-any.whl", hash = "sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4", size = 103928, upload-time = "2024-11-30T08:48:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/32/d9/502c56fc3ca960075d00956283f1c44e8cafe433dada03f9ed2821f3073b/drf_spectacular-0.29.0-py3-none-any.whl", hash = "sha256:d1ee7c9535d89848affb4427347f7c4a22c5d22530b8842ef133d7b72e19b41a", size = 105433, upload-time = "2025-11-02T03:40:24.823Z" }, ] [[package]] name = "drf-spectacular-sidecar" -version = "2025.9.1" +version = "2026.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/e2/85a0b8dbed8631165a6b49b2aee57636da8e4e710c444566636ffd972a7b/drf_spectacular_sidecar-2025.9.1.tar.gz", hash = "sha256:da2aa45da48fff76de7a1e357b84d1eb0b9df40ca89ec19d5fe94ad1037bb3c8", size = 2420902, upload-time = "2025-09-01T11:23:24.156Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/42/2f8c1b2846399d47094ec414bc0d6a7cce7ba95fd6545a97285eee89f7f1/drf_spectacular_sidecar-2026.3.1.tar.gz", hash = "sha256:5b7fedad66e3851f2f442480792c08115d79217959d01645b93d3d2258938be1", size = 2461501, upload-time = "2026-03-01T11:31:19.708Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/24/db59146ba89491fe1d44ca8aef239c94bf3c7fd41523976090f099430312/drf_spectacular_sidecar-2025.9.1-py3-none-any.whl", hash = "sha256:8e80625209b8a23ff27616db305b9ab71c2e2d1069dacd99720a9c11e429af50", size = 2440255, upload-time = "2025-09-01T11:23:22.822Z" }, + { url = "https://files.pythonhosted.org/packages/c1/28/2d5e64d101ebc5180674fcaf7b5a35e398e2f8d9688b2e8d52b0e1394e7d/drf_spectacular_sidecar-2026.3.1-py3-none-any.whl", hash = "sha256:864edb83e022e13e3941c325c3cc0c954c843fa2e1d0bc95e81887664b2d3dad", size = 2481725, upload-time = "2026-03-01T11:31:18.469Z" }, ] [[package]] @@ -977,25 +1199,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/57/df87d92fbfc3f0f2ef1a49c47f2a83389a4a13b7acf62b8bf7b223627d82/drf_writable_nested-0.7.2-py3-none-any.whl", hash = "sha256:4a3d2737c1cbfafa690e30236b169112e5b23cfe3d288f3992b0651a1b828c4d", size = 10570, upload-time = "2025-03-10T19:59:05.482Z" }, ] -[[package]] -name = "exceptiongroup" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, -] - [[package]] name = "execnet" -version = "2.1.1" +version = "2.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload-time = "2024-04-08T09:04:19.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" }, + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, ] [[package]] @@ -1011,36 +1221,59 @@ wheels = [ ] [[package]] -name = "faker" -version = "37.8.0" +name = "faiss-cpu" +version = "1.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/c9/671f66f6b31ec48e5825d36435f0cb91189fa8bb6b50724029dbff4ca83c/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_arm64.whl", hash = "sha256:a9064eb34f8f64438dd5b95c8f03a780b1a3f0b99c46eeacb1f0b5d15fc02dc1", size = 3452776, upload-time = "2025-12-24T10:27:01.419Z" }, + { url = "https://files.pythonhosted.org/packages/5a/4a/97150aa1582fb9c2bca95bd8fc37f27d3b470acec6f0a6833844b21e4b40/faiss_cpu-1.13.2-cp310-abi3-macosx_14_0_x86_64.whl", hash = "sha256:c8d097884521e1ecaea6467aeebbf1aa56ee4a36350b48b2ca6b39366565c317", size = 7896434, upload-time = "2025-12-24T10:27:03.592Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d0/0940575f059591ca31b63a881058adb16a387020af1709dcb7669460115c/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ee330a284042c2480f2e90450a10378fd95655d62220159b1408f59ee83ebf1", size = 11485825, upload-time = "2025-12-24T10:27:05.681Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e1/a5acac02aa593809f0123539afe7b4aff61d1db149e7093239888c9053e1/faiss_cpu-1.13.2-cp310-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ab88ee287c25a119213153d033f7dd64c3ccec466ace267395872f554b648cd7", size = 23845772, upload-time = "2025-12-24T10:27:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7b/49dcaf354834ec457e85ca769d50bc9b5f3003fab7c94a9dcf08cf742793/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:85511129b34f890d19c98b82a0cd5ffb27d89d1cec2ee41d2621ee9f9ef8cf3f", size = 13477567, upload-time = "2025-12-24T10:27:10.822Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6b/12bb4037921c38bb2c0b4cfc213ca7e04bbbebbfea89b0b5746248ce446e/faiss_cpu-1.13.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b32eb4065bac352b52a9f5ae07223567fab0a976c7d05017c01c45a1c24264f", size = 25102239, upload-time = "2025-12-24T10:27:13.476Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/da/1336008d39e5d4076dddb4e0f3a52ada41429274bf558a3cc28030d324a3/faker-37.8.0.tar.gz", hash = "sha256:090bb5abbec2b30949a95ce1ba6b20d1d0ed222883d63483a0d4be4a970d6fb8", size = 1912113, upload-time = "2025-09-15T20:24:13.592Z" } + +[[package]] +name = "faker" +version = "40.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/03/14428edc541467c460d363f6e94bee9acc271f3e62470630fc9a647d0cf2/faker-40.8.0.tar.gz", hash = "sha256:936a3c9be6c004433f20aa4d99095df5dec82b8c7ad07459756041f8c1728875", size = 1956493, upload-time = "2026-03-04T16:18:48.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/11/02ebebb09ff2104b690457cb7bc6ed700c9e0ce88cf581486bb0a5d3c88b/faker-37.8.0-py3-none-any.whl", hash = "sha256:b08233118824423b5fc239f7dd51f145e7018082b4164f8da6a9994e1f1ae793", size = 1953940, upload-time = "2025-09-15T20:24:11.482Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3b/c6348f1e285e75b069085b18110a4e6325b763a5d35d5e204356fc7c20b3/faker-40.8.0-py3-none-any.whl", hash = "sha256:eb21bdba18f7a8375382eb94fb436fce07046893dc94cb20817d28deb0c3d579", size = 1989124, upload-time = "2026-03-04T16:18:46.45Z" }, ] [[package]] name = "fido2" -version = "1.2.0" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/cc/4529123364d41f342145f2fd775307eaed817cd22810895dea10e15a4d06/fido2-1.2.0.tar.gz", hash = "sha256:e39f95920122d64283fda5e5581d95a206e704fa42846bfa4662f86aa0d3333b", size = 266369, upload-time = "2024-11-27T09:08:21.071Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/3c/c65377e48c144afca6b02c69f10c0fe936db556096a4e2c9798e2aa72db6/fido2-2.1.1.tar.gz", hash = "sha256:f1379f845870cc7fc64c7f07323c3ce41e8c96c37054e79e0acd5630b3fec5ac", size = 4455940, upload-time = "2026-01-19T11:08:34.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/48/e9b99d66f27d3416a619324568739fd6603e093b2f79138d6f47ccf727b6/fido2-1.2.0-py3-none-any.whl", hash = "sha256:f7c8ee62e359aa980a45773f9493965bb29ede1b237a9218169dbfe60c80e130", size = 219418, upload-time = "2024-11-27T09:08:18.932Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ab/d0fa89cc4b982800dd88daa799612f11642bf9393851715d9eaeba3cfcac/fido2-2.1.1-py3-none-any.whl", hash = "sha256:f85c16c8084abf6530b6c6ec3a0cf8575943321842e06916686943a8b784182c", size = 226945, upload-time = "2026-01-19T11:08:29.675Z" }, ] [[package]] name = "filelock" -version = "3.20.0" +version = "3.25.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, +] + +[[package]] +name = "filetype" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/29/745f7d30d47fe0f251d3ad3dc2978a23141917661998763bebb6da007eb1/filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb", size = 998020, upload-time = "2022-11-02T17:34:04.141Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970, upload-time = "2022-11-02T17:34:01.425Z" }, ] [[package]] @@ -1060,112 +1293,236 @@ wheels = [ ] [[package]] -name = "ghp-import" -version = "2.1.0" +name = "fonttools" +version = "4.62.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/96/686339e0fda8142b7ebed39af53f4a5694602a729662f42a6209e3be91d0/fonttools-4.62.0.tar.gz", hash = "sha256:0dc477c12b8076b4eb9af2e440421b0433ffa9e1dcb39e0640a6c94665ed1098", size = 3579521, upload-time = "2026-03-09T16:50:06.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/33/63d79ca41020dd460b51f1e0f58ad1ff0a36b7bcbdf8f3971d52836581e9/fonttools-4.62.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:196cafef9aeec5258425bd31a4e9a414b2ee0d1557bca184d7923d3d3bcd90f9", size = 2870816, upload-time = "2026-03-09T16:48:32.39Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7a/9aeec114bc9fc00d757a41f092f7107863d372e684a5b5724c043654477c/fonttools-4.62.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:153afc3012ff8761b1733e8fbe5d98623409774c44ffd88fbcb780e240c11d13", size = 2416127, upload-time = "2026-03-09T16:48:34.627Z" }, + { url = "https://files.pythonhosted.org/packages/5a/71/12cfd8ae0478b7158ffa8850786781f67e73c00fd897ef9d053415c5f88b/fonttools-4.62.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13b663fb197334de84db790353d59da2a7288fd14e9be329f5debc63ec0500a5", size = 5100678, upload-time = "2026-03-09T16:48:36.454Z" }, + { url = "https://files.pythonhosted.org/packages/8a/d7/8e4845993ee233c2023d11babe9b3dae7d30333da1d792eeccebcb77baab/fonttools-4.62.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:591220d5333264b1df0d3285adbdfe2af4f6a45bbf9ca2b485f97c9f577c49ff", size = 5070859, upload-time = "2026-03-09T16:48:38.786Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a0/287ae04cd883a52e7bb1d92dfc4997dcffb54173761c751106845fa9e316/fonttools-4.62.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:579f35c121528a50c96bf6fcb6a393e81e7f896d4326bf40e379f1c971603db9", size = 5076689, upload-time = "2026-03-09T16:48:41.886Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4e/a2377ad26c36fcd3e671a1c316ea5ed83107de1588e2d897a98349363bc7/fonttools-4.62.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:44956b003151d5a289eba6c71fe590d63509267c37e26de1766ba15d9c589582", size = 5202053, upload-time = "2026-03-09T16:48:43.867Z" }, + { url = "https://files.pythonhosted.org/packages/ab/9d/7ad1ffc080619f67d0b1e0fa6a0578f0be077404f13fd8e448d1616a94a3/fonttools-4.62.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:22bde4dc12a9e09b5ced77f3b5053d96cf10c4976c6ac0dee293418ef289d221", size = 2870004, upload-time = "2026-03-09T16:48:50.837Z" }, + { url = "https://files.pythonhosted.org/packages/4d/8b/ba59069a490f61b737e064c3129453dbd28ee38e81d56af0d04d7e6b4de4/fonttools-4.62.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7199c73b326bad892f1cb53ffdd002128bfd58a89b8f662204fbf1daf8d62e85", size = 2414662, upload-time = "2026-03-09T16:48:53.295Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8c/c52a4310de58deeac7e9ea800892aec09b00bb3eb0c53265b31ec02be115/fonttools-4.62.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d732938633681d6e2324e601b79e93f7f72395ec8681f9cdae5a8c08bc167e72", size = 5032975, upload-time = "2026-03-09T16:48:55.718Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a1/d16318232964d786907b9b3613b8409f74cf0be2da400854509d3a864e43/fonttools-4.62.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31a804c16d76038cc4e3826e07678efb0a02dc4f15396ea8e07088adbfb2578e", size = 4988544, upload-time = "2026-03-09T16:48:57.715Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8d/7e745ca3e65852adc5e52a83dc213fe1b07d61cb5b394970fcd4b1199d1e/fonttools-4.62.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:090e74ac86e68c20150e665ef8e7e0c20cb9f8b395302c9419fa2e4d332c3b51", size = 4971296, upload-time = "2026-03-09T16:48:59.678Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d4/b717a4874175146029ca1517e85474b1af80c9d9a306fc3161e71485eea5/fonttools-4.62.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8f086120e8be9e99ca1288aa5ce519833f93fe0ec6ebad2380c1dee18781f0b5", size = 5122503, upload-time = "2026-03-09T16:49:02.464Z" }, + { url = "https://files.pythonhosted.org/packages/82/c7/985c1670aa6d82ef270f04cde11394c168f2002700353bd2bde405e59b8f/fonttools-4.62.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:274c8b8a87e439faf565d3bcd3f9f9e31bca7740755776a4a90a4bfeaa722efa", size = 2864929, upload-time = "2026-03-09T16:49:09.331Z" }, + { url = "https://files.pythonhosted.org/packages/c1/dc/c409c8ceec0d3119e9ab0b7b1a2e3c76d1f4d66e4a9db5c59e6b7652e7df/fonttools-4.62.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93e27131a5a0ae82aaadcffe309b1bae195f6711689722af026862bede05c07c", size = 2412586, upload-time = "2026-03-09T16:49:11.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ac/8e300dbf7b4d135287c261ffd92ede02d9f48f0d2db14665fbc8b059588a/fonttools-4.62.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83c6524c5b93bad9c2939d88e619fedc62e913c19e673f25d5ab74e7a5d074e5", size = 5013708, upload-time = "2026-03-09T16:49:14.063Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bc/60d93477b653eeb1ddf5f9ec34be689b79234d82dbdded269ac0252715b8/fonttools-4.62.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:106aec9226f9498fc5345125ff7200842c01eda273ae038f5049b0916907acee", size = 4964355, upload-time = "2026-03-09T16:49:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/6dc62bcc3c3598c28a3ecb77e69018869c3e109bd83031d4973c059d318b/fonttools-4.62.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15d86b96c79013320f13bc1b15f94789edb376c0a2d22fb6088f33637e8dfcbc", size = 4953472, upload-time = "2026-03-09T16:49:18.494Z" }, + { url = "https://files.pythonhosted.org/packages/82/b3/3af7592d9b254b7b7fec018135f8776bfa0d1ad335476c2791b1334dc5e4/fonttools-4.62.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f16c07e5250d5d71d0f990a59460bc5620c3cc456121f2cfb5b60475699905f", size = 5094701, upload-time = "2026-03-09T16:49:21.67Z" }, + { url = "https://files.pythonhosted.org/packages/1a/64/61f69298aa6e7c363dcf00dd6371a654676900abe27d1effd1a74b43e5d0/fonttools-4.62.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4fa5a9c716e2f75ef34b5a5c2ca0ee4848d795daa7e6792bf30fd4abf8993449", size = 2864222, upload-time = "2026-03-09T16:49:28.285Z" }, + { url = "https://files.pythonhosted.org/packages/c6/57/6b08756fe4455336b1fe160ab3c11fccc90768ccb6ee03fb0b45851aace4/fonttools-4.62.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:625f5cbeb0b8f4e42343eaeb4bc2786718ddd84760a2f5e55fdd3db049047c00", size = 2410674, upload-time = "2026-03-09T16:49:30.504Z" }, + { url = "https://files.pythonhosted.org/packages/6f/86/db65b63bb1b824b63e602e9be21b18741ddc99bcf5a7850f9181159ae107/fonttools-4.62.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6247e58b96b982709cd569a91a2ba935d406dccf17b6aa615afaed37ac3856aa", size = 4999387, upload-time = "2026-03-09T16:49:32.593Z" }, + { url = "https://files.pythonhosted.org/packages/86/c8/c6669e42d2f4efd60d38a3252cebbb28851f968890efb2b9b15f9d1092b0/fonttools-4.62.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:840632ea9c1eab7b7f01c369e408c0721c287dfd7500ab937398430689852fd1", size = 4912506, upload-time = "2026-03-09T16:49:34.927Z" }, + { url = "https://files.pythonhosted.org/packages/2e/49/0ae552aa098edd0ec548413fbf818f52ceb70535016215094a5ce9bf8f70/fonttools-4.62.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:28a9ea2a7467a816d1bec22658b0cce4443ac60abac3e293bdee78beb74588f3", size = 4951202, upload-time = "2026-03-09T16:49:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/71/65/ae38fc8a4cea6f162d74cf11f58e9aeef1baa7d0e3d1376dabd336c129e5/fonttools-4.62.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ae611294f768d413949fd12693a8cba0e6332fbc1e07aba60121be35eac68d0", size = 5060758, upload-time = "2026-03-09T16:49:39.464Z" }, + { url = "https://files.pythonhosted.org/packages/f8/65/f47f9b3db1ec156a1f222f1089ba076b2cc9ee1d024a8b0a60c54258517e/fonttools-4.62.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0361a7d41d86937f1f752717c19f719d0fde064d3011038f9f19bdf5fc2f5c95", size = 2947079, upload-time = "2026-03-09T16:49:46.471Z" }, + { url = "https://files.pythonhosted.org/packages/52/73/bc62e5058a0c22cf02b1e0169ef0c3ca6c3247216d719f95bead3c05a991/fonttools-4.62.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4108c12773b3c97aa592311557c405d5b4fc03db2b969ed928fcf68e7b3c887", size = 2448802, upload-time = "2026-03-09T16:49:48.328Z" }, + { url = "https://files.pythonhosted.org/packages/2b/df/bfaa0e845884935355670e6e68f137185ab87295f8bc838db575e4a66064/fonttools-4.62.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b448075f32708e8fb377fe7687f769a5f51a027172c591ba9a58693631b077a8", size = 5137378, upload-time = "2026-03-09T16:49:50.223Z" }, + { url = "https://files.pythonhosted.org/packages/32/32/04f616979a18b48b52e634988b93d847b6346260faf85ecccaf7e2e9057f/fonttools-4.62.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5f1fa8cc9f1a56a3e33ee6b954d6d9235e6b9d11eb7a6c9dfe2c2f829dc24db", size = 4920714, upload-time = "2026-03-09T16:49:53.172Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2e/274e16689c1dfee5c68302cd7c444213cfddd23cf4620374419625037ec6/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f8c8ea812f82db1e884b9cdb663080453e28f0f9a1f5027a5adb59c4cc8d38d1", size = 5016012, upload-time = "2026-03-09T16:49:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0c/b08117270626e7117ac2f89d732fdd4386ec37d2ab3a944462d29e6f89a1/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:03c6068adfdc67c565d217e92386b1cdd951abd4240d65180cec62fa74ba31b2", size = 5042766, upload-time = "2026-03-09T16:49:57.726Z" }, + { url = "https://files.pythonhosted.org/packages/9c/57/c2487c281dde03abb2dec244fd67059b8d118bd30a653cbf69e94084cb23/fonttools-4.62.0-py3-none-any.whl", hash = "sha256:75064f19a10c50c74b336aa5ebe7b1f89fd0fb5255807bfd4b0c6317098f4af3", size = 1152427, upload-time = "2026-03-09T16:50:04.074Z" }, +] + +[[package]] +name = "fpdf2" +version = "2.8.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "defusedxml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "fonttools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/f2/72feae0b2827ed38013e4307b14f95bf0b3d124adfef4d38a7d57533f7be/fpdf2-2.8.7.tar.gz", hash = "sha256:7060ccee5a9c7ab0a271fb765a36a23639f83ef8996c34e3d46af0a17ede57f9", size = 362351, upload-time = "2026-02-28T05:39:16.456Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/66/0a/cf50ecffa1e3747ed9380a3adfc829259f1f86b3fdbd9e505af789003141/fpdf2-2.8.7-py3-none-any.whl", hash = "sha256:d391fc508a3ce02fc43a577c830cda4fe6f37646f2d143d489839940932fbc19", size = 327056, upload-time = "2026-02-28T05:39:14.619Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/7d/5df2650c57d47c57232af5ef4b4fdbff182070421e405e0d62c6cdbfaa87/fsspec-2026.1.0.tar.gz", hash = "sha256:e987cb0496a0d81bba3a9d1cee62922fb395e7d4c3b575e57f547953334fe07b", size = 310496, upload-time = "2026-01-09T15:21:35.562Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl", hash = "sha256:cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc", size = 201838, upload-time = "2026-01-09T15:21:34.041Z" }, ] [[package]] name = "gotenberg-client" -version = "0.12.0" +version = "0.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", extra = ["http2"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/6d/07ea213c146bbe91dffebff2d8f4dc61e7076d3dd34d4fd1467f9163e752/gotenberg_client-0.12.0.tar.gz", hash = "sha256:1ab50878024469fc003c414ee9810ceeb00d4d7d7c36bd2fb75318fbff139e9b", size = 1210884, upload-time = "2025-10-15T15:32:37.669Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/6c/aaadd6657ca42fbd148b1c00604b98c1ead5a22552f4e5365ce5f0632430/gotenberg_client-0.13.1.tar.gz", hash = "sha256:cdd6bbb535cd739b87446cd1b4f6347ed7f9af6a0d4b19baf7c064b75528ee54", size = 1211143, upload-time = "2025-12-04T20:45:24.151Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/39/fcb24ff053b1be7e5124f56c3d358706a23a328f685c6db33bc9dbc5472d/gotenberg_client-0.12.0-py3-none-any.whl", hash = "sha256:a540b35ac518e902c2860a88fbe448c15fe5a56fe8ec8604e6a2c8c2228fd0cb", size = 51051, upload-time = "2025-10-15T15:32:36.32Z" }, + { url = "https://files.pythonhosted.org/packages/79/f6/7a6e6785295332d2538f729ae19516cef712273a5ab8b90d015f08e37a45/gotenberg_client-0.13.1-py3-none-any.whl", hash = "sha256:613f7083a5e8a81699dd8d715c97e5806a424ac48920aad25d7c11b600cdfaf3", size = 51058, upload-time = "2025-12-04T20:45:22.603Z" }, ] [[package]] name = "granian" -version = "2.5.4" +version = "2.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/9b/6ac903de211e5874824e7349387c9e0467459dc1ad0cd960cb4196f38ae6/granian-2.5.4.tar.gz", hash = "sha256:85989a08052f1bbb174fd73759e1ae505e50b4c0690af366ca6ba844203dd463", size = 112016, upload-time = "2025-09-18T11:52:16.004Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/a0/b6782563716dfd178f094fe7fe6d28fc6c13857926bb9efac6ddc73dec54/granian-2.5.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:907d17f94a039b1047a82386b4979a6a7db7f4c37598225c6184a2b89f0ae12d", size = 2860831, upload-time = "2025-09-18T11:49:41.521Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a5/6ae10379f21415255dd36b4d26a69a0a8ec80d4ba4fe26ca563e46a1ca62/granian-2.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a009e99d3c4a2a70a15a97391566753045a81641e5a3e651ff346d8bb7fe7450", size = 2550345, upload-time = "2025-09-18T11:49:43.015Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ca/1cdbd669ee4bf85208b96e0bcaf5b51cba67907b71679c18a1da6bea61e6/granian-2.5.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cb602ac3ea567476c339e8683a0fa2ffe7fd8432798bd63c371d5b32502bdb9", size = 3048013, upload-time = "2025-09-18T11:49:44.538Z" }, - { url = "https://files.pythonhosted.org/packages/cf/9e/aba367c3c372d641e78aaaaa4ec8a4452bb8a2259bdb8b7484d537969864/granian-2.5.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52aee85459304f1e74ff4cb5bb60d23db267b671b1199ff589b1a5a65f5638f", size = 2862464, upload-time = "2025-09-18T11:49:45.976Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/542ef36aee53a21ff868a38c4d567eb253b1338501091e36b6ad8090c862/granian-2.5.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8478d777971d6c1601b479c70a5c1aaaba7b656fa5044b1c38b4ba5e172f0fc7", size = 3147423, upload-time = "2025-09-18T11:49:47.266Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a3/1ba8d0d534ab993e1f84eab3320b4e3071e9bec166131e663c60160e5192/granian-2.5.4-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:1da588e951b3e0bce94f2743158750c9733efcbe5c27b31f50e9bda6af8aac1f", size = 2914051, upload-time = "2025-09-18T11:49:48.616Z" }, - { url = "https://files.pythonhosted.org/packages/4b/1e/0e43ee8a4a97c4b2a413964448917cabe154aabc99be46ae0f487ce094e8/granian-2.5.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79db7d0eac7445a383e22b6d3e9323882bc9a9c1d2fd62097c0452822c4de526", size = 2919482, upload-time = "2025-09-18T11:49:49.789Z" }, - { url = "https://files.pythonhosted.org/packages/c7/74/6857f59e1ae9a556b7293c60258963063d74ad154c0411f94dc235aa02ab/granian-2.5.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:cc75f15876415054c094e9ef941cf49c315ee5f0f20701fdfb3ffc698054c727", size = 3157058, upload-time = "2025-09-18T11:49:51.406Z" }, - { url = "https://files.pythonhosted.org/packages/02/e9/05eaa62200693b31a75e3767f5716a55aeb07572f1a41e2d31b6f8bb115d/granian-2.5.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2caeee9d12144c9c285d3074c7979cdf1ad3d84a86204dec9035ca6cec5d713f", size = 3194238, upload-time = "2025-09-18T11:49:52.575Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a3/89471ae2ff6d3111964ef9e0b8ac00c5a68046aca93965048b94ec0ec952/granian-2.5.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a404bff75dc29c01566a4e896237f6cb8eda49a71b90770b8316ebe1b08a3d46", size = 2861005, upload-time = "2025-09-18T11:49:55.442Z" }, - { url = "https://files.pythonhosted.org/packages/85/90/81706bbe0f23737c3c1cf8a4e76a6e2c9ec9c5a950a023aea2aed6ef74c4/granian-2.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d91b4642283ea8169aad64b74b242c364a3ce24d6aeed9b5a4358f99a5ab4d84", size = 2550393, upload-time = "2025-09-18T11:49:57.24Z" }, - { url = "https://files.pythonhosted.org/packages/66/67/7bdd9b1b63c811439ac7b8b4e52112abb5a38b575f033b9c7672d0355a70/granian-2.5.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aa6b4ad4d479fe3e7d42ca4321ae7febad9cdae5c269032234b8b4ac8dbd017", size = 3048134, upload-time = "2025-09-18T11:49:59.263Z" }, - { url = "https://files.pythonhosted.org/packages/39/94/9bd7e8248c438ac7861653ea4fb071a2ed2dcb4b7a1ec5cf034282d4079a/granian-2.5.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2466523c14724d2d68497cd081ffd2aa913381be199e7eb71347847a3651224c", size = 2862817, upload-time = "2025-09-18T11:50:00.932Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f7/c98302718f58a3ee47ab1db83e8c0834b91016fc3c83f3a23f7b256a02a7/granian-2.5.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce9ec6baebb83ba7d1ed507dc7d301f7f29725f9b7a8c9c974f96479dea3a090", size = 3147500, upload-time = "2025-09-18T11:50:02.569Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c0/eb3b94d2eb40d5b94bfad94da018f5daf539e09e8fc33742a8330707913a/granian-2.5.4-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:8b3faa2eec6dbbb072aae575d6a6a5e5577aef13c93d38d454a6a9fffc954ce7", size = 2914076, upload-time = "2025-09-18T11:50:04.074Z" }, - { url = "https://files.pythonhosted.org/packages/0f/77/42e06595c441c14f934858351acacc28fb2552798ab7eefed2e0e3920d15/granian-2.5.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:25a1d03fc93184009d5e76a5bfb5b29222e7debacfc225dd5d3732f6f6f99c10", size = 2919154, upload-time = "2025-09-18T11:50:05.497Z" }, - { url = "https://files.pythonhosted.org/packages/c4/af/1f87d4bfabf09d16dcf3a355cc356daa33185c561a5f3c5904f6fd0f0e5f/granian-2.5.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:1e580f5fa30ed04e724c71de099dcacc4722613f8a53e41454bac86242887da7", size = 3157119, upload-time = "2025-09-18T11:50:07.088Z" }, - { url = "https://files.pythonhosted.org/packages/ab/34/18b038e4b67a97eb776bf84307a0d5c8bff79290024973def614d8052596/granian-2.5.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5a4e74bf6d91dd7df6ffc7edb74e74147057fc947c04684d2d9af03e5e71ad71", size = 3193906, upload-time = "2025-09-18T11:50:08.305Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9f/2a419461f2696bd95ba6b4d2a1c09b7372b79e66ac3b7dd4a985bf35f7d6/granian-2.5.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c4387cca4e38ec7579cac71a2da27fd177ced682b1de8bf917b9610f2ac0ba5e", size = 2846208, upload-time = "2025-09-18T11:50:10.934Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bd/f9b9f57e14f778665e5b56a5b98d20187136517188a39ac404b13812bb34/granian-2.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a126b75927583292a9d2cfae627cd4b1da3e68d04dd87ba5a53b4860768d9e04", size = 2537995, upload-time = "2025-09-18T11:50:12.461Z" }, - { url = "https://files.pythonhosted.org/packages/55/eb/4df4fd10fb0ca0aa7ccbbe6b805e8019dc83d3a7861a8e0ec73a4f671bcf/granian-2.5.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b44dc391bf9bc1303bcb2cb344bbb5c35de92f43a3e8584f2a984dfda2fea8e3", size = 3033917, upload-time = "2025-09-18T11:50:16.535Z" }, - { url = "https://files.pythonhosted.org/packages/1a/ad/a3b8a773ee347f1a9b52d37caeb373eff590363c478cd6d9d20422a842de/granian-2.5.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07c47847163a1bcce0b7c323093b20be8a8ec9d4f4eba596b4d27f85ddbe669f", size = 2860524, upload-time = "2025-09-18T11:50:17.811Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ae/188342234ed4f842ad63fd6a0328a05a8e2b991293496527b30654b6710c/granian-2.5.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c50539f654ce5f8fadd9b360fac0361d812c39c7a5f1e525889c51899a10f0", size = 3139768, upload-time = "2025-09-18T11:50:19.006Z" }, - { url = "https://files.pythonhosted.org/packages/28/40/babaaf6b95bf690cf3af1ff0c3a1d9c33b23f2c18dabb373c805653834bd/granian-2.5.4-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e52f65acd4da0a3af7a5d2d6a6445d530e84fe52057ee39f52ce92a6598fe37b", size = 2915038, upload-time = "2025-09-18T11:50:20.194Z" }, - { url = "https://files.pythonhosted.org/packages/a2/01/3d2eda00cbaa09f5a734d57fb4f52f68a1a48137a262e46d59ffecb54bd6/granian-2.5.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b78ab23495e384521085c33fecb3987779e1b1e43f34acd5b25e864b699933f9", size = 2915368, upload-time = "2025-09-18T11:50:21.335Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/51670c8d83334ea1ce1b54aae93f6066ff101ca81ccd6ab01832309b2156/granian-2.5.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:6a477b204fca30218b3cc16721df38f1e159c5ee27252b305c78982af1995974", size = 3142893, upload-time = "2025-09-18T11:50:22.843Z" }, - { url = "https://files.pythonhosted.org/packages/68/42/81f848d9cf6cd77f24d0625d5c49caf6471477c97a760827d41cbb90a214/granian-2.5.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7f58116ab1300ca744a861482ce3194e9be5f1adad9ac4adda89d47b1ba3fa50", size = 3206519, upload-time = "2025-09-18T11:50:24.124Z" }, - { url = "https://files.pythonhosted.org/packages/50/aa/ed7cee53c0663fbb4d64b9a143d176f76000100f8a5ccef8a166df2bb9a9/granian-2.5.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:533bf842b56c8531705048211e3152fb1234d7611f83257a71cbf7e734c0f4a1", size = 2845936, upload-time = "2025-09-18T11:50:27.394Z" }, - { url = "https://files.pythonhosted.org/packages/04/a3/a63b04b67fb44578ce5d2d6c2b669932d6adb9a4844d86dc0f0cd0adb409/granian-2.5.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1efb111f84236a72d5864d64a0198e04e699014119c33d957fac34a0efb2474", size = 2537660, upload-time = "2025-09-18T11:50:28.953Z" }, - { url = "https://files.pythonhosted.org/packages/a6/99/4c630712f95ce6105f070631242fbafe4c045a00cd5e00f437a03085a9cc/granian-2.5.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0341a553fe913b4a741c10f532f5315d57deaa34877494d4c4b09c666f5266c", size = 3033766, upload-time = "2025-09-18T11:50:30.515Z" }, - { url = "https://files.pythonhosted.org/packages/44/73/d05f0cd49764feedfc91b418e060c212a35077154209e22654891c08d2dc/granian-2.5.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b3b24b7620df45752bbf34f93250f733a6996a7409879efbea6ab38f57eff69", size = 2860740, upload-time = "2025-09-18T11:50:31.799Z" }, - { url = "https://files.pythonhosted.org/packages/6e/85/061748715e5c213c8f5e58c9a7f95741fc5787a0c45c7b066b1df0f59453/granian-2.5.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb902636271f9e61f6653625670982f7a0e19cbc7ae56fc65cd26bf330c612f", size = 3139932, upload-time = "2025-09-18T11:50:33.07Z" }, - { url = "https://files.pythonhosted.org/packages/7e/5b/f361708fd275763f1436bc1584bf3171ea5b6b12255e7cf3d5a2d7280546/granian-2.5.4-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:23b2e86ea97320bbe80866a94e6855752f0c73c0ec07772e0241e8409384cde5", size = 2914531, upload-time = "2025-09-18T11:50:34.364Z" }, - { url = "https://files.pythonhosted.org/packages/0d/84/9f1dbcb6a2228fd9bbf548d81f17225ae26dbbcef33f61d7e14971d78d2f/granian-2.5.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:328ed82315ccbd5dedc8f5318a1f80d49e07eb34ebc0753bc2930d2f30070a34", size = 2915108, upload-time = "2025-09-18T11:50:35.667Z" }, - { url = "https://files.pythonhosted.org/packages/77/10/13e04a2ef44f711474ca68a095e65f72fb6ced28f5c0930980a012386f8b/granian-2.5.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:9bd438bb41cbac25f5f3155924947f0e2594b69f8a5f78e43c453c35fa28a1f0", size = 3142589, upload-time = "2025-09-18T11:50:37.349Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/826dab4703261d0f500b5d1d0cc8a965157856b0266ca3679185d316d5f7/granian-2.5.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d6d1b462ccb57af3051def8eae13f1df81dc902e9deff3cc6dfbb692c40a5a1f", size = 3206072, upload-time = "2025-09-18T11:50:38.602Z" }, - { url = "https://files.pythonhosted.org/packages/d5/40/a9d9e976bfbd6274d1fe052676fb02c055c1476a9936961218a211785cef/granian-2.5.4-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d04a1432ed98b7e4b4e5cff188819f34bd680785352237477d7886eb9305f692", size = 2763126, upload-time = "2025-09-18T11:50:41.404Z" }, - { url = "https://files.pythonhosted.org/packages/ad/84/0a302005e3c1c254c592d29aaa11a281ef4a84dfab45ccfe3072223f9c5b/granian-2.5.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c6309d729f1b022b09fd051a277096a732bd8ed39986ac4b9849f6e79b660880", size = 2479158, upload-time = "2025-09-18T11:50:42.767Z" }, - { url = "https://files.pythonhosted.org/packages/74/9f/a889cc30f2ee67acdcfccd10c3da239c828c584cb9e7f04e54717ff0c42b/granian-2.5.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a067c27e733b0851e6f66175c1aac8badda60b698457181881c08a4e17baecf", size = 3016245, upload-time = "2025-09-18T11:50:44.3Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/22a86b369b140b3684f8aecfd9c80ed2765421c09cb3d3ef06245a6aaaf8/granian-2.5.4-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:54bd0604db172a964b1bc4b8709329b7f4e9cff6b8f468104ca7603a5e61d529", size = 2795566, upload-time = "2025-09-18T11:50:45.626Z" }, - { url = "https://files.pythonhosted.org/packages/c3/cc/65073d6f08d9251ceaa5eb9a485e1a8fda9cfb4bac3c03c9f28e01abf416/granian-2.5.4-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:487bdc40b234ef84510eac1d63f0720ca92daca08feb7d2d98a1f0a84cc54b0e", size = 2909489, upload-time = "2025-09-18T11:50:48.98Z" }, - { url = "https://files.pythonhosted.org/packages/d9/76/c52fdfcd536584ed01a878e13139e338083fac4fde32d6fbfb0f3b29f380/granian-2.5.4-cp313-cp313t-musllinux_1_1_armv7l.whl", hash = "sha256:76cd55ab521cc501a977f50ace9d72a6a4f9a6849e6490b14af2e9acc614ce55", size = 3124827, upload-time = "2025-09-18T11:50:50.45Z" }, - { url = "https://files.pythonhosted.org/packages/f3/fc/4d93870feebc547bbc68dcbfa3a6c491107a6ac634636c7e332441ef9077/granian-2.5.4-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:27b3e7906916ad6e84a8b16d89517d8652bece62888cb9421597eb14767a9d92", size = 3193471, upload-time = "2025-09-18T11:50:52.493Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/d1776652352df81c420e61a1d79711c9992ba6dcd1a419b1c9df83c925ce/granian-2.5.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c237db56e5ff3fdad6539a3fbfcb9b57ce71463db55a016ba08296828043112f", size = 2827836, upload-time = "2025-09-18T11:50:55.444Z" }, - { url = "https://files.pythonhosted.org/packages/73/60/0f7b994feaca68c2585fa96338369fc8f928281cb1f7da2a377ec698f6a2/granian-2.5.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a76d7033a8d68c8353293fae8365e3b649bb155ab39af14387f3e9e870d503fb", size = 2525297, upload-time = "2025-09-18T11:50:56.765Z" }, - { url = "https://files.pythonhosted.org/packages/ff/06/73580eef85ac4ac4da7205d320e449a46db0e613b6df706a5feb46809e96/granian-2.5.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6778b9f7ecef8a423dd203aa5b0644a18d53eb749e830b2fe33abecad5d7e84", size = 3028201, upload-time = "2025-09-18T11:50:58.047Z" }, - { url = "https://files.pythonhosted.org/packages/19/78/5c0b43af33b18bd528b10ff770aaeb158a4fbeb0ac5cc0371921759b6b59/granian-2.5.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3accc02c981436e783772b12ea8cead35e8e644437881d7da842ff474f8e30f9", size = 2852319, upload-time = "2025-09-18T11:50:59.573Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ae/ad9cc1729d12b9699318c66015999efef14c7fd17836393a09a1bbbf5185/granian-2.5.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3eaaf38851308af616ad5fdc35f333857f128493072ea208c1bb2fb557dcf2e", size = 3135211, upload-time = "2025-09-18T11:51:01.022Z" }, - { url = "https://files.pythonhosted.org/packages/7d/41/cbda436041e46116647d804d2eada3fab144883b0e6ce75f3d967a116c6c/granian-2.5.4-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:3cad64e8e41d6f3daf3e7a3eea88023aa7e64ee81450443ac9f4e6cae005079d", size = 2914810, upload-time = "2025-09-18T11:51:02.36Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/ab53dcab1d55636eca417a4263114d24872958609ceb853b84887b12cc38/granian-2.5.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4bb60b122971326d0d1baf10336c67bdecdd7adc708cf0b09bf1cde5563e8f5", size = 2914603, upload-time = "2025-09-18T11:51:03.701Z" }, - { url = "https://files.pythonhosted.org/packages/a0/33/e8810b11004e9139b6dd71dfa4a1a56ae60331e8d72dfa8bc7121158abff/granian-2.5.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:14129339f0ed9bbd2d129f82ed16e0c330edca7300482bd53cef466cc7b3ec6d", size = 3137585, upload-time = "2025-09-18T11:51:04.921Z" }, - { url = "https://files.pythonhosted.org/packages/17/4c/78650e1d54a9a8460add62643a57a0042880592e5a6f5574370954d7e91d/granian-2.5.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:294c574fcd8005587671476b751e5853b262ecb1b1011e634ac160d6a0259abd", size = 3195738, upload-time = "2025-09-18T11:51:06.328Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d0/cdab820b2f5c692dc4c67879f937fb223eae1599784755362a53872f512c/granian-2.5.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3f0940963f6c6e50de19195014902d9a565a612aa0583082c9082bd83f259446", size = 2747894, upload-time = "2025-09-18T11:51:09.927Z" }, - { url = "https://files.pythonhosted.org/packages/71/15/1d27cd429a4fb0cb066848ca7ba432e5887b2506873832136444a6aa24d2/granian-2.5.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bc27bff6ea5a80fd5bf28297ac53fa31771cbdfa35650a6eb4f2c4efc751097d", size = 2463984, upload-time = "2025-09-18T11:51:11.294Z" }, - { url = "https://files.pythonhosted.org/packages/18/c0/2f3594892055c465c0035d5fc174da95c01a4902f9c63e7ea05d49fad892/granian-2.5.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73c136bac23cd1d2c969a52374972ec7da6e0920768bf0bcce65e00cabb4ebb9", size = 3009713, upload-time = "2025-09-18T11:51:12.713Z" }, - { url = "https://files.pythonhosted.org/packages/31/e7/09e44ece7ebcd5a70cd313ca3a0fa5b21632697c20412ddf169c51f16894/granian-2.5.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2dc03e2f375354b95d477c9455fb2fb427a922740f45e036cdf60da660adbf13", size = 2794570, upload-time = "2025-09-18T11:51:14.015Z" }, - { url = "https://files.pythonhosted.org/packages/e4/91/e76301bf0411ede4739b273c972f959c4675702418b00228ed7c278aac05/granian-2.5.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:539ee12b02281929358349e01a0c42c0594ebcf4f44033c8a4d7a446f837e034", size = 2909702, upload-time = "2025-09-18T11:51:16.252Z" }, - { url = "https://files.pythonhosted.org/packages/4a/6e/928b37a9a8a863339f5e37d4154de6faf1b8c58c8684799e117caf66b3a4/granian-2.5.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:97735bdbc2877583ea1c8dbfca31bcaf118a6e818afe6000eb8a9d09fd9d07e0", size = 3118746, upload-time = "2025-09-18T11:51:17.928Z" }, - { url = "https://files.pythonhosted.org/packages/94/7c/5c24c3d17ae24eee4af34bc46ecf6d9fc5d3a23b7b974c7ef3ff0f51cea9/granian-2.5.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:5f642a4fa1d41943d288db714bd1e0d218537bfa8bc6355d7063e8959b84c32b", size = 3187333, upload-time = "2025-09-18T11:51:19.427Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7f/37896fc4180fd0f59146e3bd88e21fb71ce28c705d482540cfc8fc532cc9/granian-2.5.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9b970a50230ae437615d754e1bc4aaa740fbe3f1418cc0c8933b260a691bb8f5", size = 2853053, upload-time = "2025-09-18T11:51:37.959Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f4/fb23d1958b52a1546f25da03c459e11ea634d166dc7ef6024c7662c949fc/granian-2.5.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a09d2bef7805f10093aa356d976fdb3607d274252ef9429c6c1a24d239032c29", size = 2553878, upload-time = "2025-09-18T11:51:39.251Z" }, - { url = "https://files.pythonhosted.org/packages/54/43/e105894f0ae2711080c827f71d04d63ec7b4b881e0c4ae8a22a41500c800/granian-2.5.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6d5bd05c6e833d54b77c2ee19130cfa5d54ae4eb301ffca56744f712c4a9d03", size = 3139712, upload-time = "2025-09-18T11:51:40.999Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ae/d1df545edeafbfd787c73863e47b269ff5646ec68b025db692a1c6aafbd5/granian-2.5.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a7782a25ab78a55b61cb9b06f8aac471e9fafa3e1c20d6cdf970e93c834f6ddf", size = 2919335, upload-time = "2025-09-18T11:51:42.616Z" }, - { url = "https://files.pythonhosted.org/packages/6f/95/c55889554ef4471b786853707c3fa68f8ef4fafa3257054bd6990042db1f/granian-2.5.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4403600ac0273d4169c4c73773f57c5a3b44cc8aa8384a2f468c98c4294a3f27", size = 2927449, upload-time = "2025-09-18T11:51:44.273Z" }, - { url = "https://files.pythonhosted.org/packages/0b/52/34d3e17753c20ea56b88e48778e8c2b6fa01593e6febc0123bb6edfae7d7/granian-2.5.4-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c711335619a6936728b7773052fb0ec9d612b19abb2c786972ce3efee836df9d", size = 3172721, upload-time = "2025-09-18T11:51:45.76Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b0/0323368449a05b2693ebbbbd4f61bcaef858a3df0255b6ee3dd460112549/granian-2.5.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ff9996929a16a72a61fb1f03a9e79e830bf7a6a4e9eb0470c6ef03f67d5ea5c0", size = 3183851, upload-time = "2025-09-18T11:51:47.651Z" }, - { url = "https://files.pythonhosted.org/packages/6a/69/e4c77826239bf3d612dced6a3a0007ef378bb454d602d5751a16c8b74d2f/granian-2.5.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f3fcf2e6c8a150f48e4b77271b33ebfc7c2d8381e692b5177d4bd7fcefbb691d", size = 2853059, upload-time = "2025-09-18T11:51:52.136Z" }, - { url = "https://files.pythonhosted.org/packages/6f/74/4ac398a54f718db5fd13e92ed1198a76c7c332dee4ab7af9c06ded51c884/granian-2.5.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:c5550d533a61053fc4d95044bdc80ba00118ca312ed85867ed63163fa5878f85", size = 2553706, upload-time = "2025-09-18T11:51:53.714Z" }, - { url = "https://files.pythonhosted.org/packages/32/10/871e8d09eae976613b3b0812eb927d39e7960fecf1ac885e21962bbc8ff3/granian-2.5.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48356114113ac3d48f70ea05cf42e560384c93318f5ef8f5638cb666f8243f2b", size = 3139539, upload-time = "2025-09-18T11:51:55.133Z" }, - { url = "https://files.pythonhosted.org/packages/ec/f6/dd0ef6a7f3f4fea28b57014bc69b925995c7c6006451653b115440bf432b/granian-2.5.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:cbadc8e49f90716b8f8aa2c2cee7a2e82c5a37dab5f6fbd449e76185ce205715", size = 2919295, upload-time = "2025-09-18T11:51:56.496Z" }, - { url = "https://files.pythonhosted.org/packages/27/dd/3a8f99363b05d33049ea8cd94e0d40792aebddfa39f6f14120b71613fdca/granian-2.5.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d1712a8ede152c2648557de6a23dbeb05ed499bfd83c42dad0689d9f2ba0621d", size = 2927578, upload-time = "2025-09-18T11:51:58.081Z" }, - { url = "https://files.pythonhosted.org/packages/49/42/ecb762dbf7a1447a89b4884907d07fa505fd89f904c1e2d3bd4f30aeb9d1/granian-2.5.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b78b8a6f30d0534b2db3f9cb99702d06be110b6e91f5639837a6f52f4891fc1d", size = 3172980, upload-time = "2025-09-18T11:51:59.428Z" }, - { url = "https://files.pythonhosted.org/packages/4c/2f/2abc969b206033d789c87d0ed7ee17a8831b0740e30590348abb544dba13/granian-2.5.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:10ae5ce26b1048888ac5aa3747415d8be8bbb014106b27ef0e77d23d2e00c51d", size = 3183479, upload-time = "2025-09-18T11:52:01.133Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/57/19/d4ea523715ba8dd2ed295932cc3dda6bb197060f78aada6e886ff08587b2/granian-2.7.2.tar.gz", hash = "sha256:cdae2f3a26fa998d41fefad58f1d1c84a0b035a6cc9377addd81b51ba82f927f", size = 128969, upload-time = "2026-02-24T23:04:23.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/58/dcf0e8a54b9a7f8b7482ed617bca08503a47eb6b702aea73cda9efd2c81c/granian-2.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a0d33ada95a1421e5a22d447d918e5615ff0aa37f12de5b84455afe89970875", size = 6522860, upload-time = "2026-02-24T23:02:15.901Z" }, + { url = "https://files.pythonhosted.org/packages/2b/dd/398de0f273fdcf0e96bd70d8cd97364625176990e67457f11e23f95772bd/granian-2.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee26f0258cc1b6ccf87c7bdcee6d1f90710505522fc9880ec02b299fb15679ad", size = 6135934, upload-time = "2026-02-24T23:02:18.52Z" }, + { url = "https://files.pythonhosted.org/packages/67/b7/7bf635bbdfb88dfc6591fa2ce5c3837ab9535e57e197a780c4a338363de7/granian-2.7.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f52338cfab08b8cdaadaa5b93665e0be5b4c4f718fbd132d76ceacacb9ff864e", size = 7138393, upload-time = "2026-02-24T23:02:19.911Z" }, + { url = "https://files.pythonhosted.org/packages/0a/90/e424fd8a703add1e8922390503be8d057882b35b42ba51796157aabd659b/granian-2.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e377d03a638fecb6949ab05c8fd4a76f892993aed17c602d179bfd56aebc2de", size = 6467189, upload-time = "2026-02-24T23:02:21.896Z" }, + { url = "https://files.pythonhosted.org/packages/65/9a/5de24d7e2dba1aa9fbac6f0a80dace975cfac1b7c7624ece21da75a38987/granian-2.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f742f3ca1797a746fae4a9337fe5d966460c957fa8efeaccf464b872e158d3d", size = 6870813, upload-time = "2026-02-24T23:02:23.972Z" }, + { url = "https://files.pythonhosted.org/packages/ac/cd/a604e38237857f4ad4262eadc409f94fe08fed3e86fa0b8734479cc5bfb1/granian-2.7.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:ca4402e8f28a958f0c0f6ebff94cd0b04ca79690aded785648a438bc3c875ba3", size = 7046583, upload-time = "2026-02-24T23:02:25.94Z" }, + { url = "https://files.pythonhosted.org/packages/cc/ad/79eaae0cddd90c4e191b37674cedd8f4863b44465cb435b10396d0f12c82/granian-2.7.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1f9a899123b0d084783626e5225608094f1d2f6fc81b3a7c77ab8daac33ab74a", size = 7121958, upload-time = "2026-02-24T23:02:27.641Z" }, + { url = "https://files.pythonhosted.org/packages/ca/51/e5c923b1baa003f5b4b7fc148be6f8d2e3cabe55d41040fe8139da52e31b/granian-2.7.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:56ba4bef79d0ae3736328038deed2b5d281b11672bc0b08ffc8ce6210e406ef8", size = 7303047, upload-time = "2026-02-24T23:02:30.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/c0/ebd68144a3ce9ead1a3192ac02e1c26e4874df1257435ce6137adf92fedb/granian-2.7.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea46e3f43d94715aa89d1f2f5754753d46e6b653d561b82b0291e62a31bdfb35", size = 7011349, upload-time = "2026-02-24T23:02:32.887Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ed/37f5d7d887ec9159dd8f5b1c9c38cee711d51016d203959f2d51c536a33b/granian-2.7.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a836f3f8ebfe61cb25d9afb655f2e5d3851154fd2ad97d47bb4fb202817212fc", size = 6451593, upload-time = "2026-02-24T23:02:36.203Z" }, + { url = "https://files.pythonhosted.org/packages/1e/06/84ee67a68504836a52c48ec3b4b2b406cbd927c9b43aae89d82db8d097a0/granian-2.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09b1c543ba30886dea515a156baf6d857bbb8b57dbfd8b012c578b93c80ef0c3", size = 6101239, upload-time = "2026-02-24T23:02:37.636Z" }, + { url = "https://files.pythonhosted.org/packages/ed/50/ece7dc8efe144542cd626b88b1475b649e2eaa3eb5f7541ca57390151b05/granian-2.7.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d334d4fbefb97001e78aa8067deafb107b867c102ba2120b4b2ec989fa58a89", size = 7079443, upload-time = "2026-02-24T23:02:39.651Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/0f37b531d3cc96b8538cca2dc86eda92102e0ee345b30aa689354194a4cb/granian-2.7.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c86081d8c87989db69650e9d0e50ed925b8cd5dad21e0a86aa72d7a45f45925", size = 6428683, upload-time = "2026-02-24T23:02:41.827Z" }, + { url = "https://files.pythonhosted.org/packages/47/09/228626706554b389407270e2a6b19b7dee06d6890e8c01a39c6a785827fd/granian-2.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9eda33dca2c8bc6471bb6e9e25863077bca3877a1bba4069cd5e0ee2de41765", size = 6959520, upload-time = "2026-02-24T23:02:43.488Z" }, + { url = "https://files.pythonhosted.org/packages/61/c0/a639ceabd59b8acae2d71b5c918fcb2d42f8ef98994eedcf9a8b6813731d/granian-2.7.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9cf69aaff6f632074ffbe7c1ee214e50f64be36101b7cb8253eeec1d460f2dba", size = 6991548, upload-time = "2026-02-24T23:02:44.954Z" }, + { url = "https://files.pythonhosted.org/packages/b1/99/a35ed838a3095dcad02ae3944d19ebafe1d5a98cdc72bb61835fb5faf933/granian-2.7.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f761a748cc7f3843b430422d2539da679daf5d3ef0259a101b90d5e55a0aafa7", size = 7121475, upload-time = "2026-02-24T23:02:46.991Z" }, + { url = "https://files.pythonhosted.org/packages/ce/24/3952c464432b904ec1cf537d2bd80d2dfde85524fa428ab9db2b5afe653c/granian-2.7.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:41c7b8390b78647fe34662ed7296e1465dad4a5112af9b0ecf8e367083d6c76a", size = 7243647, upload-time = "2026-02-24T23:02:49.165Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fa/ab39e39c6b78eab6b42cf5bb36f56badde2aaafc3807f03f781d00e7861a/granian-2.7.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a052ed466da5922cb443435a95a0c751566943278a6f22cef3d2e19d4e7ecdea", size = 7048915, upload-time = "2026-02-24T23:02:50.773Z" }, + { url = "https://files.pythonhosted.org/packages/ab/bc/cf0bc29f583096a842cf0f26ae2fe40c72ed5286d4548be99ecfcdbb17e2/granian-2.7.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:76b840ff13dde8838fd33cd096f2e7cadf2c21a499a67f695f53de57deab6ff8", size = 6440868, upload-time = "2026-02-24T23:02:53.619Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0d/bae1dcd2182ba5d9a5df33eb50b56dc5bbe67e31033d822e079aa8c1ff30/granian-2.7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:00ccc8d7284bc7360f310179d0b4d17e5ca3077bbe24427e9e9310df397e3831", size = 6097336, upload-time = "2026-02-24T23:02:55.185Z" }, + { url = "https://files.pythonhosted.org/packages/65/7d/3e0a7f32b0ad5faa1d847c51191391552fa239821c95fc7c022688985df2/granian-2.7.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:675987c1b321dc8af593db8639e00c25277449b32e8c1b2ddd46b35f28d9fac4", size = 7098742, upload-time = "2026-02-24T23:02:57.898Z" }, + { url = "https://files.pythonhosted.org/packages/89/41/3b44386d636ac6467f0f13f45474c71fc3b90a4f0ba8b536de91b2845a09/granian-2.7.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:681c6fbe3354aaa6251e6191ec89f5174ac3b9fbc4b4db606fea456d01969fcb", size = 6430667, upload-time = "2026-02-24T23:02:59.789Z" }, + { url = "https://files.pythonhosted.org/packages/52/70/7b24e187aed3fb7ac2b29d2480a045559a509ef9fec54cffb8694a2d94af/granian-2.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5c9ae65af5e572dca27d8ca0da4c5180b08473ac47e6f5329699e9455a5cc3", size = 6948424, upload-time = "2026-02-24T23:03:01.406Z" }, + { url = "https://files.pythonhosted.org/packages/fa/4c/cb74c367f9efb874f2c8433fe9bf3e824f05cf719f2251d40e29e07f08c0/granian-2.7.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e37fab2be919ceb195db00d7f49ec220444b1ecaa07c03f7c1c874cacff9de83", size = 7000407, upload-time = "2026-02-24T23:03:03.214Z" }, + { url = "https://files.pythonhosted.org/packages/58/98/dfed3966ed7fbd3aae56e123598f90dc206484092b8373d0a71e2d8b82a8/granian-2.7.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:8ec167ab30f5396b5caaff16820a39f4e91986d2fe5bdc02992a03c2b2b2b313", size = 7121626, upload-time = "2026-02-24T23:03:05.349Z" }, + { url = "https://files.pythonhosted.org/packages/39/82/acec732a345cd03b2f6e48ac04b66b7b8b61f5c50eb08d7421fc8c56591a/granian-2.7.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:63f426d793f2116d23be265dd826bec1e623680baf94cc270fe08923113a86ba", size = 7253447, upload-time = "2026-02-24T23:03:06.986Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2b/64779e69b08c1ff1bfc09a4ede904ab761ff63f936c275710886057c52f7/granian-2.7.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1617cbb4efe3112f07fb6762cf81d2d9fe4bdb78971d1fd0a310f8b132f6a51e", size = 7053005, upload-time = "2026-02-24T23:03:09.021Z" }, + { url = "https://files.pythonhosted.org/packages/4c/49/9eb88875d709db7e7844e1c681546448dab5ff5651cd1c1d80ac4b1de4e3/granian-2.7.2-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:016c5857c8baedeab7eb065f98417f5ea26bb72b0f7e0544fe76071efc5ab255", size = 6401748, upload-time = "2026-02-24T23:03:12.802Z" }, + { url = "https://files.pythonhosted.org/packages/e3/80/85726ad9999ed89cb6a32f7f57eb50ce7261459d9c30c3b194ae4c5aa2c5/granian-2.7.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dcbe01fa141adf3f90964e86a959e250754aa7c6dad8fa7a855e6fd382de4c13", size = 6101265, upload-time = "2026-02-24T23:03:14.435Z" }, + { url = "https://files.pythonhosted.org/packages/07/82/0df56a42b9f4c327d0e0b052f43369127e1b565b9e66bf2c9488f1c8d759/granian-2.7.2-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:283ba23817a685784b66f45423d2f25715fdc076c8ffb43c49a807ee56a0ffc0", size = 6249488, upload-time = "2026-02-24T23:03:16.387Z" }, + { url = "https://files.pythonhosted.org/packages/ef/cc/d83a351560a3d6377672636129c52f06f8393f5831c5ee0f06f274883ea6/granian-2.7.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3258419c741897273ce155568b5a9cbacb7700a00516e87119a90f7d520d6783", size = 7104734, upload-time = "2026-02-24T23:03:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/84/d1/539907ee96d0ee2bcceabb4a6a9643b75378d6dfea09b7a9e4fd22cdf977/granian-2.7.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a196125c4837491c139c9cc83541b48c408c92b9cfbbf004fd28717f9c02ad21", size = 6785504, upload-time = "2026-02-24T23:03:19.763Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/4b6f45882f8341e7c6cb824d693deb94c306be6525b483c76fb373d1e749/granian-2.7.2-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:746555ac8a2dcd9257bfe7ad58f1d7a60892bc4613df6a7d8f736692b3bb3b88", size = 6902790, upload-time = "2026-02-24T23:03:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/44/b8/832970d2d4b144b87be39f5b9dfd31fdb17f298dc238a0b2100c95002cf8/granian-2.7.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:5ac1843c6084933a54a07d9dcae643365f1d83aaff3fd4f2676ea301185e4e8b", size = 7082682, upload-time = "2026-02-24T23:03:23.875Z" }, + { url = "https://files.pythonhosted.org/packages/38/bc/1521dbf026d1c9d2465cd54e016efd8ff6e1e72eff521071dab20dd61c44/granian-2.7.2-cp313-cp313t-musllinux_1_1_armv7l.whl", hash = "sha256:3612eb6a3f4351dd2c4df246ed0d21056c0556a6b1ed772dd865310aa55a9ba9", size = 7264742, upload-time = "2026-02-24T23:03:25.562Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/00884ab77045a2f54db90932f9d1ca522201e2a6b2cf2a9b38840db0fd54/granian-2.7.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:34708b145e31b4538e0556704a07454a76d6776c55c5bc3a1335e80ef6b3bae3", size = 7062571, upload-time = "2026-02-24T23:03:27.278Z" }, + { url = "https://files.pythonhosted.org/packages/69/4a/8ce622f4f7d58e035d121b9957dd5a8929028dc99cfc5d2bf7f2aa28912c/granian-2.7.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:592806c28c491f9c1d1501bac706ecf5e72b73969f20f912678d53308786d658", size = 6442041, upload-time = "2026-02-24T23:03:30.986Z" }, + { url = "https://files.pythonhosted.org/packages/27/62/7d36ed38a40a68c2856b6d2a6fedd40833e7f82eb90ba0d03f2d69ffadf5/granian-2.7.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c9dcde3968b921654bde999468e97d03031f28668bc1fc145c81d8bedb0fb2a4", size = 6100793, upload-time = "2026-02-24T23:03:32.734Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c5/17fea68f4cb280c217cbd65534664722c9c9b0138c2754e20c235d70b5f4/granian-2.7.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d4d78408283ec51f0fb00557856b4593947ad5b48287c04e1c22764a0ac28a5", size = 7119810, upload-time = "2026-02-24T23:03:34.807Z" }, + { url = "https://files.pythonhosted.org/packages/0a/76/35e240d107e0f158662652fd61191de4fb0c2c080e3786ca8f16c71547b7/granian-2.7.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d28b078e8087f794b83822055f95caf93d83b23f47f4efcd5e2f0f7a5d8a81", size = 6450789, upload-time = "2026-02-24T23:03:36.81Z" }, + { url = "https://files.pythonhosted.org/packages/4c/55/a6d08cfecc808149a910e51c57883ab26fad69d922dc2e76fb2d87469e2d/granian-2.7.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ff7a93123ab339ba6cad51cc7141f8880ec47b152ce2491595bb08edda20106", size = 6902672, upload-time = "2026-02-24T23:03:38.655Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/c86d95f324248fcc5dcaf034c9f688b32f7a488f0b2a4a25e6673776107f/granian-2.7.2-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a52effb9889f0944f0353afd6ce5a9d9aa83826d44bbf3c8013e978a3d6ef7b7", size = 6964399, upload-time = "2026-02-24T23:03:40.459Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/44fde33fe10245a3fba76bf843c387fad2d548244345115b9d87e1c40994/granian-2.7.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:76c987c3ca78bf7666ab053c3ed7e3af405af91b2e5ce2f1cf92634c1581e238", size = 7034929, upload-time = "2026-02-24T23:03:42.149Z" }, + { url = "https://files.pythonhosted.org/packages/90/76/38d205cb527046241a9ee4f51048bf44101c626ad4d2af16dd9d14dc1db6/granian-2.7.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:6590f8092c2bb6614e561ba771f084cbf72ecbc38dbf9849762ac38718085c29", size = 7259609, upload-time = "2026-02-24T23:03:43.852Z" }, + { url = "https://files.pythonhosted.org/packages/00/37/04245c7259e65f1083ce193875c6c44da4c98604d3b00a264a74dd4f042b/granian-2.7.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7c1ce9b0c9446b680e9545e7fc95a75f0c53a25dedcf924b1750c3e5ba5bf908", size = 7073161, upload-time = "2026-02-24T23:03:45.655Z" }, + { url = "https://files.pythonhosted.org/packages/cc/07/0e56fb4f178e14b4c1fa1f6f00586ca81761ccbe2d8803f2c12b6b17a7d6/granian-2.7.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a698d9b662d5648c8ae3dc01ad01688e1a8afc3525e431e7cddb841c53e5e291", size = 6415279, upload-time = "2026-02-24T23:03:48.932Z" }, + { url = "https://files.pythonhosted.org/packages/27/bc/3e69305bf34806cd852f4683deec844a2cb9a4d8888d7f172b507f6080a8/granian-2.7.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:17516095b520b3c039ddbe41a6beb2c59d554b668cc229d36d82c93154a799af", size = 6090528, upload-time = "2026-02-24T23:03:50.52Z" }, + { url = "https://files.pythonhosted.org/packages/ec/10/7d58a922b44417a6207c0a3230b0841cd7385a36fc518ac15fed16ebf6f7/granian-2.7.2-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96b0fd9eac60f939b3cbe44c8f32a42fdb7c1a1a9e07ca89e7795cdc7a606beb", size = 6252291, upload-time = "2026-02-24T23:03:52.248Z" }, + { url = "https://files.pythonhosted.org/packages/54/56/65776c6d759dcef9cce15bc11bdea2c64fe668088faf35d87916bd88f595/granian-2.7.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e50fb13e053384b8bd3823d4967606c6fd89f2b0d20e64de3ae212b85ffdfed2", size = 7106748, upload-time = "2026-02-24T23:03:53.994Z" }, + { url = "https://files.pythonhosted.org/packages/81/ee/d9ed836316607401f158ac264a3f770469d1b1edbf119402777a9eff1833/granian-2.7.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb1ef13125bc05ab2e18869ed311beaeb085a4c4c195d55d0865f5753a4c0b4", size = 6778883, upload-time = "2026-02-24T23:03:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/a1/46/eabab80e07a14527c336dec6d902329399f3ba2b82dc94b6435651021359/granian-2.7.2-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b1c77189335070c6ba6b8d158518fde4c50f892753620f0b22a7552ad4347143", size = 6903426, upload-time = "2026-02-24T23:03:57.296Z" }, + { url = "https://files.pythonhosted.org/packages/24/8a/8ce186826066f6d453316229383a5be3b0b8a4130146c21f321ee64fe2cb/granian-2.7.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:1777166c3c853eed4440adb3cbbf34bba2b77d595bfc143a5826904a80b22f34", size = 7083877, upload-time = "2026-02-24T23:03:59.425Z" }, + { url = "https://files.pythonhosted.org/packages/cf/eb/91ed4646ce1c920ad39db0bcddb6f4755e1823002b14fb026104e3eb8bce/granian-2.7.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:0ffac19208ae548f3647c849579b803beaed2b50dfb0f3790ad26daac0033484", size = 7267282, upload-time = "2026-02-24T23:04:01.218Z" }, + { url = "https://files.pythonhosted.org/packages/49/2f/58cba479254530ab09132e150e4ab55362f6e875d9e82b6790477843e0aa/granian-2.7.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:82f34e78c1297bf5a1b6a5097e30428db98b59fce60a7387977b794855c0c3bc", size = 7054941, upload-time = "2026-02-24T23:04:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/59/71/f21b26c7dc7a8bc9d8288552c9c12128e73f1c3f04799b6e28a0a269b9b0/granian-2.7.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5613ee8c1233a79e56e1735e19c8c70af22a8c6b5808d7c1423dc5387bee4c05", size = 6504773, upload-time = "2026-02-24T23:04:06.498Z" }, + { url = "https://files.pythonhosted.org/packages/6e/68/282fbf5418f9348f657f505dc744cdca70ac850d39a805b21395211bf099/granian-2.7.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0cd6fee79f585de2e1a90b6a311f62b3768c7cda649bc0e02908157ffa2553cc", size = 6138096, upload-time = "2026-02-24T23:04:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/e7/e0/b578709020f84c07ad2ca88f77ac67fd2c62e6b16f93ff8c8d65b7d99296/granian-2.7.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94c825f8b327114f7062d158c502a540ef5819f809e10158f0edddddaf41bb9", size = 6900043, upload-time = "2026-02-24T23:04:11.015Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2f/a2671cc160f29ccf8e605eb8fa113c01051b0d7947048c5b29eb4e603384/granian-2.7.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a6adea5fb8a537d18f3f2b848023151063bc45896415fdebfeb0bf0663d5a03b", size = 7040211, upload-time = "2026-02-24T23:04:13.31Z" }, + { url = "https://files.pythonhosted.org/packages/36/ce/df9bba3b211cda2d47535bb21bc040007e021e8c8adc20ce36619f903bc4/granian-2.7.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2392ab03cb92b1b2d4363f450b2d875177e10f0e22d67a4423052e6885e430f2", size = 7118085, upload-time = "2026-02-24T23:04:15.05Z" }, + { url = "https://files.pythonhosted.org/packages/a9/87/37124b2ee0cddce6ba438b0ff879ddae094ae2c92b24b28ffbe35110931f/granian-2.7.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:406c0bb1f5bf55c72cfbfdfd2ccec21299eb3f7b311d85c4889dde357fd36f33", size = 7314667, upload-time = "2026-02-24T23:04:16.783Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ac/8b142ed352bc525e3c97440aab312928beebc735927b0cf979692bfcda3b/granian-2.7.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:362a6001daa2ce62532a49df407fe545076052ef29289a76d5760064d820f48b", size = 7004934, upload-time = "2026-02-24T23:04:19.059Z" }, ] [package.optional-dependencies] @@ -1173,6 +1530,61 @@ uvloop = [ { name = "uvloop", marker = "(platform_python_implementation == 'CPython' and sys_platform == 'darwin') or (platform_python_implementation == 'CPython' and sys_platform == 'linux')" }, ] +[[package]] +name = "greenlet" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/99/1cd3411c56a410994669062bd73dd58270c00cc074cac15f385a1fd91f8a/greenlet-3.3.1.tar.gz", hash = "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98", size = 184690, upload-time = "2026-01-23T15:31:02.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/e8/2e1462c8fdbe0f210feb5ac7ad2d9029af8be3bf45bd9fa39765f821642f/greenlet-3.3.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c", size = 274974, upload-time = "2026-01-23T15:31:02.891Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a8/530a401419a6b302af59f67aaf0b9ba1015855ea7e56c036b5928793c5bd/greenlet-3.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd", size = 577175, upload-time = "2026-01-23T16:00:56.213Z" }, + { url = "https://files.pythonhosted.org/packages/8e/89/7e812bb9c05e1aaef9b597ac1d0962b9021d2c6269354966451e885c4e6b/greenlet-3.3.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5", size = 590401, upload-time = "2026-01-23T16:05:26.365Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/e2d5f0e59b94a2269b68a629173263fa40b63da32f5c231307c349315871/greenlet-3.3.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f", size = 601161, upload-time = "2026-01-23T16:15:53.456Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ae/8d472e1f5ac5efe55c563f3eabb38c98a44b832602e12910750a7c025802/greenlet-3.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2", size = 590272, upload-time = "2026-01-23T15:32:49.411Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/0fde34bebfcadc833550717eade64e35ec8738e6b097d5d248274a01258b/greenlet-3.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9", size = 1550729, upload-time = "2026-01-23T16:04:20.867Z" }, + { url = "https://files.pythonhosted.org/packages/16/c9/2fb47bee83b25b119d5a35d580807bb8b92480a54b68fef009a02945629f/greenlet-3.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f", size = 1615552, upload-time = "2026-01-23T15:33:45.743Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/9d76a66421d1ae24340dfae7e79c313957f6e3195c144d2c73333b5bfe34/greenlet-3.3.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975", size = 276443, upload-time = "2026-01-23T15:30:10.066Z" }, + { url = "https://files.pythonhosted.org/packages/81/99/401ff34bb3c032d1f10477d199724f5e5f6fbfb59816ad1455c79c1eb8e7/greenlet-3.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36", size = 597359, upload-time = "2026-01-23T16:00:57.394Z" }, + { url = "https://files.pythonhosted.org/packages/2b/bc/4dcc0871ed557792d304f50be0f7487a14e017952ec689effe2180a6ff35/greenlet-3.3.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba", size = 607805, upload-time = "2026-01-23T16:05:28.068Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cd/7a7ca57588dac3389e97f7c9521cb6641fd8b6602faf1eaa4188384757df/greenlet-3.3.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c620051669fd04ac6b60ebc70478210119c56e2d5d5df848baec4312e260e4ca", size = 622363, upload-time = "2026-01-23T16:15:54.754Z" }, + { url = "https://files.pythonhosted.org/packages/cf/05/821587cf19e2ce1f2b24945d890b164401e5085f9d09cbd969b0c193cd20/greenlet-3.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336", size = 609947, upload-time = "2026-01-23T15:32:51.004Z" }, + { url = "https://files.pythonhosted.org/packages/a4/52/ee8c46ed9f8babaa93a19e577f26e3d28a519feac6350ed6f25f1afee7e9/greenlet-3.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1", size = 1567487, upload-time = "2026-01-23T16:04:22.125Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7c/456a74f07029597626f3a6db71b273a3632aecb9afafeeca452cfa633197/greenlet-3.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149", size = 1636087, upload-time = "2026-01-23T15:33:47.486Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ab/d26750f2b7242c2b90ea2ad71de70cfcd73a948a49513188a0fc0d6fc15a/greenlet-3.3.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3", size = 275205, upload-time = "2026-01-23T15:30:24.556Z" }, + { url = "https://files.pythonhosted.org/packages/10/d3/be7d19e8fad7c5a78eeefb2d896a08cd4643e1e90c605c4be3b46264998f/greenlet-3.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac", size = 599284, upload-time = "2026-01-23T16:00:58.584Z" }, + { url = "https://files.pythonhosted.org/packages/ae/21/fe703aaa056fdb0f17e5afd4b5c80195bbdab701208918938bd15b00d39b/greenlet-3.3.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd", size = 610274, upload-time = "2026-01-23T16:05:29.312Z" }, + { url = "https://files.pythonhosted.org/packages/06/00/95df0b6a935103c0452dad2203f5be8377e551b8466a29650c4c5a5af6cc/greenlet-3.3.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e", size = 624375, upload-time = "2026-01-23T16:15:55.915Z" }, + { url = "https://files.pythonhosted.org/packages/cb/86/5c6ab23bb3c28c21ed6bebad006515cfe08b04613eb105ca0041fecca852/greenlet-3.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3", size = 612904, upload-time = "2026-01-23T15:32:52.317Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/7949994264e22639e40718c2daf6f6df5169bf48fb038c008a489ec53a50/greenlet-3.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951", size = 1567316, upload-time = "2026-01-23T16:04:23.316Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6e/d73c94d13b6465e9f7cd6231c68abde838bb22408596c05d9059830b7872/greenlet-3.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2", size = 1636549, upload-time = "2026-01-23T15:33:48.643Z" }, + { url = "https://files.pythonhosted.org/packages/ae/fb/011c7c717213182caf78084a9bea51c8590b0afda98001f69d9f853a495b/greenlet-3.3.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5", size = 275737, upload-time = "2026-01-23T15:32:16.889Z" }, + { url = "https://files.pythonhosted.org/packages/41/2e/a3a417d620363fdbb08a48b1dd582956a46a61bf8fd27ee8164f9dfe87c2/greenlet-3.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b", size = 646422, upload-time = "2026-01-23T16:01:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/09/c6c4a0db47defafd2d6bab8ddfe47ad19963b4e30f5bed84d75328059f8c/greenlet-3.3.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e", size = 658219, upload-time = "2026-01-23T16:05:30.956Z" }, + { url = "https://files.pythonhosted.org/packages/e2/89/b95f2ddcc5f3c2bc09c8ee8d77be312df7f9e7175703ab780f2014a0e781/greenlet-3.3.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d", size = 671455, upload-time = "2026-01-23T16:15:57.232Z" }, + { url = "https://files.pythonhosted.org/packages/80/38/9d42d60dffb04b45f03dbab9430898352dba277758640751dc5cc316c521/greenlet-3.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f", size = 660237, upload-time = "2026-01-23T15:32:53.967Z" }, + { url = "https://files.pythonhosted.org/packages/96/61/373c30b7197f9e756e4c81ae90a8d55dc3598c17673f91f4d31c3c689c3f/greenlet-3.3.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683", size = 1615261, upload-time = "2026-01-23T16:04:25.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d3/ca534310343f5945316f9451e953dcd89b36fe7a19de652a1dc5a0eeef3f/greenlet-3.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1", size = 1683719, upload-time = "2026-01-23T15:33:50.61Z" }, + { url = "https://files.pythonhosted.org/packages/28/24/cbbec49bacdcc9ec652a81d3efef7b59f326697e7edf6ed775a5e08e54c2/greenlet-3.3.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242", size = 282706, upload-time = "2026-01-23T15:33:05.525Z" }, + { url = "https://files.pythonhosted.org/packages/86/2e/4f2b9323c144c4fe8842a4e0d92121465485c3c2c5b9e9b30a52e80f523f/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774", size = 651209, upload-time = "2026-01-23T16:01:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/d9/87/50ca60e515f5bb55a2fbc5f0c9b5b156de7d2fc51a0a69abc9d23914a237/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97", size = 654300, upload-time = "2026-01-23T16:05:32.199Z" }, + { url = "https://files.pythonhosted.org/packages/7c/25/c51a63f3f463171e09cb586eb64db0861eb06667ab01a7968371a24c4f3b/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab", size = 662574, upload-time = "2026-01-23T16:15:58.364Z" }, + { url = "https://files.pythonhosted.org/packages/1d/94/74310866dfa2b73dd08659a3d18762f83985ad3281901ba0ee9a815194fb/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2", size = 653842, upload-time = "2026-01-23T15:32:55.671Z" }, + { url = "https://files.pythonhosted.org/packages/97/43/8bf0ffa3d498eeee4c58c212a3905dd6146c01c8dc0b0a046481ca29b18c/greenlet-3.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53", size = 1614917, upload-time = "2026-01-23T16:04:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/89/90/a3be7a5f378fc6e84abe4dcfb2ba32b07786861172e502388b4c90000d1b/greenlet-3.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249", size = 1676092, upload-time = "2026-01-23T15:33:52.176Z" }, +] + +[[package]] +name = "griffe" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -1195,69 +1607,93 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, ] +[[package]] +name = "hf-xet" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020, upload-time = "2025-10-24T19:04:32.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870, upload-time = "2025-10-24T19:04:11.422Z" }, + { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584, upload-time = "2025-10-24T19:04:09.586Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004, upload-time = "2025-10-24T19:04:00.314Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636, upload-time = "2025-10-24T19:03:58.111Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448, upload-time = "2025-10-24T19:04:20.951Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401, upload-time = "2025-10-24T19:04:22.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861, upload-time = "2025-10-24T19:04:19.01Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699, upload-time = "2025-10-24T19:04:17.306Z" }, + { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885, upload-time = "2025-10-24T19:04:07.642Z" }, + { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550, upload-time = "2025-10-24T19:04:05.55Z" }, + { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010, upload-time = "2025-10-24T19:04:28.598Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264, upload-time = "2025-10-24T19:04:30.397Z" }, + { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099, upload-time = "2025-10-24T19:04:15.366Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178, upload-time = "2025-10-24T19:04:13.695Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214, upload-time = "2025-10-24T19:04:03.596Z" }, + { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054, upload-time = "2025-10-24T19:04:01.949Z" }, + { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812, upload-time = "2025-10-24T19:04:24.585Z" }, + { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920, upload-time = "2025-10-24T19:04:26.927Z" }, +] + [[package]] name = "hiredis" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/24b72f425b75e1de7442fb1740f69ca66d5820b9f9c0e2511ff9aadab3b7/hiredis-3.2.1.tar.gz", hash = "sha256:5a5f64479bf04dd829fe7029fad0ea043eac4023abc6e946668cbbec3493a78d", size = 89096, upload-time = "2025-05-23T11:41:57.227Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/12/e797b676d65b86d9ad56f434cb4548b1bd0ebf531cd2e36ef74c5cd46dcd/hiredis-3.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:add17efcbae46c5a6a13b244ff0b4a8fa079602ceb62290095c941b42e9d5dec", size = 82441, upload-time = "2025-05-23T11:39:36.142Z" }, - { url = "https://files.pythonhosted.org/packages/d3/04/45783d5cf6e7430b1c67d64a7919ee45381e8b98d6d4578516579c5a4420/hiredis-3.2.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:5fe955cc4f66c57df1ae8e5caf4de2925d43b5efab4e40859662311d1bcc5f54", size = 45235, upload-time = "2025-05-23T11:39:37.49Z" }, - { url = "https://files.pythonhosted.org/packages/d5/97/7f50bad0b8213a3ee7780e295cd3d5e3db2839de2a6342b3c0ceeaf8e0af/hiredis-3.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f9ad63cd9065820a43fb1efb8ed5ae85bb78f03ef5eb53f6bde47914708f5718", size = 43250, upload-time = "2025-05-23T11:39:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/51/d0/38d4b5bf36bfd010fdfd460c53efc0aaef7c81d6c20f4041ca35e26a1e12/hiredis-3.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e7f9e5fdba08841d78d4e1450cae03a4dbed2eda8a4084673cafa5615ce24a", size = 168996, upload-time = "2025-05-23T11:39:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/99/22/4e2e9fde2b2efcf9847a2442a21f404c4112c57cccd6a09e564524dd70f3/hiredis-3.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dce2508eca5d4e47ef38bc7c0724cb45abcdb0089f95a2ef49baf52882979a8", size = 165508, upload-time = "2025-05-23T11:39:40.723Z" }, - { url = "https://files.pythonhosted.org/packages/98/d0/b05bc8d4f339abaa455a9e677fc5223e25cd97630e66a2da0ad25e67b131/hiredis-3.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:186428bf353e4819abae15aa2ad64c3f40499d596ede280fe328abb9e98e72ce", size = 180109, upload-time = "2025-05-23T11:39:41.865Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ca/6df2cf488792ace30ee525a5444e12f432cc1da4acb47756ea5de265ea80/hiredis-3.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74f2500d90a0494843aba7abcdc3e77f859c502e0892112d708c02e1dcae8f90", size = 169161, upload-time = "2025-05-23T11:39:43.432Z" }, - { url = "https://files.pythonhosted.org/packages/15/8b/afcef7a30bf5b94936264edb7daaf12a165f2b57007e384a57ac48411886/hiredis-3.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32822a94d2fdd1da96c05b22fdeef6d145d8fdbd865ba2f273f45eb949e4a805", size = 169485, upload-time = "2025-05-23T11:39:45.008Z" }, - { url = "https://files.pythonhosted.org/packages/43/14/3443dee27bd20f2ac88a759b67b29e7f3756a9a38bbe8084de049dfc5cac/hiredis-3.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ead809fb08dd4fdb5b4b6e2999c834e78c3b0c450a07c3ed88983964432d0c64", size = 163644, upload-time = "2025-05-23T11:39:46.755Z" }, - { url = "https://files.pythonhosted.org/packages/3f/24/8a3cee0f08071af0a9632ca81a057fe2b638e7b6956c9b5704a2049c1305/hiredis-3.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b90fada20301c3a257e868dd6a4694febc089b2b6d893fa96a3fc6c1f9ab4340", size = 162180, upload-time = "2025-05-23T11:39:47.939Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2c/34cb6e665535dce1cbb7077cb9cc608198f254050241b5e232d62393f6a7/hiredis-3.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6d8bff53f526da3d9db86c8668011e4f7ca2958ee3a46c648edab6fe2cd1e709", size = 174369, upload-time = "2025-05-23T11:39:49.13Z" }, - { url = "https://files.pythonhosted.org/packages/f8/24/96702f71991d884412d7ac89577ad9caa28875e2e309f53751b8c5f969be/hiredis-3.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:043d929ae262d03e1db0f08616e14504a9119c1ff3de13d66f857d85cd45caff", size = 166511, upload-time = "2025-05-23T11:39:50.232Z" }, - { url = "https://files.pythonhosted.org/packages/de/d0/8d3753244bdea37ab1700db8eec220df8361d0e3f72b9b5314ce4a0471ac/hiredis-3.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d470fef39d02dbe5c541ec345cc4ffd7d2baec7d6e59c92bd9d9545dc221829", size = 164329, upload-time = "2025-05-23T11:39:51.365Z" }, - { url = "https://files.pythonhosted.org/packages/48/84/2ea9636f2ba0811d9eb3bebbbfa84f488238180ddab70c9cb7fa13419d78/hiredis-3.2.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:e4ae0be44cab5e74e6e4c4a93d04784629a45e781ff483b136cc9e1b9c23975c", size = 82425, upload-time = "2025-05-23T11:39:54.135Z" }, - { url = "https://files.pythonhosted.org/packages/fc/24/b9ebf766a99998fda3975937afa4912e98de9d7f8d0b83f48096bdd961c1/hiredis-3.2.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:24647e84c9f552934eb60b7f3d2116f8b64a7020361da9369e558935ca45914d", size = 45231, upload-time = "2025-05-23T11:39:55.455Z" }, - { url = "https://files.pythonhosted.org/packages/68/4c/c009b4d9abeb964d607f0987561892d1589907f770b9e5617552b34a4a4d/hiredis-3.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fb3e92d1172da8decc5f836bf8b528c0fc9b6d449f1353e79ceeb9dc1801132", size = 43240, upload-time = "2025-05-23T11:39:57.8Z" }, - { url = "https://files.pythonhosted.org/packages/e9/83/d53f3ae9e4ac51b8a35afb7ccd68db871396ed1d7c8ba02ce2c30de0cf17/hiredis-3.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38ba7a32e51e518b6b3e470142e52ed2674558e04d7d73d86eb19ebcb37d7d40", size = 169624, upload-time = "2025-05-23T11:40:00.055Z" }, - { url = "https://files.pythonhosted.org/packages/91/2f/f9f091526e22a45385d45f3870204dc78aee365b6fe32e679e65674da6a7/hiredis-3.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4fc632be73174891d6bb71480247e57b2fd8f572059f0a1153e4d0339e919779", size = 165799, upload-time = "2025-05-23T11:40:01.194Z" }, - { url = "https://files.pythonhosted.org/packages/1c/cc/e561274438cdb19794f0638136a5a99a9ca19affcb42679b12a78016b8ad/hiredis-3.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f03e6839ff21379ad3c195e0700fc9c209e7f344946dea0f8a6d7b5137a2a141", size = 180612, upload-time = "2025-05-23T11:40:02.385Z" }, - { url = "https://files.pythonhosted.org/packages/83/ba/a8a989f465191d55672e57aea2a331bfa3a74b5cbc6f590031c9e11f7491/hiredis-3.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99983873e37c71bb71deb544670ff4f9d6920dab272aaf52365606d87a4d6c73", size = 169934, upload-time = "2025-05-23T11:40:03.524Z" }, - { url = "https://files.pythonhosted.org/packages/52/5f/1148e965df1c67b17bdcaef199f54aec3def0955d19660a39c6ee10a6f55/hiredis-3.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd982c419f48e3a57f592678c72474429465bb4bfc96472ec805f5d836523f0", size = 170074, upload-time = "2025-05-23T11:40:04.618Z" }, - { url = "https://files.pythonhosted.org/packages/43/5e/e6846ad159a938b539fb8d472e2e68cb6758d7c9454ea0520211f335ea72/hiredis-3.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bc993f4aa4abc029347f309e722f122e05a3b8a0c279ae612849b5cc9dc69f2d", size = 164158, upload-time = "2025-05-23T11:40:05.653Z" }, - { url = "https://files.pythonhosted.org/packages/0a/a1/5891e0615f0993f194c1b51a65aaac063b0db318a70df001b28e49f0579d/hiredis-3.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dde790d420081f18b5949227649ccb3ed991459df33279419a25fcae7f97cd92", size = 162591, upload-time = "2025-05-23T11:40:07.041Z" }, - { url = "https://files.pythonhosted.org/packages/d4/da/8bce52ca81716f53c1014f689aea4c170ba6411e6848f81a1bed1fc375eb/hiredis-3.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b0c8cae7edbef860afcf3177b705aef43e10b5628f14d5baf0ec69668247d08d", size = 174808, upload-time = "2025-05-23T11:40:09.146Z" }, - { url = "https://files.pythonhosted.org/packages/84/91/fc1ef444ed4dc432b5da9b48e9bd23266c703528db7be19e2b608d67ba06/hiredis-3.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e8a90eaca7e1ce7f175584f07a2cdbbcab13f4863f9f355d7895c4d28805f65b", size = 167060, upload-time = "2025-05-23T11:40:10.757Z" }, - { url = "https://files.pythonhosted.org/packages/66/ad/beebf73a5455f232b97e00564d1e8ad095d4c6e18858c60c6cfdd893ac1e/hiredis-3.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:476031958fa44e245e803827e0787d49740daa4de708fe514370293ce519893a", size = 164833, upload-time = "2025-05-23T11:40:12.001Z" }, - { url = "https://files.pythonhosted.org/packages/60/a1/6da1578a22df1926497f7a3f6a3d2408fe1d1559f762c1640af5762a8eb6/hiredis-3.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3742d8b17e73c198cabeab11da35f2e2a81999d406f52c6275234592256bf8e8", size = 82627, upload-time = "2025-05-23T11:40:15.362Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b1/1056558ca8dc330be5bb25162fe5f268fee71571c9a535153df9f871a073/hiredis-3.2.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9c2f3176fb617a79f6cccf22cb7d2715e590acb534af6a82b41f8196ad59375d", size = 45404, upload-time = "2025-05-23T11:40:16.72Z" }, - { url = "https://files.pythonhosted.org/packages/58/4f/13d1fa1a6b02a99e9fed8f546396f2d598c3613c98e6c399a3284fa65361/hiredis-3.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a8bd46189c7fa46174e02670dc44dfecb60f5bd4b67ed88cb050d8f1fd842f09", size = 43299, upload-time = "2025-05-23T11:40:17.697Z" }, - { url = "https://files.pythonhosted.org/packages/c0/25/ddfac123ba5a32eb1f0b40ba1b2ec98a599287f7439def8856c3c7e5dd0d/hiredis-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f86ee4488c8575b58139cdfdddeae17f91e9a893ffee20260822add443592e2f", size = 172194, upload-time = "2025-05-23T11:40:19.143Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/443a3703ce570b631ca43494094fbaeb051578a0ebe4bfcefde351e1ba25/hiredis-3.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3717832f4a557b2fe7060b9d4a7900e5de287a15595e398c3f04df69019ca69d", size = 168429, upload-time = "2025-05-23T11:40:20.329Z" }, - { url = "https://files.pythonhosted.org/packages/3b/d6/0d8c6c706ed79b2298c001b5458c055615e3166533dcee3900e821a18a3e/hiredis-3.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5cb12c21fb9e2403d28c4e6a38120164973342d34d08120f2d7009b66785644", size = 182967, upload-time = "2025-05-23T11:40:21.921Z" }, - { url = "https://files.pythonhosted.org/packages/da/68/da8dd231fbce858b5a20ab7d7bf558912cd125f08bac4c778865ef5fe2c2/hiredis-3.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:080fda1510bbd389af91f919c11a4f2aa4d92f0684afa4709236faa084a42cac", size = 172495, upload-time = "2025-05-23T11:40:23.105Z" }, - { url = "https://files.pythonhosted.org/packages/65/25/83a31420535e2778662caa95533d5c997011fa6a88331f0cdb22afea9ec3/hiredis-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1252e10a1f3273d1c6bf2021e461652c2e11b05b83e0915d6eb540ec7539afe2", size = 173142, upload-time = "2025-05-23T11:40:24.24Z" }, - { url = "https://files.pythonhosted.org/packages/41/d7/cb907348889eb75e2aa2e6b63e065b611459e0f21fe1e371a968e13f0d55/hiredis-3.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d9e320e99ab7d2a30dc91ff6f745ba38d39b23f43d345cdee9881329d7b511d6", size = 166433, upload-time = "2025-05-23T11:40:25.287Z" }, - { url = "https://files.pythonhosted.org/packages/01/5d/7cbc69d82af7b29a95723d50f5261555ba3d024bfbdc414bdc3d23c0defb/hiredis-3.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:641668f385f16550fdd6fdc109b0af6988b94ba2acc06770a5e06a16e88f320c", size = 164883, upload-time = "2025-05-23T11:40:26.454Z" }, - { url = "https://files.pythonhosted.org/packages/f9/00/f995b1296b1d7e0247651347aa230f3225a9800e504fdf553cf7cd001cf7/hiredis-3.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1e1f44208c39d6c345ff451f82f21e9eeda6fe9af4ac65972cc3eeb58d41f7cb", size = 177262, upload-time = "2025-05-23T11:40:27.576Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f3/723a67d729e94764ce9e0d73fa5f72a0f87d3ce3c98c9a0b27cbf001cc79/hiredis-3.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f882a0d6415fffe1ffcb09e6281d0ba8b1ece470e866612bbb24425bf76cf397", size = 169619, upload-time = "2025-05-23T11:40:29.671Z" }, - { url = "https://files.pythonhosted.org/packages/45/58/f69028df00fb1b223e221403f3be2059ae86031e7885f955d26236bdfc17/hiredis-3.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4e78719a0730ebffe335528531d154bc8867a246418f74ecd88adbc4d938c49", size = 167303, upload-time = "2025-05-23T11:40:30.902Z" }, - { url = "https://files.pythonhosted.org/packages/47/91/c07e737288e891c974277b9fa090f0a43c72ab6ccb5182117588f1c01269/hiredis-3.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:7cabf7f1f06be221e1cbed1f34f00891a7bdfad05b23e4d315007dd42148f3d4", size = 82636, upload-time = "2025-05-23T11:40:35.035Z" }, - { url = "https://files.pythonhosted.org/packages/92/20/02cb1820360eda419bc17eb835eca976079e2b3e48aecc5de0666b79a54c/hiredis-3.2.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:db85cb86f8114c314d0ec6d8de25b060a2590b4713135240d568da4f7dea97ac", size = 45404, upload-time = "2025-05-23T11:40:36.113Z" }, - { url = "https://files.pythonhosted.org/packages/87/51/d30a4aadab8670ed9d40df4982bc06c891ee1da5cdd88d16a74e1ecbd520/hiredis-3.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c9a592a49b7b8497e4e62c3ff40700d0c7f1a42d145b71e3e23c385df573c964", size = 43301, upload-time = "2025-05-23T11:40:37.557Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7b/2c613e1bb5c2e2bac36e8befeefdd58b42816befb17e26ab600adfe337fb/hiredis-3.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0079ef1e03930b364556b78548e67236ab3def4e07e674f6adfc52944aa972dd", size = 172486, upload-time = "2025-05-23T11:40:38.659Z" }, - { url = "https://files.pythonhosted.org/packages/1e/df/8f2c4fcc28d6f5178b25ee1ba2157cc473f9908c16ce4b8e0bdd79e38b05/hiredis-3.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d6a290ed45d9c14f4c50b6bda07afb60f270c69b5cb626fd23a4c2fde9e3da1", size = 168532, upload-time = "2025-05-23T11:40:39.843Z" }, - { url = "https://files.pythonhosted.org/packages/88/ae/d0864ffaa0461e29a6940a11c858daf78c99476c06ed531b41ad2255ec25/hiredis-3.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dd5fe8c0892769f82949adeb021342ca46871af26e26945eb55d044fcdf0d0", size = 183216, upload-time = "2025-05-23T11:40:41.005Z" }, - { url = "https://files.pythonhosted.org/packages/75/17/558e831b77692d73f5bcf8b493ab3eace9f11b0aa08839cdbb87995152c7/hiredis-3.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998a82281a159f4aebbfd4fb45cfe24eb111145206df2951d95bc75327983b58", size = 172689, upload-time = "2025-05-23T11:40:42.153Z" }, - { url = "https://files.pythonhosted.org/packages/35/b9/4fccda21f930f08c5072ad51e825d85d457748138443d7b510afe77b8264/hiredis-3.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41fc3cd52368ffe7c8e489fb83af5e99f86008ed7f9d9ba33b35fec54f215c0a", size = 173319, upload-time = "2025-05-23T11:40:43.328Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8b/596d613588b0a3c58dfcf9a17edc6a886c4de6a3096e27c7142a94e2304d/hiredis-3.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8d10df3575ce09b0fa54b8582f57039dcbdafde5de698923a33f601d2e2a246c", size = 166695, upload-time = "2025-05-23T11:40:44.453Z" }, - { url = "https://files.pythonhosted.org/packages/e7/5b/6a1c266e9f6627a8be1fa0d8622e35e35c76ae40cce6d1c78a7e6021184a/hiredis-3.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ab010d04be33735ad8e643a40af0d68a21d70a57b1d0bff9b6a66b28cca9dbf", size = 165181, upload-time = "2025-05-23T11:40:45.697Z" }, - { url = "https://files.pythonhosted.org/packages/6c/70/a9b91fa70d21763d9dfd1c27ddd378f130749a0ae4a0645552f754b3d1fc/hiredis-3.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec3b5f9ea34f70aaba3e061cbe1fa3556fea401d41f5af321b13e326792f3017", size = 177589, upload-time = "2025-05-23T11:40:46.903Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c7/31bbb015156dc4441f6e19daa9598266a61445bf3f6e14c44292764638f6/hiredis-3.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:158dfb505fff6bffd17f823a56effc0c2a7a8bc4fb659d79a52782f22eefc697", size = 169883, upload-time = "2025-05-23T11:40:48.111Z" }, - { url = "https://files.pythonhosted.org/packages/89/44/cddc23379e0ce20ad7514b2adb2aa2c9b470ffb1ca0a2d8c020748962a22/hiredis-3.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d632cd0ddd7895081be76748e6fb9286f81d2a51c371b516541c6324f2fdac9", size = 167585, upload-time = "2025-05-23T11:40:49.208Z" }, - { url = "https://files.pythonhosted.org/packages/ed/f9/04a0a6c760d28e0b7d536646edacd6f5b4c979dd4c848621287bff5be9d0/hiredis-3.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:73913d2fa379e722d17ba52f21ce12dd578140941a08efd73e73b6fab1dea4d8", size = 40382, upload-time = "2025-05-23T11:41:34.425Z" }, - { url = "https://files.pythonhosted.org/packages/cd/1c/50fbce19cc5e393cf97a187462377d1c9441337684b3da1ed13ed0f20873/hiredis-3.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:15a3dff3eca31ecbf3d7d6d104cf1b318dc2b013bad3f4bdb2839cb9ea2e1584", size = 37760, upload-time = "2025-05-23T11:41:35.432Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e6/d147636edf44e5267f9e4c3483cd8d6b027fd6cf008a003c932f5ff888f7/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c78258032c2f9fc6f39fee7b07882ce26de281e09178266ce535992572132d95", size = 48738, upload-time = "2025-05-23T11:41:36.452Z" }, - { url = "https://files.pythonhosted.org/packages/97/b0/53c33900139149a9b85878c04748984987b62ee2583d452b4e4d578067a9/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578d6a881e64e46db065256355594e680202c3bacf3270be3140057171d2c23e", size = 56254, upload-time = "2025-05-23T11:41:38.395Z" }, - { url = "https://files.pythonhosted.org/packages/9d/af/b49debecac06674a9ccb51353f497300199d6122a7612f56930872076147/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b7f34b170093c077c972b8cc0ceb15d8ff88ad0079751a8ae9733e94d77e733", size = 48905, upload-time = "2025-05-23T11:41:39.92Z" }, +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/82/d2817ce0653628e0a0cb128533f6af0dd6318a49f3f3a6a7bd1f2f2154af/hiredis-3.3.0.tar.gz", hash = "sha256:105596aad9249634361815c574351f1bd50455dc23b537c2940066c4a9dea685", size = 89048, upload-time = "2025-10-14T16:33:34.263Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/0c/be3b1093f93a7c823ca16fbfbb83d3a1de671bbd2add8da1fe2bcfccb2b8/hiredis-3.3.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:63ee6c1ae6a2462a2439eb93c38ab0315cd5f4b6d769c6a34903058ba538b5d6", size = 81813, upload-time = "2025-10-14T16:32:00.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/2b/ed722d392ac59a7eee548d752506ef32c06ffdd0bce9cf91125a74b8edf9/hiredis-3.3.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:31eda3526e2065268a8f97fbe3d0e9a64ad26f1d89309e953c80885c511ea2ae", size = 46049, upload-time = "2025-10-14T16:32:01.319Z" }, + { url = "https://files.pythonhosted.org/packages/e5/61/8ace8027d5b3f6b28e1dc55f4a504be038ba8aa8bf71882b703e8f874c91/hiredis-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a26bae1b61b7bcafe3d0d0c7d012fb66ab3c95f2121dbea336df67e344e39089", size = 41814, upload-time = "2025-10-14T16:32:02.076Z" }, + { url = "https://files.pythonhosted.org/packages/23/0e/380ade1ffb21034976663a5128f0383533f35caccdba13ff0537dd5ace79/hiredis-3.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9546079f7fd5c50fbff9c791710049b32eebe7f9b94debec1e8b9f4c048cba2", size = 167572, upload-time = "2025-10-14T16:32:03.125Z" }, + { url = "https://files.pythonhosted.org/packages/ca/60/b4a8d2177575b896730f73e6890644591aa56790a75c2b6d6f2302a1dae6/hiredis-3.3.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae327fc13b1157b694d53f92d50920c0051e30b0c245f980a7036e299d039ab4", size = 179373, upload-time = "2025-10-14T16:32:04.04Z" }, + { url = "https://files.pythonhosted.org/packages/31/53/a473a18d27cfe8afda7772ff9adfba1718fd31d5e9c224589dc17774fa0b/hiredis-3.3.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4016e50a8be5740a59c5af5252e5ad16c395021a999ad24c6604f0d9faf4d346", size = 177504, upload-time = "2025-10-14T16:32:04.934Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0f/f6ee4c26b149063dbf5b1b6894b4a7a1f00a50e3d0cfd30a22d4c3479db3/hiredis-3.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c17b473f273465a3d2168a57a5b43846165105ac217d5652a005e14068589ddc", size = 169449, upload-time = "2025-10-14T16:32:05.808Z" }, + { url = "https://files.pythonhosted.org/packages/64/38/e3e113172289e1261ccd43e387a577dd268b0b9270721b5678735803416c/hiredis-3.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9ecd9b09b11bd0b8af87d29c3f5da628d2bdc2a6c23d2dd264d2da082bd4bf32", size = 164010, upload-time = "2025-10-14T16:32:06.695Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9a/ccf4999365691ea73d0dd2ee95ee6ef23ebc9a835a7417f81765bc49eade/hiredis-3.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:00fb04eac208cd575d14f246e74a468561081ce235937ab17d77cde73aefc66c", size = 174623, upload-time = "2025-10-14T16:32:07.627Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c7/ee55fa2ade078b7c4f17e8ddc9bc28881d0b71b794ebf9db4cfe4c8f0623/hiredis-3.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:60814a7d0b718adf3bfe2c32c6878b0e00d6ae290ad8e47f60d7bba3941234a6", size = 167650, upload-time = "2025-10-14T16:32:08.615Z" }, + { url = "https://files.pythonhosted.org/packages/bf/06/f6cd90275dcb0ba03f69767805151eb60b602bc25830648bd607660e1f97/hiredis-3.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fcbd1a15e935aa323b5b2534b38419511b7909b4b8ee548e42b59090a1b37bb1", size = 165452, upload-time = "2025-10-14T16:32:09.561Z" }, + { url = "https://files.pythonhosted.org/packages/48/1c/ed28ae5d704f5c7e85b946fa327f30d269e6272c847fef7e91ba5fc86193/hiredis-3.3.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5b8e1d6a2277ec5b82af5dce11534d3ed5dffeb131fd9b210bc1940643b39b5f", size = 82026, upload-time = "2025-10-14T16:32:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9b/79f30c5c40e248291023b7412bfdef4ad9a8a92d9e9285d65d600817dac7/hiredis-3.3.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c4981de4d335f996822419e8a8b3b87367fcef67dc5fb74d3bff4df9f6f17783", size = 46217, upload-time = "2025-10-14T16:32:13.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c3/02b9ed430ad9087aadd8afcdf616717452d16271b701fa47edfe257b681e/hiredis-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1706480a683e328ae9ba5d704629dee2298e75016aa0207e7067b9c40cecc271", size = 41858, upload-time = "2025-10-14T16:32:13.98Z" }, + { url = "https://files.pythonhosted.org/packages/f1/98/b2a42878b82130a535c7aa20bc937ba2d07d72e9af3ad1ad93e837c419b5/hiredis-3.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a95cef9989736ac313639f8f545b76b60b797e44e65834aabbb54e4fad8d6c8", size = 170195, upload-time = "2025-10-14T16:32:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/9dcde7a75115d3601b016113d9b90300726fa8e48aacdd11bf01a453c145/hiredis-3.3.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca2802934557ccc28a954414c245ba7ad904718e9712cb67c05152cf6b9dd0a3", size = 181808, upload-time = "2025-10-14T16:32:15.622Z" }, + { url = "https://files.pythonhosted.org/packages/56/a1/60f6bda9b20b4e73c85f7f5f046bc2c154a5194fc94eb6861e1fd97ced52/hiredis-3.3.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fe730716775f61e76d75810a38ee4c349d3af3896450f1525f5a4034cf8f2ed7", size = 180578, upload-time = "2025-10-14T16:32:16.514Z" }, + { url = "https://files.pythonhosted.org/packages/d9/01/859d21de65085f323a701824e23ea3330a0ac05f8e184544d7aa5c26128d/hiredis-3.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:749faa69b1ce1f741f5eaf743435ac261a9262e2d2d66089192477e7708a9abc", size = 172508, upload-time = "2025-10-14T16:32:17.411Z" }, + { url = "https://files.pythonhosted.org/packages/99/a8/28fd526e554c80853d0fbf57ef2a3235f00e4ed34ce0e622e05d27d0f788/hiredis-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:95c9427f2ac3f1dd016a3da4e1161fa9d82f221346c8f3fdd6f3f77d4e28946c", size = 166341, upload-time = "2025-10-14T16:32:18.561Z" }, + { url = "https://files.pythonhosted.org/packages/f2/91/ded746b7d2914f557fbbf77be55e90d21f34ba758ae10db6591927c642c8/hiredis-3.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c863ee44fe7bff25e41f3a5105c936a63938b76299b802d758f40994ab340071", size = 176765, upload-time = "2025-10-14T16:32:19.491Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4c/04aa46ff386532cb5f08ee495c2bf07303e93c0acf2fa13850e031347372/hiredis-3.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2213c7eb8ad5267434891f3241c7776e3bafd92b5933fc57d53d4456247dc542", size = 170312, upload-time = "2025-10-14T16:32:20.404Z" }, + { url = "https://files.pythonhosted.org/packages/90/6e/67f9d481c63f542a9cf4c9f0ea4e5717db0312fb6f37fb1f78f3a66de93c/hiredis-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a172bae3e2837d74530cd60b06b141005075db1b814d966755977c69bd882ce8", size = 167965, upload-time = "2025-10-14T16:32:21.259Z" }, + { url = "https://files.pythonhosted.org/packages/6d/39/2b789ebadd1548ccb04a2c18fbc123746ad1a7e248b7f3f3cac618ca10a6/hiredis-3.3.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:b7048b4ec0d5dddc8ddd03da603de0c4b43ef2540bf6e4c54f47d23e3480a4fa", size = 82035, upload-time = "2025-10-14T16:32:23.715Z" }, + { url = "https://files.pythonhosted.org/packages/85/74/4066d9c1093be744158ede277f2a0a4e4cd0fefeaa525c79e2876e9e5c72/hiredis-3.3.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:e5f86ce5a779319c15567b79e0be806e8e92c18bb2ea9153e136312fafa4b7d6", size = 46219, upload-time = "2025-10-14T16:32:24.554Z" }, + { url = "https://files.pythonhosted.org/packages/fa/3f/f9e0f6d632f399d95b3635703e1558ffaa2de3aea4cfcbc2d7832606ba43/hiredis-3.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fbdb97a942e66016fff034df48a7a184e2b7dc69f14c4acd20772e156f20d04b", size = 41860, upload-time = "2025-10-14T16:32:25.356Z" }, + { url = "https://files.pythonhosted.org/packages/4a/c5/b7dde5ec390dabd1cabe7b364a509c66d4e26de783b0b64cf1618f7149fc/hiredis-3.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0fb4bea72fe45ff13e93ddd1352b43ff0749f9866263b5cca759a4c960c776f", size = 170094, upload-time = "2025-10-14T16:32:26.148Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d6/7f05c08ee74d41613be466935688068e07f7b6c55266784b5ace7b35b766/hiredis-3.3.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:85b9baf98050e8f43c2826ab46aaf775090d608217baf7af7882596aef74e7f9", size = 181746, upload-time = "2025-10-14T16:32:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d2/aaf9f8edab06fbf5b766e0cae3996324297c0516a91eb2ca3bd1959a0308/hiredis-3.3.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69079fb0f0ebb61ba63340b9c4bce9388ad016092ca157e5772eb2818209d930", size = 180465, upload-time = "2025-10-14T16:32:29.185Z" }, + { url = "https://files.pythonhosted.org/packages/8d/1e/93ded8b9b484519b211fc71746a231af98c98928e3ebebb9086ed20bb1ad/hiredis-3.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c17f77b79031ea4b0967d30255d2ae6e7df0603ee2426ad3274067f406938236", size = 172419, upload-time = "2025-10-14T16:32:30.059Z" }, + { url = "https://files.pythonhosted.org/packages/68/13/02880458e02bbfcedcaabb8f7510f9dda1c89d7c1921b1bb28c22bb38cbf/hiredis-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d14f745fc177bc05fc24bdf20e2b515e9a068d3d4cce90a0fb78d04c9c9d9a", size = 166400, upload-time = "2025-10-14T16:32:31.173Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/896e03267670570f19f61dc65a2137fcb2b06e83ab0911d58eeec9f3cb88/hiredis-3.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ba063fdf1eff6377a0c409609cbe890389aefddfec109c2d20fcc19cfdafe9da", size = 176845, upload-time = "2025-10-14T16:32:32.12Z" }, + { url = "https://files.pythonhosted.org/packages/f1/90/a1d4bd0cdcf251fda72ac0bd932f547b48ad3420f89bb2ef91bf6a494534/hiredis-3.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1799cc66353ad066bfdd410135c951959da9f16bcb757c845aab2f21fc4ef099", size = 170365, upload-time = "2025-10-14T16:32:33.035Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9a/7c98f7bb76bdb4a6a6003cf8209721f083e65d2eed2b514f4a5514bda665/hiredis-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2cbf71a121996ffac82436b6153290815b746afb010cac19b3290a1644381b07", size = 168022, upload-time = "2025-10-14T16:32:34.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b3/b948ee76a6b2bc7e45249861646f91f29704f743b52565cf64cee9c4658b/hiredis-3.3.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c135bda87211f7af9e2fd4e046ab433c576cd17b69e639a0f5bb2eed5e0e71a9", size = 82105, upload-time = "2025-10-14T16:32:37.204Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/4210f4ebfb3ab4ada964b8de08190f54cbac147198fb463cd3c111cc13e0/hiredis-3.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2f855c678230aed6fc29b962ce1cc67e5858a785ef3a3fd6b15dece0487a2e60", size = 46237, upload-time = "2025-10-14T16:32:38.07Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/e38bfd7d04c05036b4ccc6f42b86b1032185cf6ae426e112a97551fece14/hiredis-3.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4059c78a930cbb33c391452ccce75b137d6f89e2eebf6273d75dafc5c2143c03", size = 41894, upload-time = "2025-10-14T16:32:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/28/d3/eae43d9609c5d9a6effef0586ee47e13a0d84b44264b688d97a75cd17ee5/hiredis-3.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:334a3f1d14c253bb092e187736c3384203bd486b244e726319bbb3f7dffa4a20", size = 170486, upload-time = "2025-10-14T16:32:40.147Z" }, + { url = "https://files.pythonhosted.org/packages/c3/fd/34d664554880b27741ab2916d66207357563b1639e2648685f4c84cfb755/hiredis-3.3.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd137b147235447b3d067ec952c5b9b95ca54b71837e1b38dbb2ec03b89f24fc", size = 182031, upload-time = "2025-10-14T16:32:41.06Z" }, + { url = "https://files.pythonhosted.org/packages/08/a3/0c69fdde3f4155b9f7acc64ccffde46f312781469260061b3bbaa487fd34/hiredis-3.3.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f88f4f2aceb73329ece86a1cb0794fdbc8e6d614cb5ca2d1023c9b7eb432db8", size = 180542, upload-time = "2025-10-14T16:32:42.993Z" }, + { url = "https://files.pythonhosted.org/packages/68/7a/ad5da4d7bc241e57c5b0c4fe95aa75d1f2116e6e6c51577394d773216e01/hiredis-3.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:550f4d1538822fc75ebf8cf63adc396b23d4958bdbbad424521f2c0e3dfcb169", size = 172353, upload-time = "2025-10-14T16:32:43.965Z" }, + { url = "https://files.pythonhosted.org/packages/4b/dc/c46eace64eb047a5b31acd5e4b0dc6d2f0390a4a3f6d507442d9efa570ad/hiredis-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:54b14211fbd5930fc696f6fcd1f1f364c660970d61af065a80e48a1fa5464dd6", size = 166435, upload-time = "2025-10-14T16:32:44.97Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ac/ad13a714e27883a2e4113c980c94caf46b801b810de5622c40f8d3e8335f/hiredis-3.3.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c9e96f63dbc489fc86f69951e9f83dadb9582271f64f6822c47dcffa6fac7e4a", size = 177218, upload-time = "2025-10-14T16:32:45.936Z" }, + { url = "https://files.pythonhosted.org/packages/c2/38/268fabd85b225271fe1ba82cb4a484fcc1bf922493ff2c74b400f1a6f339/hiredis-3.3.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:106e99885d46684d62ab3ec1d6b01573cc0e0083ac295b11aaa56870b536c7ec", size = 170477, upload-time = "2025-10-14T16:32:46.898Z" }, + { url = "https://files.pythonhosted.org/packages/20/6b/02bb8af810ea04247334ab7148acff7a61c08a8832830c6703f464be83a9/hiredis-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:087e2ef3206361281b1a658b5b4263572b6ba99465253e827796964208680459", size = 167915, upload-time = "2025-10-14T16:32:47.847Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b6/d7e6c17da032665a954a89c1e6ee3bd12cb51cd78c37527842b03519981d/hiredis-3.3.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f7f80442a32ce51ee5d89aeb5a84ee56189a0e0e875f1a57bbf8d462555ae48f", size = 83034, upload-time = "2025-10-14T16:32:52.395Z" }, + { url = "https://files.pythonhosted.org/packages/27/6c/6751b698060cdd1b2d8427702cff367c9ed7a1705bcf3792eb5b896f149b/hiredis-3.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a1a67530da714954ed50579f4fe1ab0ddbac9c43643b1721c2cb226a50dde263", size = 46701, upload-time = "2025-10-14T16:32:53.572Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8e/20a5cf2c83c7a7e08c76b9abab113f99f71cd57468a9c7909737ce6e9bf8/hiredis-3.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:616868352e47ab355559adca30f4f3859f9db895b4e7bc71e2323409a2add751", size = 42381, upload-time = "2025-10-14T16:32:54.762Z" }, + { url = "https://files.pythonhosted.org/packages/be/0a/547c29c06e8c9c337d0df3eec39da0cf1aad701daf8a9658dd37f25aca66/hiredis-3.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e799b79f3150083e9702fc37e6243c0bd47a443d6eae3f3077b0b3f510d6a145", size = 180313, upload-time = "2025-10-14T16:32:55.644Z" }, + { url = "https://files.pythonhosted.org/packages/89/8a/488de5469e3d0921a1c425045bf00e983d48b2111a90e47cf5769eaa536c/hiredis-3.3.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ef1dfb0d2c92c3701655e2927e6bbe10c499aba632c7ea57b6392516df3864b", size = 190488, upload-time = "2025-10-14T16:32:56.649Z" }, + { url = "https://files.pythonhosted.org/packages/b5/59/8493edc3eb9ae0dbea2b2230c2041a52bc03e390b02ffa3ac0bca2af9aea/hiredis-3.3.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c290da6bc2a57e854c7da9956cd65013483ede935677e84560da3b848f253596", size = 189210, upload-time = "2025-10-14T16:32:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/8c9a653922057b32fb1e2546ecd43ef44c9aa1a7cf460c87cae507eb2bc7/hiredis-3.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd8c438d9e1728f0085bf9b3c9484d19ec31f41002311464e75b69550c32ffa8", size = 180972, upload-time = "2025-10-14T16:32:58.737Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a3/51e6e6afaef2990986d685ca6e254ffbd191f1635a59b2d06c9e5d10c8a2/hiredis-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1bbc6b8a88bbe331e3ebf6685452cebca6dfe6d38a6d4efc5651d7e363ba28bd", size = 175315, upload-time = "2025-10-14T16:32:59.774Z" }, + { url = "https://files.pythonhosted.org/packages/96/54/e436312feb97601f70f8b39263b8da5ac4a5d18305ebdfb08ad7621f6119/hiredis-3.3.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:55d8c18fe9a05496c5c04e6eccc695169d89bf358dff964bcad95696958ec05f", size = 185653, upload-time = "2025-10-14T16:33:00.749Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a3/88e66030d066337c6c0f883a912c6d4b2d6d7173490fbbc113a6cbe414ff/hiredis-3.3.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:4ddc79afa76b805d364e202a754666cb3c4d9c85153cbfed522871ff55827838", size = 179032, upload-time = "2025-10-14T16:33:01.711Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1f/fb7375467e9adaa371cd617c2984fefe44bdce73add4c70b8dd8cab1b33a/hiredis-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e8a4b8540581dcd1b2b25827a54cfd538e0afeaa1a0e3ca87ad7126965981cc", size = 176127, upload-time = "2025-10-14T16:33:02.793Z" }, ] [[package]] @@ -1314,13 +1750,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/4b/2b81e876abf77b4af3372aff731f4f6722840ebc7dcfd85778eaba271733/httpx_oauth-0.16.1-py3-none-any.whl", hash = "sha256:2fcad82f80f28d0473a0fc4b4eda223dc952050af7e3a8c8781342d850f09fb5", size = 38056, upload-time = "2024-12-20T07:23:00.394Z" }, ] +[[package]] +name = "huggingface-hub" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "hf-xet", marker = "(platform_machine == 'AMD64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'amd64' and sys_platform == 'darwin') or (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'AMD64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'amd64' and sys_platform == 'linux') or (platform_machine == 'arm64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "shellingham", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typer-slim", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/25/74af9d16cd59ae15b12467a79a84aa0fe24be4aba68fc4da0c1864d49c17/huggingface_hub-1.3.4.tar.gz", hash = "sha256:c20d5484a611b7b7891d272e8fc9f77d5de025b0480bdacfa858efb3780b455f", size = 627683, upload-time = "2026-01-26T14:05:10.656Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl", hash = "sha256:a0c526e76eb316e96a91e8a1a7a93cf66b0dd210be1a17bd5fc5ae53cba76bfd", size = 536611, upload-time = "2026-01-26T14:05:08.549Z" }, +] + [[package]] name = "humanize" -version = "4.13.0" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload-time = "2025-08-25T09:39:20.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/66/a3921783d54be8a6870ac4ccffcd15c4dc0dd7fcce51c6d63b8c63935276/humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10", size = 83599, upload-time = "2025-12-20T20:16:13.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/c7/316e7ca04d26695ef0635dc81683d628350810eb8e9b2299fc08ba49f366/humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f", size = 128869, upload-time = "2025-08-25T09:39:18.54Z" }, + { url = "https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769", size = 132203, upload-time = "2025-12-20T20:16:11.67Z" }, ] [[package]] @@ -1344,22 +1801,80 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload-time = "2021-01-08T05:51:22.906Z" }, ] -[[package]] -name = "identify" -version = "2.6.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload-time = "2025-09-06T19:30:52.938Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload-time = "2025-09-06T19:30:51.759Z" }, -] - [[package]] name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "ijson" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/57/60d1a6a512f2f0508d0bc8b4f1cc5616fd3196619b66bd6a01f9155a1292/ijson-3.5.0.tar.gz", hash = "sha256:94688760720e3f5212731b3cb8d30267f9a045fb38fb3870254e7b9504246f31", size = 68658, upload-time = "2026-02-24T03:58:30.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/da/644343198abca5e0f6e2486063f8d8f3c443ca0ef5e5c890e51ef6032e33/ijson-3.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5616311404b858d32740b7ad8b9a799c62165f5ecb85d0a8ed16c21665a90533", size = 88964, upload-time = "2026-02-24T03:56:53.099Z" }, + { url = "https://files.pythonhosted.org/packages/5b/63/8621190aa2baf96156dfd4c632b6aa9f1464411e50b98750c09acc0505ea/ijson-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9733f94029dd41702d573ef64752e2556e72aea14623d6dbb7a44ca1ccf30fd", size = 60582, upload-time = "2026-02-24T03:56:54.261Z" }, + { url = "https://files.pythonhosted.org/packages/20/31/6a3f041fdd17dacff33b7d7d3ba3df6dca48740108340c6042f974b2ad20/ijson-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db8398c6721b98412a4f618da8022550c8b9c5d9214040646071b5deb4d4a393", size = 60632, upload-time = "2026-02-24T03:56:55.159Z" }, + { url = "https://files.pythonhosted.org/packages/e4/68/474541998abbdecfd46a744536878335de89aceb9f085bff1aaf35575ceb/ijson-3.5.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c061314845c08163b1784b6076ea5f075372461a32e6916f4e5f211fd4130b64", size = 131988, upload-time = "2026-02-24T03:56:56.35Z" }, + { url = "https://files.pythonhosted.org/packages/cd/32/e05ff8b72a44fe9d192f41c5dcbc35cfa87efc280cdbfe539ffaf4a7535e/ijson-3.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1111a1c5ac79119c5d6e836f900c1a53844b50a18af38311baa6bb61e2645aca", size = 138669, upload-time = "2026-02-24T03:56:57.555Z" }, + { url = "https://files.pythonhosted.org/packages/49/b5/955a83b031102c7a602e2c06d03aff0a0e584212f09edb94ccc754d203ac/ijson-3.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e74aff8c681c24002b61b1822f9511d4c384f324f7dbc08c78538e01fdc9fcb", size = 135093, upload-time = "2026-02-24T03:56:59.267Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f2/30250cfcb4d2766669b31f6732689aab2bb91de426a15a3ebe482df7ee48/ijson-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:739a7229b1b0cc5f7e2785a6e7a5fc915e850d3fed9588d0e89a09f88a417253", size = 138715, upload-time = "2026-02-24T03:57:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/a2/05/785a145d7e75e04e04480d59b6323cd4b1d9013a6cd8643fa635fbc93490/ijson-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ef88712160360cab3ca6471a4e5418243f8b267cf1fe1620879d1b5558babc71", size = 133194, upload-time = "2026-02-24T03:57:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/14/eb/80d6f8a748dead4034cea0939494a67d10ccf88d6413bf6e860393139676/ijson-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ca0d1b6b5f8166a6248f4309497585fb8553b04bc8179a0260fad636cfdb798", size = 135588, upload-time = "2026-02-24T03:57:03.131Z" }, + { url = "https://files.pythonhosted.org/packages/aa/17/9c63c7688025f3a8c47ea717b8306649c8c7244e49e20a2be4e3515dc75c/ijson-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ebefbe149a6106cc848a3eaf536af51a9b5ccc9082de801389f152dba6ab755", size = 88536, upload-time = "2026-02-24T03:57:06.809Z" }, + { url = "https://files.pythonhosted.org/packages/6f/dd/e15c2400244c117b06585452ebc63ae254f5a6964f712306afd1422daae0/ijson-3.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:19e30d9f00f82e64de689c0b8651b9cfed879c184b139d7e1ea5030cec401c21", size = 60499, upload-time = "2026-02-24T03:57:09.155Z" }, + { url = "https://files.pythonhosted.org/packages/77/a9/bf4fe3538a0c965f16b406f180a06105b875da83f0743e36246be64ef550/ijson-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a04a33ee78a6f27b9b8528c1ca3c207b1df3b8b867a4cf2fcc4109986f35c227", size = 60330, upload-time = "2026-02-24T03:57:10.574Z" }, + { url = "https://files.pythonhosted.org/packages/31/76/6f91bdb019dd978fce1bc5ea1cd620cfc096d258126c91db2c03a20a7f34/ijson-3.5.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7d48dc2984af02eb3c56edfb3f13b3f62f2f3e4fe36f058c8cfc75d93adf4fed", size = 138977, upload-time = "2026-02-24T03:57:11.932Z" }, + { url = "https://files.pythonhosted.org/packages/11/be/bbc983059e48a54b0121ee60042979faed7674490bbe7b2c41560db3f436/ijson-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1e73a44844d9adbca9cf2c4132cd875933e83f3d4b23881fcaf82be83644c7d", size = 149785, upload-time = "2026-02-24T03:57:13.255Z" }, + { url = "https://files.pythonhosted.org/packages/6d/81/2fee58f9024a3449aee83edfa7167fb5ccd7e1af2557300e28531bb68e16/ijson-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7389a56b8562a19948bdf1d7bae3a2edc8c7f86fb59834dcb1c4c722818e645a", size = 149729, upload-time = "2026-02-24T03:57:14.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/56/f1706761fcc096c9d414b3dcd000b1e6e5c24364c21cfba429837f98ee8d/ijson-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3176f23f8ebec83f374ed0c3b4e5a0c4db7ede54c005864efebbed46da123608", size = 150697, upload-time = "2026-02-24T03:57:15.855Z" }, + { url = "https://files.pythonhosted.org/packages/d9/6e/ee0d9c875a0193b632b3e9ccd1b22a50685fb510256ad57ba483b6529f77/ijson-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6babd88e508630c6ef86c9bebaaf13bb2fb8ec1d8f8868773a03c20253f599bc", size = 142873, upload-time = "2026-02-24T03:57:16.831Z" }, + { url = "https://files.pythonhosted.org/packages/d2/bf/f9d4399d0e6e3fd615035290a71e97c843f17f329b43638c0a01cf112d73/ijson-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dc1b3836b174b6db2fa8319f1926fb5445abd195dc963368092103f8579cb8ed", size = 151583, upload-time = "2026-02-24T03:57:17.757Z" }, + { url = "https://files.pythonhosted.org/packages/a2/71/d67e764a712c3590627480643a3b51efcc3afa4ef3cb54ee4c989073c97e/ijson-3.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e9cedc10e40dd6023c351ed8bfc7dcfce58204f15c321c3c1546b9c7b12562a4", size = 88544, upload-time = "2026-02-24T03:57:21.293Z" }, + { url = "https://files.pythonhosted.org/packages/1a/39/f1c299371686153fa3cf5c0736b96247a87a1bee1b7145e6d21f359c505a/ijson-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3647649f782ee06c97490b43680371186651f3f69bebe64c6083ee7615d185e5", size = 60495, upload-time = "2026-02-24T03:57:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/16/94/b1438e204d75e01541bebe3e668fe3e68612d210e9931ae1611062dd0a56/ijson-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:90e74be1dce05fce73451c62d1118671f78f47c9f6be3991c82b91063bf01fc9", size = 60325, upload-time = "2026-02-24T03:57:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/30/e2/4aa9c116fa86cc8b0f574f3c3a47409edc1cd4face05d0e589a5a176b05d/ijson-3.5.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:78e9ad73e7be2dd80627504bd5cbf512348c55ce2c06e362ed7683b5220e8568", size = 138774, upload-time = "2026-02-24T03:57:24.683Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d2/738b88752a70c3be1505faa4dcd7110668c2712e582a6a36488ed1e295d4/ijson-3.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9577449313cc94be89a4fe4b3e716c65f09cc19636d5a6b2861c4e80dddebd58", size = 149820, upload-time = "2026-02-24T03:57:26.062Z" }, + { url = "https://files.pythonhosted.org/packages/ed/df/0b3ab9f393ca8f72ea03bc896ba9fdc987e90ae08cdb51c32a4ee0c14d5e/ijson-3.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e4c1178fb50aff5f5701a30a5152ead82a14e189ce0f6102fa1b5f10b2f54ff", size = 149747, upload-time = "2026-02-24T03:57:27.308Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a3/b0037119f75131b78cb00acc2657b1a9d0435475f1f2c5f8f5a170b66b9c/ijson-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0eb402ab026ffb37a918d75af2b7260fe6cfbce13232cc83728a714dd30bd81d", size = 151027, upload-time = "2026-02-24T03:57:28.522Z" }, + { url = "https://files.pythonhosted.org/packages/22/a0/cb344de1862bf09d8f769c9d25c944078c87dd59a1b496feec5ad96309a4/ijson-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b08ee08355f9f729612a8eb9bf69cc14f9310c3b2a487c6f1c3c65d85216ec4", size = 142996, upload-time = "2026-02-24T03:57:29.774Z" }, + { url = "https://files.pythonhosted.org/packages/ca/32/a8ffd67182e02ea61f70f62daf43ded4fa8a830a2520a851d2782460aba8/ijson-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bda62b6d48442903e7bf56152108afb7f0f1293c2b9bef2f2c369defea76ab18", size = 152068, upload-time = "2026-02-24T03:57:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/42/65/13e2492d17e19a2084523e18716dc2809159f2287fd2700c735f311e76c4/ijson-3.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4d4b0cd676b8c842f7648c1a783448fac5cd3b98289abd83711b3e275e143524", size = 93019, upload-time = "2026-02-24T03:57:33.976Z" }, + { url = "https://files.pythonhosted.org/packages/33/92/483fc97ece0c3f1cecabf48f6a7a36e89d19369eec462faaeaa34c788992/ijson-3.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:252dec3680a48bb82d475e36b4ae1b3a9d7eb690b951bb98a76c5fe519e30188", size = 62714, upload-time = "2026-02-24T03:57:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/4b/88/793fe020a0fe9d9eed4c285cf4a5cfdb0a935708b3bde0d72f35c794b513/ijson-3.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:aa1b5dca97d323931fde2501172337384c958914d81a9dac7f00f0d4bfc76bc7", size = 62460, upload-time = "2026-02-24T03:57:35.874Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/f1a2690aa8d4df1f4e262b385e65a933ffdc250b091531bac9a449c19e16/ijson-3.5.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7a5ec7fd86d606094bba6f6f8f87494897102fa4584ef653f3005c51a784c320", size = 199273, upload-time = "2026-02-24T03:57:37.07Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a2/f1346d5299e79b988ab472dc773d5381ec2d57c23cb2f1af3ede4a810e62/ijson-3.5.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:009f41443e1521847701c6d87fa3923c0b1961be3c7e7de90947c8cb92ea7c44", size = 216884, upload-time = "2026-02-24T03:57:38.346Z" }, + { url = "https://files.pythonhosted.org/packages/28/3c/8b637e869be87799e6c2c3c275a30a546f086b1aed77e2b7f11512168c5a/ijson-3.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4c3651d1f9fe2839a93fdf8fd1d5ca3a54975349894249f3b1b572bcc4bd577", size = 207306, upload-time = "2026-02-24T03:57:39.718Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7c/18b1c1df6951ca056782d7580ec40cea4ff9a27a0947d92640d1cc8c4ae3/ijson-3.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:945b7abcfcfeae2cde17d8d900870f03536494245dda7ad4f8d056faa303256c", size = 211364, upload-time = "2026-02-24T03:57:40.953Z" }, + { url = "https://files.pythonhosted.org/packages/f3/55/e795812e82851574a9dba8a53fde045378f531ef14110c6fb55dbd23b443/ijson-3.5.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0574b0a841ff97495c13e9d7260fbf3d85358b061f540c52a123db9dbbaa2ed6", size = 200608, upload-time = "2026-02-24T03:57:42.272Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cd/013c85b4749b57a4cb4c2670014d1b32b8db4ab1a7be92ea7aeb5d7fe7b5/ijson-3.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f969ffb2b89c5cdf686652d7fb66252bc72126fa54d416317411497276056a18", size = 205127, upload-time = "2026-02-24T03:57:43.286Z" }, + { url = "https://files.pythonhosted.org/packages/7a/93/0868efe753dc1df80cc405cf0c1f2527a6991643607c741bff8dcb899b3b/ijson-3.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:25a5a6b2045c90bb83061df27cfa43572afa43ba9408611d7bfe237c20a731a9", size = 89094, upload-time = "2026-02-24T03:57:46.115Z" }, + { url = "https://files.pythonhosted.org/packages/24/94/fd5a832a0df52ef5e4e740f14ac8640725d61034a1b0c561e8b5fb424706/ijson-3.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8976c54c0b864bc82b951bae06567566ac77ef63b90a773a69cd73aab47f4f4f", size = 60715, upload-time = "2026-02-24T03:57:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/70/79/1b9a90af5732491f9eec751ee211b86b11011e1158c555c06576d52c3919/ijson-3.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:859eb2038f7f1b0664df4241957694cc35e6295992d71c98659b22c69b3cbc10", size = 60638, upload-time = "2026-02-24T03:57:48.428Z" }, + { url = "https://files.pythonhosted.org/packages/23/6f/2c551ea980fe56f68710a8d5389cfbd015fc45aaafd17c3c52c346db6aa1/ijson-3.5.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c911aa02991c7c0d3639b6619b93a93210ff1e7f58bf7225d613abea10adc78e", size = 140667, upload-time = "2026-02-24T03:57:49.314Z" }, + { url = "https://files.pythonhosted.org/packages/25/0e/27b887879ba6a5bc29766e3c5af4942638c952220fd63e1e442674f7883a/ijson-3.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:903cbdc350173605220edc19796fbea9b2203c8b3951fb7335abfa8ed37afda8", size = 149850, upload-time = "2026-02-24T03:57:50.329Z" }, + { url = "https://files.pythonhosted.org/packages/da/1e/23e10e1bc04bf31193b21e2960dce14b17dbd5d0c62204e8401c59d62c08/ijson-3.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4549d96ded5b8efa71639b2160235415f6bdb8c83367615e2dbabcb72755c33", size = 149206, upload-time = "2026-02-24T03:57:51.261Z" }, + { url = "https://files.pythonhosted.org/packages/8e/90/e552f6495063b235cf7fa2c592f6597c057077195e517b842a0374fd470c/ijson-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6b2dcf6349e6042d83f3f8c39ce84823cf7577eba25bac5aae5e39bbbbbe9c1c", size = 150438, upload-time = "2026-02-24T03:57:52.198Z" }, + { url = "https://files.pythonhosted.org/packages/5c/18/45bf8f297c41b42a1c231d261141097babd953d2c28a07be57ae4c3a1a02/ijson-3.5.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e44af39e6f8a17e5627dcd89715d8279bf3474153ff99aae031a936e5c5572e5", size = 144369, upload-time = "2026-02-24T03:57:53.22Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/deb9772bb2c0cead7ad64f00c3598eec9072bdf511818e70e2c512eeabbe/ijson-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9260332304b7e7828db56d43f08fc970a3ab741bf84ff10189361ea1b60c395b", size = 151352, upload-time = "2026-02-24T03:57:54.375Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d9/86f7fac35e0835faa188085ae0579e813493d5261ce056484015ad533445/ijson-3.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:2ea4b676ec98e374c1df400a47929859e4fa1239274339024df4716e802aa7e4", size = 93069, upload-time = "2026-02-24T03:57:57.849Z" }, + { url = "https://files.pythonhosted.org/packages/33/d2/e7366ed9c6e60228d35baf4404bac01a126e7775ea8ce57f560125ed190a/ijson-3.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:014586eec043e23c80be9a923c56c3a0920a0f1f7d17478ce7bc20ba443968ef", size = 62767, upload-time = "2026-02-24T03:57:58.758Z" }, + { url = "https://files.pythonhosted.org/packages/35/8b/3e703e8cc4b3ada79f13b28070b51d9550c578f76d1968657905857b2ddd/ijson-3.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5b8b886b0248652d437f66e7c5ac318bbdcb2c7137a7e5327a68ca00b286f5f", size = 62467, upload-time = "2026-02-24T03:58:00.261Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/0c91af32c1ee8a957fdac2e051b5780756d05fd34e4b60d94a08d51bac1d/ijson-3.5.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:498fd46ae2349297e43acf97cdc421e711dbd7198418677259393d2acdc62d78", size = 200447, upload-time = "2026-02-24T03:58:01.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/80/796ea0e391b7e2d45c5b1b451734bba03f81c2984cf955ea5eaa6c4920ad/ijson-3.5.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22a51b4f9b81f12793731cf226266d1de2112c3c04ba4a04117ad4e466897e05", size = 217820, upload-time = "2026-02-24T03:58:02.598Z" }, + { url = "https://files.pythonhosted.org/packages/38/14/52b6613fdda4078c62eb5b4fe3efc724ddc55a4ad524c93de51830107aa3/ijson-3.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9636c710dc4ac4a281baa266a64f323b4cc165cec26836af702c44328b59a515", size = 208310, upload-time = "2026-02-24T03:58:04.759Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ad/8b3105a78774fd4a65e534a21d975ef3a77e189489fe3029ebcaeba5e243/ijson-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f7168a39e8211107666d71b25693fd1b2bac0b33735ef744114c403c6cac21e1", size = 211843, upload-time = "2026-02-24T03:58:05.836Z" }, + { url = "https://files.pythonhosted.org/packages/36/ab/a2739f6072d6e1160581bc3ed32da614c8cced023dcd519d9c5fa66e0425/ijson-3.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8696454245415bc617ab03b0dc3ae4c86987df5dc6a90bad378fe72c5409d89e", size = 200906, upload-time = "2026-02-24T03:58:07.788Z" }, + { url = "https://files.pythonhosted.org/packages/6d/5e/e06c2de3c3d4a9cfb655c1ad08a68fb72838d271072cdd3196576ac4431a/ijson-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c21bfb61f71f191565885bf1bc29e0a186292d866b4880637b833848360bdc1b", size = 205495, upload-time = "2026-02-24T03:58:09.163Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3b/d31ecfa63a218978617446159f3d77aab2417a5bd2885c425b176353ff78/ijson-3.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d64c624da0e9d692d6eb0ff63a79656b59d76bf80773a17c5b0f835e4e8ef627", size = 57715, upload-time = "2026-02-24T03:58:24.545Z" }, + { url = "https://files.pythonhosted.org/packages/30/51/b170e646d378e8cccf9637c05edb5419b00c2c4df64b0258c3af5355608e/ijson-3.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:876f7df73b7e0d6474f9caa729b9cdbfc8e76de9075a4887dfd689e29e85c4ca", size = 57205, upload-time = "2026-02-24T03:58:25.681Z" }, + { url = "https://files.pythonhosted.org/packages/ef/83/44dbd0231b0a8c6c14d27473d10c4e27dfbce7d5d9a833c79e3e6c33eb40/ijson-3.5.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e7dbff2c8d9027809b0cde663df44f3210da10ea377121d42896fb6ee405dd31", size = 71229, upload-time = "2026-02-24T03:58:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/cf84048b7c6cec888826e696a31f45bee7ebcac15e532b6be1fc4c2c9608/ijson-3.5.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4217a1edc278660679e1197c83a1a2a2d367792bfbb2a3279577f4b59b93730d", size = 71217, upload-time = "2026-02-24T03:58:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0a/e34c729a87ff67dc6540f6bcc896626158e691d433ab57db0086d73decd2/ijson-3.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04f0fc740311388ee745ba55a12292b722d6f52000b11acbb913982ba5fbdf87", size = 68618, upload-time = "2026-02-24T03:58:28.918Z" }, ] [[package]] @@ -1367,13 +1882,10 @@ name = "imagehash" version = "4.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pywavelets", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, - { name = "pywavelets", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, - { name = "scipy", version = "1.16.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, + { name = "pywavelets", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/de/5c0189b0582e21583c2a213081c35a2501c0f9e51f21f6a52f55fbb9a4ff/ImageHash-4.3.2.tar.gz", hash = "sha256:e54a79805afb82a34acde4746a16540503a9636fd1ffb31d8e099b29bbbf8156", size = 303190, upload-time = "2025-02-01T08:45:39.328Z" } wheels = [ @@ -1382,34 +1894,36 @@ wheels = [ [[package]] name = "imap-tools" -version = "1.11.0" +version = "1.11.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/76/2d74bf4702d7d9fb2dd056e058929961a05389be47b990f3275e8596012e/imap_tools-1.11.0.tar.gz", hash = "sha256:77b055d301f24e668ff54ad50cc32a36d1579c6aa9b26e5fb6501fb622feb6ea", size = 46191, upload-time = "2025-06-30T05:47:21.111Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/eb/de91770dc8f34691c33355f7b6277500db32f68ce039c08e2a40ad5a0536/imap_tools-1.11.1.tar.gz", hash = "sha256:e3aa02ff3415a2b50a47707eacbf7386bb79aabc34e370c6bb95f9ad20504389", size = 46562, upload-time = "2026-01-15T08:25:47.357Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/8f/75524e1a040183cc437332e2de6e8f975c345fff8b5aaa35e0d20dec24f9/imap_tools-1.11.0-py3-none-any.whl", hash = "sha256:7c797b421fdf1b898b4ee0042fe02d10037d56f9acacca64086c2af36d830a24", size = 34855, upload-time = "2025-06-30T05:47:15.657Z" }, + { url = "https://files.pythonhosted.org/packages/64/bb/94eca066102559a20953475779a4d4d6b39712985014bceba726e1f65aab/imap_tools-1.11.1-py3-none-any.whl", hash = "sha256:0749d0a1f2b9041be1533ea98cc3e9f7977ba86ad3669c1fcf89c27969dcfb0a", size = 35291, upload-time = "2026-01-15T08:25:42.773Z" }, ] [[package]] name = "img2pdf" -version = "0.6.1" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pikepdf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/c3/023387e00682dc1b46bd719ec19c4c9206dc8eb182dfd02bc62c5b9320a2/img2pdf-0.6.1.tar.gz", hash = "sha256:306e279eb832bc159d7d6294b697a9fbd11b4be1f799b14b3b2174fb506af289", size = 106513, upload-time = "2025-04-27T16:55:10.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/97/ca44c467131b93fda82d2a2f21b738c8bcf63b5259e3b8250e928b8dd52a/img2pdf-0.6.3.tar.gz", hash = "sha256:219518020f5bd242bdc46493941ea3f756f664c2e86f2454721e74353f58cd95", size = 120350, upload-time = "2025-11-05T20:51:57.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/dc/91e3a4a11c25ae183bd5a71b84ecb298db76405ff70013f76b10877bdfe3/img2pdf-0.6.3-py3-none-any.whl", hash = "sha256:44d12d235752edd17c43c04ff39952cdc5dd4c6aba90569c4902bd445085266b", size = 49701, upload-time = "2025-11-05T20:51:55.469Z" }, +] [[package]] name = "incremental" -version = "24.7.2" +version = "24.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/87/156b374ff6578062965afe30cc57627d35234369b3336cf244b240c8d8e6/incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9", size = 28157, upload-time = "2024-07-29T20:03:55.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/3c/82e84109e02c492f382c711c58a3dd91badda6d746def81a1465f74dc9f5/incremental-24.11.0.tar.gz", hash = "sha256:87d3480dbb083c1d736222511a8cf380012a8176c2456d01ef483242abbbcf8c", size = 24000, upload-time = "2025-11-28T02:30:17.861Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/38/221e5b2ae676a3938c2c1919131410c342b6efc2baffeda395dd66eeca8f/incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe", size = 20516, upload-time = "2024-07-29T20:03:53.677Z" }, + { url = "https://files.pythonhosted.org/packages/1d/55/0f4df2a44053867ea9cbea73fc588b03c55605cd695cee0a3d86f0029cb2/incremental-24.11.0-py3-none-any.whl", hash = "sha256:a34450716b1c4341fe6676a0598e88a39e04189f4dce5dc96f656e040baa10b3", size = 21109, upload-time = "2025-11-28T02:30:16.442Z" }, ] [[package]] @@ -1423,32 +1937,20 @@ wheels = [ [[package]] name = "iniconfig" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, -] - -[[package]] -name = "inotify-simple" -version = "2.0.1" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/5c/bfe40e15d684bc30b0073aa97c39be410a5fbef3d33cad6f0bf2012571e0/inotify_simple-2.0.1.tar.gz", hash = "sha256:f010bbbd8283bd71a9f4eb2de94765804ede24bd47320b0e6ef4136e541cdc2c", size = 7101, upload-time = "2025-08-25T06:28:20.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/86/8be1ac7e90f80b413e81f1e235148e8db771218886a2353392f02da01be3/inotify_simple-2.0.1-py3-none-any.whl", hash = "sha256:e5da495f2064889f8e68b67f9358b0d102e03b783c2d42e5b8e132ab859a5d8a", size = 7449, upload-time = "2025-08-25T06:28:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] -name = "inotifyrecursive" -version = "0.3.5" +name = "isodate" +version = "0.7.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "inotify-simple", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/3a/9ed038cb750a3ba8090869cf3ad50f5628077a936d911aee14ca83e40f6a/inotifyrecursive-0.3.5.tar.gz", hash = "sha256:a2c450b317693e4538416f90eb1d7858506dafe6b8b885037bd2dd9ae2dafa1e", size = 4576, upload-time = "2020-11-20T12:38:48.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/fc/4e5a141c3f7c7bed550ac1f69e599e92b6be449dd4677ec09f325cad0955/inotifyrecursive-0.3.5-py3-none-any.whl", hash = "sha256:7e5f4a2e1dc2bef0efa3b5f6b339c41fb4599055a2b54909d020e9e932cc8d2f", size = 8009, upload-time = "2020-11-20T12:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, ] [[package]] @@ -1463,18 +1965,86 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jiter" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/9d/e0660989c1370e25848bb4c52d061c71837239738ad937e83edca174c273/jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b", size = 168294, upload-time = "2025-11-09T20:49:23.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/f9/eaca4633486b527ebe7e681c431f529b63fe2709e7c5242fc0f43f77ce63/jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9", size = 316435, upload-time = "2025-11-09T20:47:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/10/c1/40c9f7c22f5e6ff715f28113ebaba27ab85f9af2660ad6e1dd6425d14c19/jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd", size = 320548, upload-time = "2025-11-09T20:47:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1b/efbb68fe87e7711b00d2cfd1f26bb4bfc25a10539aefeaa7727329ffb9cb/jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423", size = 351915, upload-time = "2025-11-09T20:47:05.171Z" }, + { url = "https://files.pythonhosted.org/packages/15/2d/c06e659888c128ad1e838123d0638f0efad90cc30860cb5f74dd3f2fc0b3/jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7", size = 368966, upload-time = "2025-11-09T20:47:06.508Z" }, + { url = "https://files.pythonhosted.org/packages/6b/20/058db4ae5fb07cf6a4ab2e9b9294416f606d8e467fb74c2184b2a1eeacba/jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2", size = 482047, upload-time = "2025-11-09T20:47:08.382Z" }, + { url = "https://files.pythonhosted.org/packages/49/bb/dc2b1c122275e1de2eb12905015d61e8316b2f888bdaac34221c301495d6/jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9", size = 380835, upload-time = "2025-11-09T20:47:09.81Z" }, + { url = "https://files.pythonhosted.org/packages/23/7d/38f9cd337575349de16da575ee57ddb2d5a64d425c9367f5ef9e4612e32e/jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6", size = 364587, upload-time = "2025-11-09T20:47:11.529Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a3/b13e8e61e70f0bb06085099c4e2462647f53cc2ca97614f7fedcaa2bb9f3/jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725", size = 390492, upload-time = "2025-11-09T20:47:12.993Z" }, + { url = "https://files.pythonhosted.org/packages/07/71/e0d11422ed027e21422f7bc1883c61deba2d9752b720538430c1deadfbca/jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6", size = 522046, upload-time = "2025-11-09T20:47:14.6Z" }, + { url = "https://files.pythonhosted.org/packages/9f/59/b968a9aa7102a8375dbbdfbd2aeebe563c7e5dddf0f47c9ef1588a97e224/jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e", size = 513392, upload-time = "2025-11-09T20:47:16.011Z" }, + { url = "https://files.pythonhosted.org/packages/92/c9/5b9f7b4983f1b542c64e84165075335e8a236fa9e2ea03a0c79780062be8/jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37", size = 314449, upload-time = "2025-11-09T20:47:22.999Z" }, + { url = "https://files.pythonhosted.org/packages/98/6e/e8efa0e78de00db0aee82c0cf9e8b3f2027efd7f8a71f859d8f4be8e98ef/jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274", size = 319855, upload-time = "2025-11-09T20:47:24.779Z" }, + { url = "https://files.pythonhosted.org/packages/20/26/894cd88e60b5d58af53bec5c6759d1292bd0b37a8b5f60f07abf7a63ae5f/jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3", size = 350171, upload-time = "2025-11-09T20:47:26.469Z" }, + { url = "https://files.pythonhosted.org/packages/f5/27/a7b818b9979ac31b3763d25f3653ec3a954044d5e9f5d87f2f247d679fd1/jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf", size = 365590, upload-time = "2025-11-09T20:47:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7e/e46195801a97673a83746170b17984aa8ac4a455746354516d02ca5541b4/jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1", size = 479462, upload-time = "2025-11-09T20:47:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/ca/75/f833bfb009ab4bd11b1c9406d333e3b4357709ed0570bb48c7c06d78c7dd/jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df", size = 378983, upload-time = "2025-11-09T20:47:31.026Z" }, + { url = "https://files.pythonhosted.org/packages/71/b3/7a69d77943cc837d30165643db753471aff5df39692d598da880a6e51c24/jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403", size = 361328, upload-time = "2025-11-09T20:47:33.286Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ac/a78f90caf48d65ba70d8c6efc6f23150bc39dc3389d65bbec2a95c7bc628/jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126", size = 386740, upload-time = "2025-11-09T20:47:34.703Z" }, + { url = "https://files.pythonhosted.org/packages/39/b6/5d31c2cc8e1b6a6bcf3c5721e4ca0a3633d1ab4754b09bc7084f6c4f5327/jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9", size = 520875, upload-time = "2025-11-09T20:47:36.058Z" }, + { url = "https://files.pythonhosted.org/packages/30/b5/4df540fae4e9f68c54b8dab004bd8c943a752f0b00efd6e7d64aa3850339/jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86", size = 511457, upload-time = "2025-11-09T20:47:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a6/97209693b177716e22576ee1161674d1d58029eb178e01866a0422b69224/jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e", size = 313658, upload-time = "2025-11-09T20:47:44.424Z" }, + { url = "https://files.pythonhosted.org/packages/06/4d/125c5c1537c7d8ee73ad3d530a442d6c619714b95027143f1b61c0b4dfe0/jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1", size = 318605, upload-time = "2025-11-09T20:47:45.973Z" }, + { url = "https://files.pythonhosted.org/packages/99/bf/a840b89847885064c41a5f52de6e312e91fa84a520848ee56c97e4fa0205/jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf", size = 349803, upload-time = "2025-11-09T20:47:47.535Z" }, + { url = "https://files.pythonhosted.org/packages/8a/88/e63441c28e0db50e305ae23e19c1d8fae012d78ed55365da392c1f34b09c/jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44", size = 365120, upload-time = "2025-11-09T20:47:49.284Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7c/49b02714af4343970eb8aca63396bc1c82fa01197dbb1e9b0d274b550d4e/jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45", size = 479918, upload-time = "2025-11-09T20:47:50.807Z" }, + { url = "https://files.pythonhosted.org/packages/69/ba/0a809817fdd5a1db80490b9150645f3aae16afad166960bcd562be194f3b/jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87", size = 379008, upload-time = "2025-11-09T20:47:52.211Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c3/c9fc0232e736c8877d9e6d83d6eeb0ba4e90c6c073835cc2e8f73fdeef51/jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed", size = 361785, upload-time = "2025-11-09T20:47:53.512Z" }, + { url = "https://files.pythonhosted.org/packages/96/61/61f69b7e442e97ca6cd53086ddc1cf59fb830549bc72c0a293713a60c525/jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9", size = 386108, upload-time = "2025-11-09T20:47:54.893Z" }, + { url = "https://files.pythonhosted.org/packages/e9/2e/76bb3332f28550c8f1eba3bf6e5efe211efda0ddbbaf24976bc7078d42a5/jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626", size = 519937, upload-time = "2025-11-09T20:47:56.253Z" }, + { url = "https://files.pythonhosted.org/packages/84/d6/fa96efa87dc8bff2094fb947f51f66368fa56d8d4fc9e77b25d7fbb23375/jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c", size = 510853, upload-time = "2025-11-09T20:47:58.32Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/67bb15a7061d6fe20b9b2a2fd783e296a1e0f93468252c093481a2f00efa/jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6", size = 317965, upload-time = "2025-11-09T20:48:03.783Z" }, + { url = "https://files.pythonhosted.org/packages/18/af/1788031cd22e29c3b14bc6ca80b16a39a0b10e611367ffd480c06a259831/jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4", size = 345831, upload-time = "2025-11-09T20:48:05.55Z" }, + { url = "https://files.pythonhosted.org/packages/05/17/710bf8472d1dff0d3caf4ced6031060091c1320f84ee7d5dcbed1f352417/jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb", size = 361272, upload-time = "2025-11-09T20:48:06.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/45c9f0dbe4a1416b2b9a8a6d1236459540f43d7fb8883cff769a8db0612d/jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525", size = 312478, upload-time = "2025-11-09T20:48:10.898Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a7/54ae75613ba9e0f55fcb0bc5d1f807823b5167cc944e9333ff322e9f07dd/jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49", size = 318706, upload-time = "2025-11-09T20:48:12.266Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/2aa241ad2c10774baf6c37f8b8e1f39c07db358f1329f4eb40eba179c2a2/jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1", size = 351894, upload-time = "2025-11-09T20:48:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/54/4f/0f2759522719133a9042781b18cc94e335b6d290f5e2d3e6899d6af933e3/jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e", size = 365714, upload-time = "2025-11-09T20:48:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6f/806b895f476582c62a2f52c453151edd8a0fde5411b0497baaa41018e878/jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e", size = 478989, upload-time = "2025-11-09T20:48:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/86/6c/012d894dc6e1033acd8db2b8346add33e413ec1c7c002598915278a37f79/jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff", size = 378615, upload-time = "2025-11-09T20:48:18.614Z" }, + { url = "https://files.pythonhosted.org/packages/87/30/d718d599f6700163e28e2c71c0bbaf6dace692e7df2592fd793ac9276717/jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a", size = 364745, upload-time = "2025-11-09T20:48:20.117Z" }, + { url = "https://files.pythonhosted.org/packages/8f/85/315b45ce4b6ddc7d7fceca24068543b02bdc8782942f4ee49d652e2cc89f/jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a", size = 386502, upload-time = "2025-11-09T20:48:21.543Z" }, + { url = "https://files.pythonhosted.org/packages/74/0b/ce0434fb40c5b24b368fe81b17074d2840748b4952256bab451b72290a49/jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67", size = 519845, upload-time = "2025-11-09T20:48:22.964Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a3/7a7a4488ba052767846b9c916d208b3ed114e3eb670ee984e4c565b9cf0d/jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b", size = 510701, upload-time = "2025-11-09T20:48:24.483Z" }, + { url = "https://files.pythonhosted.org/packages/30/61/12ed8ee7a643cce29ac97c2281f9ce3956eb76b037e88d290f4ed0d41480/jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7", size = 318974, upload-time = "2025-11-09T20:48:30.87Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c6/f3041ede6d0ed5e0e79ff0de4c8f14f401bbf196f2ef3971cdbe5fd08d1d/jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684", size = 345932, upload-time = "2025-11-09T20:48:32.658Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/4d94835889edd01ad0e2dbfc05f7bdfaed46292e7b504a6ac7839aa00edb/jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c", size = 367243, upload-time = "2025-11-09T20:48:34.093Z" }, + { url = "https://files.pythonhosted.org/packages/fd/76/0051b0ac2816253a99d27baf3dda198663aff882fa6ea7deeb94046da24e/jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d", size = 479315, upload-time = "2025-11-09T20:48:35.507Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/83f793acd68e5cb24e483f44f482a1a15601848b9b6f199dacb970098f77/jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993", size = 380714, upload-time = "2025-11-09T20:48:40.014Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/4808a88338ad2c228b1126b93fcd8ba145e919e886fe910d578230dabe3b/jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f", size = 365168, upload-time = "2025-11-09T20:48:41.462Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d4/04619a9e8095b42aef436b5aeb4c0282b4ff1b27d1db1508df9f5dc82750/jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783", size = 387893, upload-time = "2025-11-09T20:48:42.921Z" }, + { url = "https://files.pythonhosted.org/packages/17/ea/d3c7e62e4546fdc39197fa4a4315a563a89b95b6d54c0d25373842a59cbe/jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b", size = 520828, upload-time = "2025-11-09T20:48:44.278Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0b/c6d3562a03fd767e31cb119d9041ea7958c3c80cb3d753eafb19b3b18349/jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6", size = 511009, upload-time = "2025-11-09T20:48:45.726Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/5339ef1ecaa881c6948669956567a64d2670941925f245c434f494ffb0e5/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8", size = 311144, upload-time = "2025-11-09T20:49:10.503Z" }, + { url = "https://files.pythonhosted.org/packages/27/74/3446c652bffbd5e81ab354e388b1b5fc1d20daac34ee0ed11ff096b1b01a/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3", size = 305877, upload-time = "2025-11-09T20:49:12.269Z" }, + { url = "https://files.pythonhosted.org/packages/a1/f4/ed76ef9043450f57aac2d4fbeb27175aa0eb9c38f833be6ef6379b3b9a86/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e", size = 340419, upload-time = "2025-11-09T20:49:13.803Z" }, + { url = "https://files.pythonhosted.org/packages/21/01/857d4608f5edb0664aa791a3d45702e1a5bcfff9934da74035e7b9803846/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d", size = 347212, upload-time = "2025-11-09T20:49:15.643Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f5/12efb8ada5f5c9edc1d4555fe383c1fb2eac05ac5859258a72d61981d999/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb", size = 309974, upload-time = "2025-11-09T20:49:17.187Z" }, + { url = "https://files.pythonhosted.org/packages/85/15/d6eb3b770f6a0d332675141ab3962fd4a7c270ede3515d9f3583e1d28276/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b", size = 304233, upload-time = "2025-11-09T20:49:18.734Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3e/e7e06743294eea2cf02ced6aa0ff2ad237367394e37a0e2b4a1108c67a36/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f", size = 338537, upload-time = "2025-11-09T20:49:20.317Z" }, + { url = "https://files.pythonhosted.org/packages/2f/9c/6753e6522b8d0ef07d3a3d239426669e984fb0eba15a315cdbc1253904e4/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c", size = 346110, upload-time = "2025-11-09T20:49:21.817Z" }, +] + [[package]] name = "joblib" -version = "1.5.2" +version = "1.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, ] [[package]] name = "jsonschema" -version = "4.25.1" +version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -1482,9 +2052,9 @@ dependencies = [ { name = "referencing", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "rpds-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] [[package]] @@ -1501,7 +2071,7 @@ wheels = [ [[package]] name = "kombu" -version = "5.5.4" +version = "5.6.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "amqp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -1509,9 +2079,9 @@ dependencies = [ { name = "tzdata", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "vine", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/d3/5ff936d8319ac86b9c409f1501b07c426e6ad41966fedace9ef1b966e23f/kombu-5.5.4.tar.gz", hash = "sha256:886600168275ebeada93b888e831352fe578168342f0d1d5833d88ba0d847363", size = 461992, upload-time = "2025-06-01T10:19:22.281Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/a5/607e533ed6c83ae1a696969b8e1c137dfebd5759a2e9682e26ff1b97740b/kombu-5.6.2.tar.gz", hash = "sha256:8060497058066c6f5aed7c26d7cd0d3b574990b09de842a8c5aaed0b92cc5a55", size = 472594, upload-time = "2025-12-29T20:30:07.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/70/a07dcf4f62598c8ad579df241af55ced65bed76e42e45d3c368a6d82dbc1/kombu-5.5.4-py3-none-any.whl", hash = "sha256:a12ed0557c238897d8e518f1d1fdf84bd1516c5e305af2dacd85c2015115feb8", size = 210034, upload-time = "2025-06-01T10:19:20.436Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0f/834427d8c03ff1d7e867d3db3d176470c64871753252b21b4f4897d1fa45/kombu-5.6.2-py3-none-any.whl", hash = "sha256:efcfc559da324d41d61ca311b0c64965ea35b4c55cc04ee36e55386145dace93", size = 214219, upload-time = "2025-12-29T20:30:05.74Z" }, ] [package.optional-dependencies] @@ -1529,60 +2099,226 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/0e/72/a3add0e4eec4eb9e2569554f7c70f4a3c27712f40e3284d483e88094cc0e/langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0", size = 981474, upload-time = "2021-05-07T07:54:13.562Z" } [[package]] -name = "lxml" -version = "6.0.2" +name = "librt" +version = "0.7.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/24/5f3646ff414285e0f7708fa4e946b9bf538345a41d1c375c439467721a5e/librt-0.7.8.tar.gz", hash = "sha256:1a4ede613941d9c3470b0368be851df6bb78ab218635512d0370b27a277a0862", size = 148323, upload-time = "2026-01-14T12:56:16.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/a3/87ea9c1049f2c781177496ebee29430e4631f439b8553a4969c88747d5d8/librt-0.7.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3e9c11aa260c31493d4b3197d1e28dd07768594a4f92bec4506849d736248f", size = 56507, upload-time = "2026-01-14T12:54:54.156Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4a/23bcef149f37f771ad30203d561fcfd45b02bc54947b91f7a9ac34815747/librt-0.7.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb52499d0b3ed4aa88746aaf6f36a08314677d5c346234c3987ddc506404eac", size = 58455, upload-time = "2026-01-14T12:54:55.978Z" }, + { url = "https://files.pythonhosted.org/packages/22/6e/46eb9b85c1b9761e0f42b6e6311e1cc544843ac897457062b9d5d0b21df4/librt-0.7.8-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e9c0afebbe6ce177ae8edba0c7c4d626f2a0fc12c33bb993d163817c41a7a05c", size = 164956, upload-time = "2026-01-14T12:54:57.311Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3f/aa7c7f6829fb83989feb7ba9aa11c662b34b4bd4bd5b262f2876ba3db58d/librt-0.7.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:631599598e2c76ded400c0a8722dec09217c89ff64dc54b060f598ed68e7d2a8", size = 174364, upload-time = "2026-01-14T12:54:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2d/d57d154b40b11f2cb851c4df0d4c4456bacd9b1ccc4ecb593ddec56c1a8b/librt-0.7.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c1ba843ae20db09b9d5c80475376168feb2640ce91cd9906414f23cc267a1ff", size = 188034, upload-time = "2026-01-14T12:55:00.141Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/36c4dad00925c16cd69d744b87f7001792691857d3b79187e7a673e812fb/librt-0.7.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b5b007bb22ea4b255d3ee39dfd06d12534de2fcc3438567d9f48cdaf67ae1ae3", size = 186295, upload-time = "2026-01-14T12:55:01.303Z" }, + { url = "https://files.pythonhosted.org/packages/23/9b/8a9889d3df5efb67695a67785028ccd58e661c3018237b73ad081691d0cb/librt-0.7.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dbd79caaf77a3f590cbe32dc2447f718772d6eea59656a7dcb9311161b10fa75", size = 181470, upload-time = "2026-01-14T12:55:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/43/64/54d6ef11afca01fef8af78c230726a9394759f2addfbf7afc5e3cc032a45/librt-0.7.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:87808a8d1e0bd62a01cafc41f0fd6818b5a5d0ca0d8a55326a81643cdda8f873", size = 201713, upload-time = "2026-01-14T12:55:03.919Z" }, + { url = "https://files.pythonhosted.org/packages/56/04/79d8fcb43cae376c7adbab7b2b9f65e48432c9eced62ac96703bcc16e09b/librt-0.7.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b6943885b2d49c48d0cff23b16be830ba46b0152d98f62de49e735c6e655a63", size = 57472, upload-time = "2026-01-14T12:55:08.528Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ba/60b96e93043d3d659da91752689023a73981336446ae82078cddf706249e/librt-0.7.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46ef1f4b9b6cc364b11eea0ecc0897314447a66029ee1e55859acb3dd8757c93", size = 58986, upload-time = "2026-01-14T12:55:09.466Z" }, + { url = "https://files.pythonhosted.org/packages/7c/26/5215e4cdcc26e7be7eee21955a7e13cbf1f6d7d7311461a6014544596fac/librt-0.7.8-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:907ad09cfab21e3c86e8f1f87858f7049d1097f77196959c033612f532b4e592", size = 168422, upload-time = "2026-01-14T12:55:10.499Z" }, + { url = "https://files.pythonhosted.org/packages/0f/84/e8d1bc86fa0159bfc24f3d798d92cafd3897e84c7fea7fe61b3220915d76/librt-0.7.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2991b6c3775383752b3ca0204842743256f3ad3deeb1d0adc227d56b78a9a850", size = 177478, upload-time = "2026-01-14T12:55:11.577Z" }, + { url = "https://files.pythonhosted.org/packages/57/11/d0268c4b94717a18aa91df1100e767b010f87b7ae444dafaa5a2d80f33a6/librt-0.7.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03679b9856932b8c8f674e87aa3c55ea11c9274301f76ae8dc4d281bda55cf62", size = 192439, upload-time = "2026-01-14T12:55:12.7Z" }, + { url = "https://files.pythonhosted.org/packages/8d/56/1e8e833b95fe684f80f8894ae4d8b7d36acc9203e60478fcae599120a975/librt-0.7.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3968762fec1b2ad34ce57458b6de25dbb4142713e9ca6279a0d352fa4e9f452b", size = 191483, upload-time = "2026-01-14T12:55:13.838Z" }, + { url = "https://files.pythonhosted.org/packages/17/48/f11cf28a2cb6c31f282009e2208312aa84a5ee2732859f7856ee306176d5/librt-0.7.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb7a7807523a31f03061288cc4ffc065d684c39db7644c676b47d89553c0d714", size = 185376, upload-time = "2026-01-14T12:55:15.017Z" }, + { url = "https://files.pythonhosted.org/packages/b8/6a/d7c116c6da561b9155b184354a60a3d5cdbf08fc7f3678d09c95679d13d9/librt-0.7.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad64a14b1e56e702e19b24aae108f18ad1bf7777f3af5fcd39f87d0c5a814449", size = 206234, upload-time = "2026-01-14T12:55:16.571Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fe/b1f9de2829cf7fc7649c1dcd202cfd873837c5cc2fc9e526b0e7f716c3d2/librt-0.7.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4c3995abbbb60b3c129490fa985dfe6cac11d88fc3c36eeb4fb1449efbbb04fc", size = 57500, upload-time = "2026-01-14T12:55:21.219Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d4/4a60fbe2e53b825f5d9a77325071d61cd8af8506255067bf0c8527530745/librt-0.7.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44e0c2cbc9bebd074cf2cdbe472ca185e824be4e74b1c63a8e934cea674bebf2", size = 59019, upload-time = "2026-01-14T12:55:22.256Z" }, + { url = "https://files.pythonhosted.org/packages/6a/37/61ff80341ba5159afa524445f2d984c30e2821f31f7c73cf166dcafa5564/librt-0.7.8-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d2f1e492cae964b3463a03dc77a7fe8742f7855d7258c7643f0ee32b6651dd3", size = 169015, upload-time = "2026-01-14T12:55:23.24Z" }, + { url = "https://files.pythonhosted.org/packages/1c/86/13d4f2d6a93f181ebf2fc953868826653ede494559da8268023fe567fca3/librt-0.7.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:451e7ffcef8f785831fdb791bd69211f47e95dc4c6ddff68e589058806f044c6", size = 178161, upload-time = "2026-01-14T12:55:24.826Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/e24ef01305954fc4d771f1f09f3dd682f9eb610e1bec188ffb719374d26e/librt-0.7.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3469e1af9f1380e093ae06bedcbdd11e407ac0b303a56bbe9afb1d6824d4982d", size = 193015, upload-time = "2026-01-14T12:55:26.04Z" }, + { url = "https://files.pythonhosted.org/packages/88/a0/92b6bd060e720d7a31ed474d046a69bd55334ec05e9c446d228c4b806ae3/librt-0.7.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f11b300027ce19a34f6d24ebb0a25fd0e24a9d53353225a5c1e6cadbf2916b2e", size = 192038, upload-time = "2026-01-14T12:55:27.208Z" }, + { url = "https://files.pythonhosted.org/packages/06/bb/6f4c650253704279c3a214dad188101d1b5ea23be0606628bc6739456624/librt-0.7.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4adc73614f0d3c97874f02f2c7fd2a27854e7e24ad532ea6b965459c5b757eca", size = 186006, upload-time = "2026-01-14T12:55:28.594Z" }, + { url = "https://files.pythonhosted.org/packages/dc/00/1c409618248d43240cadf45f3efb866837fa77e9a12a71481912135eb481/librt-0.7.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60c299e555f87e4c01b2eca085dfccda1dde87f5a604bb45c2906b8305819a93", size = 206888, upload-time = "2026-01-14T12:55:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/1a/73/fa8814c6ce2d49c3827829cadaa1589b0bf4391660bd4510899393a23ebc/librt-0.7.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:be927c3c94c74b05128089a955fba86501c3b544d1d300282cc1b4bd370cb418", size = 57049, upload-time = "2026-01-14T12:55:35.056Z" }, + { url = "https://files.pythonhosted.org/packages/53/fe/f6c70956da23ea235fd2e3cc16f4f0b4ebdfd72252b02d1164dd58b4e6c3/librt-0.7.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7b0803e9008c62a7ef79058233db7ff6f37a9933b8f2573c05b07ddafa226611", size = 58689, upload-time = "2026-01-14T12:55:36.078Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4d/7a2481444ac5fba63050d9abe823e6bc16896f575bfc9c1e5068d516cdce/librt-0.7.8-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:79feb4d00b2a4e0e05c9c56df707934f41fcb5fe53fd9efb7549068d0495b758", size = 166808, upload-time = "2026-01-14T12:55:37.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/3c/10901d9e18639f8953f57c8986796cfbf4c1c514844a41c9197cf87cb707/librt-0.7.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9122094e3f24aa759c38f46bd8863433820654927370250f460ae75488b66ea", size = 175614, upload-time = "2026-01-14T12:55:38.756Z" }, + { url = "https://files.pythonhosted.org/packages/db/01/5cbdde0951a5090a80e5ba44e6357d375048123c572a23eecfb9326993a7/librt-0.7.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e03bea66af33c95ce3addf87a9bf1fcad8d33e757bc479957ddbc0e4f7207ac", size = 189955, upload-time = "2026-01-14T12:55:39.939Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b4/e80528d2f4b7eaf1d437fcbd6fc6ba4cbeb3e2a0cb9ed5a79f47c7318706/librt-0.7.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1ade7f31675db00b514b98f9ab9a7698c7282dad4be7492589109471852d398", size = 189370, upload-time = "2026-01-14T12:55:41.057Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ab/938368f8ce31a9787ecd4becb1e795954782e4312095daf8fd22420227c8/librt-0.7.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a14229ac62adcf1b90a15992f1ab9c69ae8b99ffb23cb64a90878a6e8a2f5b81", size = 183224, upload-time = "2026-01-14T12:55:42.328Z" }, + { url = "https://files.pythonhosted.org/packages/3c/10/559c310e7a6e4014ac44867d359ef8238465fb499e7eb31b6bfe3e3f86f5/librt-0.7.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5bcaaf624fd24e6a0cb14beac37677f90793a96864c67c064a91458611446e83", size = 203541, upload-time = "2026-01-14T12:55:43.501Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9c/2481d80950b83085fb14ba3c595db56330d21bbc7d88a19f20165f3538db/librt-0.7.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ca916919793a77e4a98d4a1701e345d337ce53be4a16620f063191f7322ac80f", size = 59161, upload-time = "2026-01-14T12:55:48.45Z" }, + { url = "https://files.pythonhosted.org/packages/96/79/108df2cfc4e672336765d54e3ff887294c1cc36ea4335c73588875775527/librt-0.7.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:54feb7b4f2f6706bb82325e836a01be805770443e2400f706e824e91f6441dde", size = 61008, upload-time = "2026-01-14T12:55:49.527Z" }, + { url = "https://files.pythonhosted.org/packages/46/f2/30179898f9994a5637459d6e169b6abdc982012c0a4b2d4c26f50c06f911/librt-0.7.8-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39a4c76fee41007070f872b648cc2f711f9abf9a13d0c7162478043377b52c8e", size = 187199, upload-time = "2026-01-14T12:55:50.587Z" }, + { url = "https://files.pythonhosted.org/packages/b4/da/f7563db55cebdc884f518ba3791ad033becc25ff68eb70902b1747dc0d70/librt-0.7.8-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac9c8a458245c7de80bc1b9765b177055efff5803f08e548dd4bb9ab9a8d789b", size = 198317, upload-time = "2026-01-14T12:55:51.991Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6c/4289acf076ad371471fa86718c30ae353e690d3de6167f7db36f429272f1/librt-0.7.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b67aa7eff150f075fda09d11f6bfb26edffd300f6ab1666759547581e8f666", size = 210334, upload-time = "2026-01-14T12:55:53.682Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7f/377521ac25b78ac0a5ff44127a0360ee6d5ddd3ce7327949876a30533daa/librt-0.7.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:535929b6eff670c593c34ff435d5440c3096f20fa72d63444608a5aef64dd581", size = 211031, upload-time = "2026-01-14T12:55:54.827Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b1/e1e96c3e20b23d00cf90f4aad48f0deb4cdfec2f0ed8380d0d85acf98bbf/librt-0.7.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:63937bd0f4d1cb56653dc7ae900d6c52c41f0015e25aaf9902481ee79943b33a", size = 204581, upload-time = "2026-01-14T12:55:56.811Z" }, + { url = "https://files.pythonhosted.org/packages/43/71/0f5d010e92ed9747e14bef35e91b6580533510f1e36a8a09eb79ee70b2f0/librt-0.7.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf243da9e42d914036fd362ac3fa77d80a41cadcd11ad789b1b5eec4daaf67ca", size = 224731, upload-time = "2026-01-14T12:55:58.175Z" }, +] + +[[package]] +name = "llama-index-core" +version = "0.14.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +dependencies = [ + { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "aiosqlite", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "banks", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "dataclasses-json", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "dirtyjson", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "filetype", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-workflows", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "nest-asyncio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "networkx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "nltk", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "setuptools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sqlalchemy", extra = ["asyncio"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tenacity", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tiktoken", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tinytag", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-inspect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/cb/1d7383f9f4520bb1d921c34f18c147b4b270007135212cedfa240edcd4c3/llama_index_core-0.14.16.tar.gz", hash = "sha256:cf2b7e4b798cb5ebad19c935174c200595c7ecff84a83793540cc27b03636a52", size = 11599715, upload-time = "2026-03-10T19:19:52.476Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/8a/f8192a08237ef2fb1b19733f709db88a4c43bc8ab8357f01cb41a27e7f6a/lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388", size = 8590589, upload-time = "2025-09-22T04:00:10.51Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/27bcd07ae17ff5e5536e8d88f4c7d581b48963817a13de11f3ac3329bfa2/lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153", size = 4629671, upload-time = "2025-09-22T04:00:15.411Z" }, - { url = "https://files.pythonhosted.org/packages/02/5a/a7d53b3291c324e0b6e48f3c797be63836cc52156ddf8f33cd72aac78866/lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31", size = 4999961, upload-time = "2025-09-22T04:00:17.619Z" }, - { url = "https://files.pythonhosted.org/packages/f5/55/d465e9b89df1761674d8672bb3e4ae2c47033b01ec243964b6e334c6743f/lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9", size = 5157087, upload-time = "2025-09-22T04:00:19.868Z" }, - { url = "https://files.pythonhosted.org/packages/62/38/3073cd7e3e8dfc3ba3c3a139e33bee3a82de2bfb0925714351ad3d255c13/lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8", size = 5067620, upload-time = "2025-09-22T04:00:21.877Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d3/1e001588c5e2205637b08985597827d3827dbaaece16348c8822bfe61c29/lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba", size = 5406664, upload-time = "2025-09-22T04:00:23.714Z" }, - { url = "https://files.pythonhosted.org/packages/20/cf/cab09478699b003857ed6ebfe95e9fb9fa3d3c25f1353b905c9b73cfb624/lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c", size = 5289397, upload-time = "2025-09-22T04:00:25.544Z" }, - { url = "https://files.pythonhosted.org/packages/a3/84/02a2d0c38ac9a8b9f9e5e1bbd3f24b3f426044ad618b552e9549ee91bd63/lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c", size = 4772178, upload-time = "2025-09-22T04:00:27.602Z" }, - { url = "https://files.pythonhosted.org/packages/56/87/e1ceadcc031ec4aa605fe95476892d0b0ba3b7f8c7dcdf88fdeff59a9c86/lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321", size = 5358148, upload-time = "2025-09-22T04:00:29.323Z" }, - { url = "https://files.pythonhosted.org/packages/fe/13/5bb6cf42bb228353fd4ac5f162c6a84fd68a4d6f67c1031c8cf97e131fc6/lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1", size = 5112035, upload-time = "2025-09-22T04:00:31.061Z" }, - { url = "https://files.pythonhosted.org/packages/e4/e2/ea0498552102e59834e297c5c6dff8d8ded3db72ed5e8aad77871476f073/lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34", size = 4799111, upload-time = "2025-09-22T04:00:33.11Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9e/8de42b52a73abb8af86c66c969b3b4c2a96567b6ac74637c037d2e3baa60/lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a", size = 5351662, upload-time = "2025-09-22T04:00:35.237Z" }, - { url = "https://files.pythonhosted.org/packages/28/a2/de776a573dfb15114509a37351937c367530865edb10a90189d0b4b9b70a/lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c", size = 5314973, upload-time = "2025-09-22T04:00:37.086Z" }, - { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, - { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, - { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, - { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, - { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, - { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, - { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f5/a33839bae0bd07e4030969bdba1ac90665e359ae88c56c296991ae16b8a8/llama_index_core-0.14.16-py3-none-any.whl", hash = "sha256:0cc273ebc44d51ad636217661a25f9cd02fb2d0440641430f105da3ae9f43a6b", size = 11944927, upload-time = "2026-03-10T19:19:48.043Z" }, +] + +[[package]] +name = "llama-index-embeddings-huggingface" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sentence-transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/a0/77beca4ed28af68db6ab9c647b3fa75fae905d33ace96e91010cc9b96027/llama_index_embeddings_huggingface-0.6.1.tar.gz", hash = "sha256:3b21ffeda22f8221ed55778bb3daed71664ab07b341f1dd2f408963bd20355b9", size = 8694, upload-time = "2025-09-08T20:25:27.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/b0/4d327cb2f2e039606feb9345b4de975090b9659c4ee84b00443bb149a80d/llama_index_embeddings_huggingface-0.6.1-py3-none-any.whl", hash = "sha256:b63990cf71ee7a36c51f36657133fcf76130e9bf5dcf9eb5a73a5087106d6881", size = 8903, upload-time = "2025-09-08T20:25:27.038Z" }, +] + +[[package]] +name = "llama-index-embeddings-openai" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/a1/d238dfa453ba8ebc4f6261d6384b663f50b8dba6f4b22d8be800b305863d/llama_index_embeddings_openai-0.5.2.tar.gz", hash = "sha256:091bd0c3e9182748e8827de7d79713a219d5f5e0dc97d1bb7b271cf524520e4b", size = 7630, upload-time = "2026-03-03T11:27:38.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/5e/da156f9c77443d22287eeaea341fe35fdcc25e59a9250e4cb10d4d5a066a/llama_index_embeddings_openai-0.5.2-py3-none-any.whl", hash = "sha256:37e7967de05b05f16c9b171091110bb1c6e5a0720198ea306d57cd3920cb81b7", size = 7667, upload-time = "2026-03-03T11:27:37.394Z" }, +] + +[[package]] +name = "llama-index-instrumentation" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/b9/a7a74de6d8aacf4be329329495983d78d96b1a6e69b6d9fcf4a233febd4b/llama_index_instrumentation-0.4.2.tar.gz", hash = "sha256:dc4957b64da0922060690e85a6be9698ac08e34e0f69e90b01364ddec4f3de7f", size = 46146, upload-time = "2025-10-13T20:44:48.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/54/df8063b0441242e250e03d1e31ebde5dffbe24e1af32b025cb1a4544150c/llama_index_instrumentation-0.4.2-py3-none-any.whl", hash = "sha256:b4989500e6454059ab3f3c4a193575d47ab1fadb730c2e8f2b962649ae88b70b", size = 15411, upload-time = "2025-10-13T20:44:47.685Z" }, +] + +[[package]] +name = "llama-index-llms-ollama" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/42/866e43f86ebe6c8ae0c3a2a473642f1438d0f7e006188a998c3ef4e5e357/llama_index_llms_ollama-0.9.1.tar.gz", hash = "sha256:d5885ed65ae2e2bc74ba9e3ffd3a5bcd7c5341ef0670e3d9fe200880fc19f9a6", size = 9077, upload-time = "2025-12-19T03:24:46.466Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/cd/aa2499dc38c1cc513cab56f9a74e5526d1a97717f35a62295fda0d363bf6/llama_index_llms_ollama-0.9.1-py3-none-any.whl", hash = "sha256:da6469be951605841f7e33ce1bbb5b72c65de0f084b250e7f78aacac84379d5f", size = 8721, upload-time = "2025-12-19T03:24:47.438Z" }, +] + +[[package]] +name = "llama-index-llms-openai" +version = "0.6.26" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/5e/a7a47d46dc2eb30953d83654112c8af6f61821ca78ef3ea22e30729aac3a/llama_index_llms_openai-0.6.26.tar.gz", hash = "sha256:3474602ecbc30c88a8b585cfd5737891d45da78251a5e067c4dbc2d3cc3d08db", size = 27262, upload-time = "2026-03-05T02:53:50.581Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/8a/f46f59279c078b001374813f69987b43b7c3bd9df01981af545cf2d954d7/llama_index_llms_openai-0.6.26-py3-none-any.whl", hash = "sha256:2062ef505676d0a1c7c116c138c2f890aa7653619fc3ca697e47df7bd2ef8b3f", size = 28330, upload-time = "2026-03-05T02:53:40.421Z" }, +] + +[[package]] +name = "llama-index-vector-stores-faiss" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/e6/57da31b38d173cd9124fdcdd47487b9a917b69bd49e8f6e551407ccfa860/llama_index_vector_stores_faiss-0.5.3.tar.gz", hash = "sha256:9620b1e27e96233fda88878c453532fba6061cf7ba7a53698a34703faab21ece", size = 6048, upload-time = "2026-02-12T14:22:14.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/ad/ad192dd624ca2875b8ca74e55fddf9b083d6614524004f7830379d0a0cfd/llama_index_vector_stores_faiss-0.5.3-py3-none-any.whl", hash = "sha256:ef186e38a820e696a1adca15432c8539d73f2959eb05671011db21091a286c8c", size = 7738, upload-time = "2026-02-12T14:22:13.756Z" }, +] + +[[package]] +name = "llama-index-workflows" +version = "2.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llama-index-instrumentation", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/7b/00c35d14dc4a7dc64c63dad8b1532f55cd5b5f8856c34f5bf587693ac270/llama_index_workflows-2.13.1.tar.gz", hash = "sha256:55cd3cff9c92a37272ab8651ad750288abc339165b009066f130cb0c5c65994b", size = 84279, upload-time = "2026-01-25T14:51:50.493Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/8d/ba97cda62829b60658a86d4c012d59e3b13c99d9b336fcf0e507d03812df/llama_index_workflows-2.13.1-py3-none-any.whl", hash = "sha256:e779078817d413b29a5297521fb71694a80e502f18dfd41e8b342f83e45f2c19", size = 107344, upload-time = "2026-01-25T14:51:49.297Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, + { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, + { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, + { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, + { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, @@ -1620,11 +2356,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/e7/9c/780c9a8fce3f04690b374f72f41306866b0400b9d0fdf3e17aaa37887eed/lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6", size = 3939264, upload-time = "2025-09-22T04:04:32.892Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5a/1ab260c00adf645d8bf7dec7f920f744b032f69130c681302821d5debea6/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba", size = 4216435, upload-time = "2025-09-22T04:04:34.907Z" }, - { url = "https://files.pythonhosted.org/packages/f2/37/565f3b3d7ffede22874b6d86be1a1763d00f4ea9fc5b9b6ccb11e4ec8612/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5", size = 4325913, upload-time = "2025-09-22T04:04:37.205Z" }, - { url = "https://files.pythonhosted.org/packages/22/ec/f3a1b169b2fb9d03467e2e3c0c752ea30e993be440a068b125fc7dd248b0/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4", size = 4269357, upload-time = "2025-09-22T04:04:39.322Z" }, - { url = "https://files.pythonhosted.org/packages/77/a2/585a28fe3e67daa1cf2f06f34490d556d121c25d500b10082a7db96e3bcd/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d", size = 4412295, upload-time = "2025-09-22T04:04:41.647Z" }, { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, @@ -1643,11 +2374,11 @@ wheels = [ [[package]] name = "markdown" -version = "3.9" +version = "3.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/37/02347f6d6d8279247a5837082ebc26fc0d5aaeaf75aa013fcbb433c777ab/markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a", size = 364585, upload-time = "2025-09-04T20:25:22.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/b1/af95bcae8549f1f3fd70faacb29075826a0d689a27f232e8cee315efa053/markdown-3.10.1.tar.gz", hash = "sha256:1c19c10bd5c14ac948c53d0d762a04e2fa35a6d58a6b7b1e6bfcbe6fefc0001a", size = 365402, upload-time = "2026-01-21T18:09:28.206Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/ae/44c4a6a4cbb496d93c6257954260fe3a6e91b7bed2240e5dad2a717f5111/markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280", size = 107441, upload-time = "2025-09-04T20:25:21.784Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/6ef961f543593969d25b2afe57a3564200280528caa9bd1082eecdd7b3bc/markdown-3.10.1-py3-none-any.whl", hash = "sha256:867d788939fe33e4b736426f5b9f651ad0c0ae0ecf89df0ca5d1176c70812fe3", size = 107684, upload-time = "2026-01-21T18:09:27.203Z" }, ] [[package]] @@ -1668,14 +2399,6 @@ version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, @@ -1727,181 +2450,219 @@ wheels = [ ] [[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, -] - -[[package]] -name = "mergedeep" -version = "1.3.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, -] - -[[package]] -name = "mkdocs" -version = "1.6.1" +name = "marshmallow" +version = "3.26.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "ghp-import", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "markupsafe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mergedeep", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs-get-deps", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pyyaml-env-tag", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "watchdog", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095, upload-time = "2025-12-22T06:53:53.309Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, ] [[package]] -name = "mkdocs-get-deps" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mergedeep", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" }, -] - -[[package]] -name = "mkdocs-glightbox" -version = "0.5.1" +name = "mdurl" +version = "0.1.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "selectolax", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/72/c03e9d8d2dbe098d7ce5d51309933a1d3aea268965ed097ab16f4b54de15/mkdocs_glightbox-0.5.1.tar.gz", hash = "sha256:7d78a5b045f2479f61b0bbb17742ba701755c56b013e70ac189c9d87a91e80bf", size = 480028, upload-time = "2025-09-04T13:10:29.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/cf/e9a0ce9da269746906fdc595c030f6df66793dad1487abd1699af2ba44f1/mkdocs_glightbox-0.5.1-py3-none-any.whl", hash = "sha256:f47af0daff164edf8d36e553338425be3aab6e34b987d9cbbc2ae7819a98cb01", size = 26431, upload-time = "2025-09-04T13:10:27.933Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] -name = "mkdocs-material" -version = "9.6.22" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "backrefs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "colorama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs-material-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "paginate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5f/5d/317e37b6c43325cb376a1d6439df9cc743b8ee41c84603c2faf7286afc82/mkdocs_material-9.6.22.tar.gz", hash = "sha256:87c158b0642e1ada6da0cbd798a3389b0bc5516b90e5ece4a0fb939f00bacd1c", size = 4044968, upload-time = "2025-10-15T09:21:15.409Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/82/6fdb9a7a04fb222f4849ffec1006f891a0280825a20314d11f3ccdee14eb/mkdocs_material-9.6.22-py3-none-any.whl", hash = "sha256:14ac5f72d38898b2f98ac75a5531aaca9366eaa427b0f49fc2ecf04d99b7ad84", size = 9206252, upload-time = "2025-10-15T09:21:12.175Z" }, -] +name = "microsoft-python-type-stubs" +version = "0" +source = { git = "https://github.com/microsoft/python-type-stubs.git#692c37c3969d22612b295ddf7e7af5907204a386" } [[package]] -name = "mkdocs-material-extensions" -version = "1.3.1" +name = "mpmath" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] [[package]] name = "msgpack" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555, upload-time = "2025-06-13T06:52:51.324Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/52/f30da112c1dc92cf64f57d08a273ac771e7b29dea10b4b30369b2d7e8546/msgpack-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed", size = 81799, upload-time = "2025-06-13T06:51:37.228Z" }, - { url = "https://files.pythonhosted.org/packages/e4/35/7bfc0def2f04ab4145f7f108e3563f9b4abae4ab0ed78a61f350518cc4d2/msgpack-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8", size = 78278, upload-time = "2025-06-13T06:51:38.534Z" }, - { url = "https://files.pythonhosted.org/packages/e8/c5/df5d6c1c39856bc55f800bf82778fd4c11370667f9b9e9d51b2f5da88f20/msgpack-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2", size = 402805, upload-time = "2025-06-13T06:51:39.538Z" }, - { url = "https://files.pythonhosted.org/packages/20/8e/0bb8c977efecfe6ea7116e2ed73a78a8d32a947f94d272586cf02a9757db/msgpack-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4", size = 408642, upload-time = "2025-06-13T06:51:41.092Z" }, - { url = "https://files.pythonhosted.org/packages/59/a1/731d52c1aeec52006be6d1f8027c49fdc2cfc3ab7cbe7c28335b2910d7b6/msgpack-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0", size = 395143, upload-time = "2025-06-13T06:51:42.575Z" }, - { url = "https://files.pythonhosted.org/packages/2b/92/b42911c52cda2ba67a6418ffa7d08969edf2e760b09015593c8a8a27a97d/msgpack-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26", size = 395986, upload-time = "2025-06-13T06:51:43.807Z" }, - { url = "https://files.pythonhosted.org/packages/61/dc/8ae165337e70118d4dab651b8b562dd5066dd1e6dd57b038f32ebc3e2f07/msgpack-1.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75", size = 402682, upload-time = "2025-06-13T06:51:45.534Z" }, - { url = "https://files.pythonhosted.org/packages/58/27/555851cb98dcbd6ce041df1eacb25ac30646575e9cd125681aa2f4b1b6f1/msgpack-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338", size = 406368, upload-time = "2025-06-13T06:51:46.97Z" }, - { url = "https://files.pythonhosted.org/packages/7f/83/97f24bf9848af23fe2ba04380388216defc49a8af6da0c28cc636d722502/msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558", size = 82728, upload-time = "2025-06-13T06:51:50.68Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7f/2eaa388267a78401f6e182662b08a588ef4f3de6f0eab1ec09736a7aaa2b/msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d", size = 79279, upload-time = "2025-06-13T06:51:51.72Z" }, - { url = "https://files.pythonhosted.org/packages/f8/46/31eb60f4452c96161e4dfd26dbca562b4ec68c72e4ad07d9566d7ea35e8a/msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0", size = 423859, upload-time = "2025-06-13T06:51:52.749Z" }, - { url = "https://files.pythonhosted.org/packages/45/16/a20fa8c32825cc7ae8457fab45670c7a8996d7746ce80ce41cc51e3b2bd7/msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f", size = 429975, upload-time = "2025-06-13T06:51:53.97Z" }, - { url = "https://files.pythonhosted.org/packages/86/ea/6c958e07692367feeb1a1594d35e22b62f7f476f3c568b002a5ea09d443d/msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704", size = 413528, upload-time = "2025-06-13T06:51:55.507Z" }, - { url = "https://files.pythonhosted.org/packages/75/05/ac84063c5dae79722bda9f68b878dc31fc3059adb8633c79f1e82c2cd946/msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2", size = 413338, upload-time = "2025-06-13T06:51:57.023Z" }, - { url = "https://files.pythonhosted.org/packages/69/e8/fe86b082c781d3e1c09ca0f4dacd457ede60a13119b6ce939efe2ea77b76/msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2", size = 422658, upload-time = "2025-06-13T06:51:58.419Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2b/bafc9924df52d8f3bb7c00d24e57be477f4d0f967c0a31ef5e2225e035c7/msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752", size = 427124, upload-time = "2025-06-13T06:51:59.969Z" }, - { url = "https://files.pythonhosted.org/packages/e3/26/389b9c593eda2b8551b2e7126ad3a06af6f9b44274eb3a4f054d48ff7e47/msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238", size = 82359, upload-time = "2025-06-13T06:52:03.909Z" }, - { url = "https://files.pythonhosted.org/packages/ab/65/7d1de38c8a22cf8b1551469159d4b6cf49be2126adc2482de50976084d78/msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157", size = 79172, upload-time = "2025-06-13T06:52:05.246Z" }, - { url = "https://files.pythonhosted.org/packages/0f/bd/cacf208b64d9577a62c74b677e1ada005caa9b69a05a599889d6fc2ab20a/msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce", size = 425013, upload-time = "2025-06-13T06:52:06.341Z" }, - { url = "https://files.pythonhosted.org/packages/4d/ec/fd869e2567cc9c01278a736cfd1697941ba0d4b81a43e0aa2e8d71dab208/msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a", size = 426905, upload-time = "2025-06-13T06:52:07.501Z" }, - { url = "https://files.pythonhosted.org/packages/55/2a/35860f33229075bce803a5593d046d8b489d7ba2fc85701e714fc1aaf898/msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c", size = 407336, upload-time = "2025-06-13T06:52:09.047Z" }, - { url = "https://files.pythonhosted.org/packages/8c/16/69ed8f3ada150bf92745fb4921bd621fd2cdf5a42e25eb50bcc57a5328f0/msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b", size = 409485, upload-time = "2025-06-13T06:52:10.382Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b6/0c398039e4c6d0b2e37c61d7e0e9d13439f91f780686deb8ee64ecf1ae71/msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef", size = 412182, upload-time = "2025-06-13T06:52:11.644Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d0/0cf4a6ecb9bc960d624c93effaeaae75cbf00b3bc4a54f35c8507273cda1/msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a", size = 419883, upload-time = "2025-06-13T06:52:12.806Z" }, - { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677, upload-time = "2025-06-13T06:52:16.64Z" }, - { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603, upload-time = "2025-06-13T06:52:17.843Z" }, - { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504, upload-time = "2025-06-13T06:52:18.982Z" }, - { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749, upload-time = "2025-06-13T06:52:20.211Z" }, - { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458, upload-time = "2025-06-13T06:52:21.429Z" }, - { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976, upload-time = "2025-06-13T06:52:22.995Z" }, - { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607, upload-time = "2025-06-13T06:52:24.152Z" }, - { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172, upload-time = "2025-06-13T06:52:25.704Z" }, +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] [[package]] name = "mypy" -version = "1.18.2" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "librt", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux')" }, { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/6f/657961a0743cff32e6c0611b63ff1c1970a0b482ace35b069203bf705187/mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c", size = 12807973, upload-time = "2025-09-19T00:10:35.282Z" }, - { url = "https://files.pythonhosted.org/packages/10/e9/420822d4f661f13ca8900f5fa239b40ee3be8b62b32f3357df9a3045a08b/mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e", size = 11896527, upload-time = "2025-09-19T00:10:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/aa/73/a05b2bbaa7005f4642fcfe40fb73f2b4fb6bb44229bd585b5878e9a87ef8/mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b", size = 12507004, upload-time = "2025-09-19T00:11:05.411Z" }, - { url = "https://files.pythonhosted.org/packages/4f/01/f6e4b9f0d031c11ccbd6f17da26564f3a0f3c4155af344006434b0a05a9d/mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66", size = 13245947, upload-time = "2025-09-19T00:10:46.923Z" }, - { url = "https://files.pythonhosted.org/packages/d7/97/19727e7499bfa1ae0773d06afd30ac66a58ed7437d940c70548634b24185/mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428", size = 13499217, upload-time = "2025-09-19T00:09:39.472Z" }, - { url = "https://files.pythonhosted.org/packages/88/87/cafd3ae563f88f94eec33f35ff722d043e09832ea8530ef149ec1efbaf08/mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f", size = 12731198, upload-time = "2025-09-19T00:09:44.857Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e0/1e96c3d4266a06d4b0197ace5356d67d937d8358e2ee3ffac71faa843724/mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341", size = 11817879, upload-time = "2025-09-19T00:09:47.131Z" }, - { url = "https://files.pythonhosted.org/packages/72/ef/0c9ba89eb03453e76bdac5a78b08260a848c7bfc5d6603634774d9cd9525/mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d", size = 12427292, upload-time = "2025-09-19T00:10:22.472Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/ec4a061dd599eb8179d5411d99775bec2a20542505988f40fc2fee781068/mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86", size = 13163750, upload-time = "2025-09-19T00:09:51.472Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5f/2cf2ceb3b36372d51568f2208c021870fe7834cf3186b653ac6446511839/mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37", size = 13351827, upload-time = "2025-09-19T00:09:58.311Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, - { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, - { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, - { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, - { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, - { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, - { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, - { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, - { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, - { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, + { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, + { url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, + { url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, + { url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, + { url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, + { url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, +] + +[[package]] +name = "mypy-baseline" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/2a/03288dab6d5f24d187ba0c223f6b3035d9a29de3dd31a3e105a0d4f1b5da/mypy_baseline-0.7.3.tar.gz", hash = "sha256:325f0695310eb8f5c0f10fa7af36ee1b3785a9d26b886a61c07b4a8eddb28d29", size = 319108, upload-time = "2025-05-30T08:43:00.629Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/93/7780302b206a8e8e767ce763ef06159725d1323acbe55e46a1cd1ffd109d/mypy_baseline-0.7.3-py3-none-any.whl", hash = "sha256:bd7fa899e687d75af2e3f392a9d6d1790e65dae3d31fe12525cc14f26d866b74", size = 17868, upload-time = "2025-05-30T08:42:58.262Z" }, ] [[package]] @@ -1915,155 +2676,101 @@ wheels = [ [[package]] name = "mysqlclient" -version = "2.2.7" +version = "2.2.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz", hash = "sha256:24ae22b59416d5fcce7e99c9d37548350b4565baac82f95e149cac6ce4163845", size = 91383, upload-time = "2025-01-10T12:06:00.763Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/b0/9df076488cb2e536d40ce6dbd4273c1f20a386e31ffe6e7cb613902b3c2a/mysqlclient-2.2.8.tar.gz", hash = "sha256:8ed20c5615a915da451bb308c7d0306648a4fd9a2809ba95c992690006306199", size = 92287, upload-time = "2026-02-10T10:58:37.405Z" } [[package]] -name = "nltk" -version = "3.9.2" +name = "nest-asyncio" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "joblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f9/76/3a5e4312c19a028770f86fd7c058cf9f4ec4321c6cf7526bab998a5b683c/nltk-3.9.2.tar.gz", hash = "sha256:0f409e9b069ca4177c1903c3e843eef90c7e92992fa4931ae607da6de49e1419", size = 2887629, upload-time = "2025-10-01T07:19:23.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] [[package]] -name = "nodeenv" -version = "1.9.1" +name = "networkx" +version = "3.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] [[package]] -name = "numpy" -version = "2.2.6" +name = "nltk" +version = "3.9.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", -] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, +dependencies = [ + { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "joblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/8f/915e1c12df07c70ed779d18ab83d065718a926e70d3ea33eb0cd66ffb7c0/nltk-3.9.3.tar.gz", hash = "sha256:cb5945d6424a98d694c2b9a0264519fab4363711065a46aa0ae7a2195b92e71f", size = 2923673, upload-time = "2026-02-24T12:05:53.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/7e/9af5a710a1236e4772de8dfcc6af942a561327bb9f42b5b4a24d0cf100fd/nltk-3.9.3-py3-none-any.whl", hash = "sha256:60b3db6e9995b3dd976b1f0fa7dec22069b2677e759c28eb69b62ddd44870522", size = 1525385, upload-time = "2026-02-24T12:05:46.54Z" }, ] [[package]] name = "numpy" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", -] -sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/45/e80d203ef6b267aa29b22714fb558930b27960a0c5ce3c19c999232bb3eb/numpy-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ffc4f5caba7dfcbe944ed674b7eef683c7e94874046454bb79ed7ee0236f59d", size = 21259253, upload-time = "2025-09-09T15:56:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/52/18/cf2c648fccf339e59302e00e5f2bc87725a3ce1992f30f3f78c9044d7c43/numpy-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7e946c7170858a0295f79a60214424caac2ffdb0063d4d79cb681f9aa0aa569", size = 14450980, upload-time = "2025-09-09T15:56:05.926Z" }, - { url = "https://files.pythonhosted.org/packages/93/fb/9af1082bec870188c42a1c239839915b74a5099c392389ff04215dcee812/numpy-2.3.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:cd4260f64bc794c3390a63bf0728220dd1a68170c169088a1e0dfa2fde1be12f", size = 5379709, upload-time = "2025-09-09T15:56:07.95Z" }, - { url = "https://files.pythonhosted.org/packages/75/0f/bfd7abca52bcbf9a4a65abc83fe18ef01ccdeb37bfb28bbd6ad613447c79/numpy-2.3.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f0ddb4b96a87b6728df9362135e764eac3cfa674499943ebc44ce96c478ab125", size = 6913923, upload-time = "2025-09-09T15:56:09.443Z" }, - { url = "https://files.pythonhosted.org/packages/79/55/d69adad255e87ab7afda1caf93ca997859092afeb697703e2f010f7c2e55/numpy-2.3.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afd07d377f478344ec6ca2b8d4ca08ae8bd44706763d1efb56397de606393f48", size = 14589591, upload-time = "2025-09-09T15:56:11.234Z" }, - { url = "https://files.pythonhosted.org/packages/10/a2/010b0e27ddeacab7839957d7a8f00e91206e0c2c47abbb5f35a2630e5387/numpy-2.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc92a5dedcc53857249ca51ef29f5e5f2f8c513e22cfb90faeb20343b8c6f7a6", size = 16938714, upload-time = "2025-09-09T15:56:14.637Z" }, - { url = "https://files.pythonhosted.org/packages/1c/6b/12ce8ede632c7126eb2762b9e15e18e204b81725b81f35176eac14dc5b82/numpy-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7af05ed4dc19f308e1d9fc759f36f21921eb7bbfc82843eeec6b2a2863a0aefa", size = 16370592, upload-time = "2025-09-09T15:56:17.285Z" }, - { url = "https://files.pythonhosted.org/packages/b4/35/aba8568b2593067bb6a8fe4c52babb23b4c3b9c80e1b49dff03a09925e4a/numpy-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:433bf137e338677cebdd5beac0199ac84712ad9d630b74eceeb759eaa45ddf30", size = 18884474, upload-time = "2025-09-09T15:56:20.943Z" }, - { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload-time = "2025-09-09T15:56:29.966Z" }, - { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload-time = "2025-09-09T15:56:32.175Z" }, - { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload-time = "2025-09-09T15:56:34.175Z" }, - { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload-time = "2025-09-09T15:56:36.149Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload-time = "2025-09-09T15:56:40.548Z" }, - { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload-time = "2025-09-09T15:56:43.343Z" }, - { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload-time = "2025-09-09T15:56:46.141Z" }, - { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload-time = "2025-09-09T15:56:49.844Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload-time = "2025-09-09T15:56:59.087Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload-time = "2025-09-09T15:57:01.73Z" }, - { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload-time = "2025-09-09T15:57:03.765Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload-time = "2025-09-09T15:57:07.921Z" }, - { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload-time = "2025-09-09T15:57:11.349Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload-time = "2025-09-09T15:57:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload-time = "2025-09-09T15:57:16.534Z" }, - { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload-time = "2025-09-09T15:57:18.883Z" }, - { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload-time = "2025-09-09T15:57:27.257Z" }, - { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload-time = "2025-09-09T15:57:30.077Z" }, - { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload-time = "2025-09-09T15:57:32.733Z" }, - { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload-time = "2025-09-09T15:57:34.328Z" }, - { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload-time = "2025-09-09T15:57:36.255Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload-time = "2025-09-09T15:57:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload-time = "2025-09-09T15:57:41.16Z" }, - { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload-time = "2025-09-09T15:57:43.459Z" }, - { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" }, - { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" }, - { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" }, - { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" }, - { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" }, - { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" }, - { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" }, - { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" }, - { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" }, - { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f2/7e0a37cfced2644c9563c529f29fa28acbd0960dde32ece683aafa6f4949/numpy-2.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1e02c7159791cd481e1e6d5ddd766b62a4d5acf8df4d4d1afe35ee9c5c33a41e", size = 21131019, upload-time = "2025-09-09T15:58:42.838Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/3291f505297ed63831135a6cc0f474da0c868a1f31b0dd9a9f03a7a0d2ed/numpy-2.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:dca2d0fc80b3893ae72197b39f69d55a3cd8b17ea1b50aa4c62de82419936150", size = 14376288, upload-time = "2025-09-09T15:58:45.425Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4b/ae02e985bdeee73d7b5abdefeb98aef1207e96d4c0621ee0cf228ddfac3c/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:99683cbe0658f8271b333a1b1b4bb3173750ad59c0c61f5bbdc5b318918fffe3", size = 5305425, upload-time = "2025-09-09T15:58:48.6Z" }, - { url = "https://files.pythonhosted.org/packages/8b/eb/9df215d6d7250db32007941500dc51c48190be25f2401d5b2b564e467247/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d9d537a39cc9de668e5cd0e25affb17aec17b577c6b3ae8a3d866b479fbe88d0", size = 6819053, upload-time = "2025-09-09T15:58:50.401Z" }, - { url = "https://files.pythonhosted.org/packages/57/62/208293d7d6b2a8998a4a1f23ac758648c3c32182d4ce4346062018362e29/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8596ba2f8af5f93b01d97563832686d20206d303024777f6dfc2e7c7c3f1850e", size = 14420354, upload-time = "2025-09-09T15:58:52.704Z" }, - { url = "https://files.pythonhosted.org/packages/ed/0c/8e86e0ff7072e14a71b4c6af63175e40d1e7e933ce9b9e9f765a95b4e0c3/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1ec5615b05369925bd1125f27df33f3b6c8bc10d788d5999ecd8769a1fa04db", size = 16760413, upload-time = "2025-09-09T15:58:55.027Z" }, +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, + { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, + { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, + { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, + { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, + { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, + { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, + { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, + { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, ] [[package]] @@ -2077,10 +2784,11 @@ wheels = [ [[package]] name = "ocrmypdf" -version = "16.11.0" +version = "17.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "fpdf2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "img2pdf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pdfminer-six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2088,36 +2796,63 @@ dependencies = [ { name = "pikepdf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pluggy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pypdfium2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "uharfbuzz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/af/947d6abb0cb41f99971a7a4bd33684d3cee20c9e32c8f9dc90e8c5dcf21c/ocrmypdf-16.11.0.tar.gz", hash = "sha256:d89077e503238dac35c6e565925edc8d98b71e5289853c02cacbc1d0901f1be7", size = 7015068, upload-time = "2025-09-12T08:36:53.507Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/fe/60bdc79529be1ad8b151d426ed2020d5ac90328c54e9ba92bd808e1535c1/ocrmypdf-17.3.0.tar.gz", hash = "sha256:4022f13aad3f405e330056a07aa8bd63714b48b414693831b56e2cf2c325f52d", size = 7378015, upload-time = "2026-02-21T09:30:07.207Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/b2/eda3bb0939bf81d889812dd82cf37fa6f8769af8e31008bd586ba12fae09/ocrmypdf-16.11.0-py3-none-any.whl", hash = "sha256:13628294a309c85b21947b5c7bc7fcd202464517c14b71a050adc9dde85c48f7", size = 162883, upload-time = "2025-09-12T08:36:51.611Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b1/b7ae057a1bcb1495067ee3c4d48c1ce5fc66addd9492307c5a0ff799a7f2/ocrmypdf-17.3.0-py3-none-any.whl", hash = "sha256:c8882e7864954d3db6bcee49cc9f261b65bff66b7e5925eb68a1c281f41cad23", size = 488130, upload-time = "2026-02-21T09:30:05.236Z" }, ] [[package]] -name = "packaging" -version = "25.0" +name = "ollama" +version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +dependencies = [ + { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/5a/652dac4b7affc2b37b95386f8ae78f22808af09d720689e3d7a86b6ed98e/ollama-0.6.1.tar.gz", hash = "sha256:478c67546836430034b415ed64fa890fd3d1ff91781a9d548b3325274e69d7c6", size = 51620, upload-time = "2025-11-13T23:02:17.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/4f/4a617ee93d8208d2bcf26b2d8b9402ceaed03e3853c754940e2290fed063/ollama-0.6.1-py3-none-any.whl", hash = "sha256:fc4c984b345735c5486faeee67d8a265214a31cbb828167782dc642ce0a2bf8c", size = 14354, upload-time = "2025-11-13T23:02:16.292Z" }, +] + +[[package]] +name = "openai" +version = "2.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "distro", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jiter", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sniffio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/91/2a06c4e9597c338cac1e5e5a8dd6f29e1836fc229c4c523529dca387fda8/openai-2.26.0.tar.gz", hash = "sha256:b41f37c140ae0034a6e92b0c509376d907f3a66109935fba2c1b471a7c05a8fb", size = 666702, upload-time = "2026-03-05T23:17:35.874Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2e/3f73e8ca53718952222cacd0cf7eecc9db439d020f0c1fe7ae717e4e199a/openai-2.26.0-py3-none-any.whl", hash = "sha256:6151bf8f83802f036117f06cc8a57b3a4da60da9926826cc96747888b57f394f", size = 1136409, upload-time = "2026-03-05T23:17:34.072Z" }, ] [[package]] -name = "paginate" -version = "0.5.7" +name = "packaging" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "paperless-ngx" -version = "2.19.3" +version = "2.20.11" source = { virtual = "." } dependencies = [ + { name = "azure-ai-documentintelligence", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "bleach", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "celery", extra = ["redis"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2136,6 +2871,7 @@ dependencies = [ { name = "django-filter", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django-guardian", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django-multiselectfield", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "django-rich", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django-soft-delete", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "django-treenode", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "djangorestframework", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2143,16 +2879,24 @@ dependencies = [ { name = "drf-spectacular", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "drf-spectacular-sidecar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "drf-writable-nested", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "faiss-cpu", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "flower", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "gotenberg-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "httpx-oauth", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "ijson", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "imap-tools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "inotifyrecursive", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "langdetect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-embeddings-huggingface", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-embeddings-openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-llms-ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-llms-openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "llama-index-vector-stores-faiss", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "nltk", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "ocrmypdf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pathvalidate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pdf2image", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2160,19 +2904,19 @@ dependencies = [ { name = "python-gnupg", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "python-ipware", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "python-magic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pyzbar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "rapidfuzz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "redis", extra = ["hiredis"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "scikit-learn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sentence-transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "setproctitle", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "tika-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "watchdog", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "torch", version = "2.10.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, + { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux'" }, + { name = "watchfiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "whitenoise", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "whoosh-reloaded", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "zxing-cpp", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or sys_platform == 'darwin'" }, - { name = "zxing-cpp", version = "2.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "zxing-cpp", version = "2.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "zxing-cpp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [package.optional-dependencies] @@ -2181,9 +2925,9 @@ mariadb = [ ] postgres = [ { name = "psycopg", extra = ["c", "pool"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "psycopg-c", version = "3.2.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or sys_platform == 'darwin'" }, - { name = "psycopg-c", version = "3.2.9", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "psycopg-c", version = "3.2.9", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "psycopg-c", version = "3.3.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or sys_platform == 'darwin'" }, + { name = "psycopg-c", version = "3.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "psycopg-c", version = "3.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl" }, marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "psycopg-pool", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] webserver = [ @@ -2194,11 +2938,9 @@ webserver = [ dev = [ { name = "daphne", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "factory-boy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "faker", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "imagehash", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs-glightbox", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs-material", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pre-commit", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pre-commit-uv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "prek", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-cov", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-django", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2209,19 +2951,19 @@ dev = [ { name = "pytest-sugar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-xdist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] docs = [ - { name = "mkdocs-glightbox", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "mkdocs-material", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] lint = [ - { name = "pre-commit", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pre-commit-uv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "prek", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] testing = [ { name = "daphne", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "factory-boy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "faker", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "imagehash", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest-cov", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2239,8 +2981,12 @@ typing = [ { name = "django-stubs", extra = ["compatible-mypy"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "djangorestframework-stubs", extra = ["compatible-mypy"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "lxml-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "microsoft-python-type-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "mypy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mypy-baseline", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyrefly", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-bleach", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-channels", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-colorama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-dateparser", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2249,73 +2995,81 @@ typing = [ { name = "types-pytz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-redis", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "types-setuptools", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "types-tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [package.metadata] requires-dist = [ + { name = "azure-ai-documentintelligence", specifier = ">=1.0.2" }, { name = "babel", specifier = ">=2.17" }, - { name = "bleach", specifier = "~=6.2.0" }, - { name = "celery", extras = ["redis"], specifier = "~=5.5.1" }, + { name = "bleach", specifier = "~=6.3.0" }, + { name = "celery", extras = ["redis"], specifier = "~=5.6.2" }, { name = "channels", specifier = "~=4.2" }, { name = "channels-redis", specifier = "~=4.2" }, { name = "concurrent-log-handler", specifier = "~=0.9.25" }, { name = "dateparser", specifier = "~=1.2" }, - { name = "django", specifier = "~=5.2.5" }, - { name = "django-allauth", extras = ["mfa", "socialaccount"], specifier = "~=65.4.0" }, - { name = "django-auditlog", specifier = "~=3.2.1" }, - { name = "django-cachalot", specifier = "~=2.8.0" }, + { name = "django", specifier = "~=5.2.10" }, + { name = "django-allauth", extras = ["mfa", "socialaccount"], specifier = "~=65.15.0" }, + { name = "django-auditlog", specifier = "~=3.4.1" }, + { name = "django-cachalot", specifier = "~=2.9.0" }, { name = "django-celery-results", specifier = "~=2.6.0" }, { name = "django-compression-middleware", specifier = "~=0.5.0" }, { name = "django-cors-headers", specifier = "~=4.9.0" }, { name = "django-extensions", specifier = "~=4.1" }, { name = "django-filter", specifier = "~=25.1" }, - { name = "django-guardian", specifier = "~=3.2.0" }, + { name = "django-guardian", specifier = "~=3.3.0" }, { name = "django-multiselectfield", specifier = "~=1.0.1" }, + { name = "django-rich", specifier = "~=2.2.0" }, { name = "django-soft-delete", specifier = "~=1.0.18" }, { name = "django-treenode", specifier = ">=0.23.2" }, { name = "djangorestframework", specifier = "~=3.16" }, { name = "djangorestframework-guardian", specifier = "~=0.4.0" }, { name = "drf-spectacular", specifier = "~=0.28" }, - { name = "drf-spectacular-sidecar", specifier = "~=2025.9.1" }, + { name = "drf-spectacular-sidecar", specifier = "~=2026.3.1" }, { name = "drf-writable-nested", specifier = "~=0.7.1" }, - { name = "filelock", specifier = "~=3.20.0" }, + { name = "faiss-cpu", specifier = ">=1.10" }, + { name = "filelock", specifier = "~=3.25.2" }, { name = "flower", specifier = "~=2.0.1" }, - { name = "gotenberg-client", specifier = "~=0.12.0" }, - { name = "granian", extras = ["uvloop"], marker = "extra == 'webserver'", specifier = "~=2.5.1" }, + { name = "gotenberg-client", specifier = "~=0.13.1" }, + { name = "granian", extras = ["uvloop"], marker = "extra == 'webserver'", specifier = "~=2.7.0" }, { name = "httpx-oauth", specifier = "~=0.16" }, + { name = "ijson", specifier = ">=3.2" }, { name = "imap-tools", specifier = "~=1.11.0" }, - { name = "inotifyrecursive", specifier = "~=0.3" }, { name = "jinja2", specifier = "~=3.1.5" }, { name = "langdetect", specifier = "~=1.0.9" }, + { name = "llama-index-core", specifier = ">=0.14.12" }, + { name = "llama-index-embeddings-huggingface", specifier = ">=0.6.1" }, + { name = "llama-index-embeddings-openai", specifier = ">=0.5.1" }, + { name = "llama-index-llms-ollama", specifier = ">=0.9.1" }, + { name = "llama-index-llms-openai", specifier = ">=0.6.13" }, + { name = "llama-index-vector-stores-faiss", specifier = ">=0.5.2" }, { name = "mysqlclient", marker = "extra == 'mariadb'", specifier = "~=2.2.7" }, { name = "nltk", specifier = "~=3.9.1" }, - { name = "ocrmypdf", specifier = "~=16.11.0" }, + { name = "ocrmypdf", specifier = "~=17.3.0" }, + { name = "openai", specifier = ">=1.76" }, { name = "pathvalidate", specifier = "~=3.3.1" }, { name = "pdf2image", specifier = "~=1.17.0" }, - { name = "psycopg", extras = ["c", "pool"], marker = "extra == 'postgres'", specifier = "==3.2.9" }, - { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl" }, - { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl" }, - { name = "psycopg-c", marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and extra == 'postgres') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and extra == 'postgres') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and extra == 'postgres') or (sys_platform != 'linux' and extra == 'postgres')", specifier = "==3.2.9" }, - { name = "psycopg-pool", marker = "extra == 'postgres'", specifier = "==3.2.6" }, + { name = "psycopg", extras = ["c", "pool"], marker = "extra == 'postgres'", specifier = "==3.3" }, + { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl" }, + { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl" }, + { name = "psycopg-c", marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and extra == 'postgres') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and extra == 'postgres') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and extra == 'postgres') or (sys_platform != 'linux' and extra == 'postgres')", specifier = "==3.3" }, + { name = "psycopg-pool", marker = "extra == 'postgres'", specifier = "==3.3" }, { name = "python-dateutil", specifier = "~=2.9.0" }, - { name = "python-dotenv", specifier = "~=1.1.0" }, + { name = "python-dotenv", specifier = "~=1.2.1" }, { name = "python-gnupg", specifier = "~=0.5.4" }, { name = "python-ipware", specifier = "~=3.0.0" }, { name = "python-magic", specifier = "~=0.4.27" }, - { name = "pyzbar", specifier = "~=0.1.9" }, { name = "rapidfuzz", specifier = "~=3.14.0" }, { name = "redis", extras = ["hiredis"], specifier = "~=5.2.1" }, - { name = "scikit-learn", specifier = "~=1.7.0" }, + { name = "regex", specifier = ">=2025.9.18" }, + { name = "scikit-learn", specifier = "~=1.8.0" }, + { name = "sentence-transformers", specifier = ">=4.1" }, { name = "setproctitle", specifier = "~=1.3.4" }, { name = "tika-client", specifier = "~=0.10.0" }, - { name = "tqdm", specifier = "~=4.67.1" }, - { name = "watchdog", specifier = "~=6.0" }, - { name = "whitenoise", specifier = "~=6.9" }, + { name = "torch", specifier = "~=2.10.0", index = "https://download.pytorch.org/whl/cpu" }, + { name = "watchfiles", specifier = ">=1.1.1" }, + { name = "whitenoise", specifier = "~=6.11" }, { name = "whoosh-reloaded", specifier = ">=2.7.5" }, - { name = "zxing-cpp", marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64') or (python_full_version != '3.12.*' and platform_machine == 'x86_64') or (platform_machine != 'aarch64' and platform_machine != 'x86_64') or sys_platform != 'linux'", specifier = "~=2.3.0" }, - { name = "zxing-cpp", marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl" }, - { name = "zxing-cpp", marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl" }, + { name = "zxing-cpp", specifier = "~=3.0.0" }, ] provides-extras = ["mariadb", "postgres", "webserver"] @@ -2323,44 +3077,40 @@ provides-extras = ["mariadb", "postgres", "webserver"] dev = [ { name = "daphne" }, { name = "factory-boy", specifier = "~=3.3.1" }, + { name = "faker", specifier = "~=40.8.0" }, { name = "imagehash" }, - { name = "mkdocs-glightbox", specifier = "~=0.5.1" }, - { name = "mkdocs-material", specifier = "~=9.6.4" }, - { name = "pre-commit", specifier = "~=4.3.0" }, - { name = "pre-commit-uv", specifier = "~=4.2.0" }, - { name = "pytest", specifier = "~=8.4.1" }, + { name = "prek", specifier = "~=0.3.0" }, + { name = "pytest", specifier = "~=9.0.0" }, { name = "pytest-cov", specifier = "~=7.0.0" }, - { name = "pytest-django", specifier = "~=4.11.1" }, - { name = "pytest-env" }, + { name = "pytest-django", specifier = "~=4.12.0" }, + { name = "pytest-env", specifier = "~=1.5.0" }, { name = "pytest-httpx" }, - { name = "pytest-mock" }, - { name = "pytest-rerunfailures" }, + { name = "pytest-mock", specifier = "~=3.15.1" }, + { name = "pytest-rerunfailures", specifier = "~=16.1" }, { name = "pytest-sugar" }, - { name = "pytest-xdist" }, - { name = "ruff", specifier = "~=0.14.0" }, -] -docs = [ - { name = "mkdocs-glightbox", specifier = "~=0.5.1" }, - { name = "mkdocs-material", specifier = "~=9.6.4" }, + { name = "pytest-xdist", specifier = "~=3.8.0" }, + { name = "ruff", specifier = "~=0.15.0" }, + { name = "zensical", specifier = ">=0.0.21" }, ] +docs = [{ name = "zensical", specifier = ">=0.0.21" }] lint = [ - { name = "pre-commit", specifier = "~=4.3.0" }, - { name = "pre-commit-uv", specifier = "~=4.2.0" }, - { name = "ruff", specifier = "~=0.14.0" }, + { name = "prek", specifier = "~=0.3.0" }, + { name = "ruff", specifier = "~=0.15.0" }, ] testing = [ { name = "daphne" }, { name = "factory-boy", specifier = "~=3.3.1" }, + { name = "faker", specifier = "~=40.8.0" }, { name = "imagehash" }, - { name = "pytest", specifier = "~=8.4.1" }, + { name = "pytest", specifier = "~=9.0.0" }, { name = "pytest-cov", specifier = "~=7.0.0" }, - { name = "pytest-django", specifier = "~=4.11.1" }, - { name = "pytest-env" }, + { name = "pytest-django", specifier = "~=4.12.0" }, + { name = "pytest-env", specifier = "~=1.5.0" }, { name = "pytest-httpx" }, - { name = "pytest-mock" }, - { name = "pytest-rerunfailures" }, + { name = "pytest-mock", specifier = "~=3.15.1" }, + { name = "pytest-rerunfailures", specifier = "~=16.1" }, { name = "pytest-sugar" }, - { name = "pytest-xdist" }, + { name = "pytest-xdist", specifier = "~=3.8.0" }, ] typing = [ { name = "celery-types" }, @@ -2368,8 +3118,12 @@ typing = [ { name = "django-stubs", extras = ["compatible-mypy"] }, { name = "djangorestframework-stubs", extras = ["compatible-mypy"] }, { name = "lxml-stubs" }, + { name = "microsoft-python-type-stubs", git = "https://github.com/microsoft/python-type-stubs.git" }, { name = "mypy" }, + { name = "mypy-baseline" }, + { name = "pyrefly" }, { name = "types-bleach" }, + { name = "types-channels" }, { name = "types-colorama" }, { name = "types-dateparser" }, { name = "types-markdown" }, @@ -2378,16 +3132,15 @@ typing = [ { name = "types-pytz" }, { name = "types-redis" }, { name = "types-setuptools" }, - { name = "types-tqdm" }, ] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] @@ -2413,69 +3166,59 @@ wheels = [ [[package]] name = "pdfminer-six" -version = "20250506" +version = "20260107" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/46/5223d613ac4963e1f7c07b2660fe0e9e770102ec6bda8c038400113fb215/pdfminer_six-20250506.tar.gz", hash = "sha256:b03cc8df09cf3c7aba8246deae52e0bca7ebb112a38895b5e1d4f5dd2b8ca2e7", size = 7387678, upload-time = "2025-05-06T16:17:00.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/a4/5cec1112009f0439a5ca6afa8ace321f0ab2f48da3255b7a1c8953014670/pdfminer_six-20260107.tar.gz", hash = "sha256:96bfd431e3577a55a0efd25676968ca4ce8fd5b53f14565f85716ff363889602", size = 8512094, upload-time = "2026-01-07T13:29:12.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/16/7a432c0101fa87457e75cb12c879e1749c5870a786525e2e0f42871d6462/pdfminer_six-20250506-py3-none-any.whl", hash = "sha256:d81ad173f62e5f841b53a8ba63af1a4a355933cfc0ffabd608e568b9193909e3", size = 5620187, upload-time = "2025-05-06T16:16:58.669Z" }, + { url = "https://files.pythonhosted.org/packages/20/8b/28c4eaec9d6b036a52cb44720408f26b1a143ca9bce76cc19e8f5de00ab4/pdfminer_six-20260107-py3-none-any.whl", hash = "sha256:366585ba97e80dffa8f00cebe303d2f381884d8637af4ce422f1df3ef38111a9", size = 6592252, upload-time = "2026-01-07T13:29:10.742Z" }, ] [[package]] name = "pi-heif" -version = "1.1.0" +version = "1.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/3c/15d70bac37e50bd03ca2cdf7f7237d237c6f4e3e6d6cefdcc95b53dd708e/pi_heif-1.1.0.tar.gz", hash = "sha256:bac501008a000f2c560086d82e785e3ca2fc688b24b66c1d7dae537ef2fd6a6e", size = 18269246, upload-time = "2025-08-02T09:59:46.64Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/37/008dc1c55afb339bcc11e210d3f9a5220e7e0e03a74d109493cc3888feed/pi_heif-1.1.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:888c195a097cfe8d03ef6c30a8d57d7ef21795b67d7ec79769c2707e2d919e32", size = 714302, upload-time = "2025-08-02T09:58:35.47Z" }, - { url = "https://files.pythonhosted.org/packages/bf/98/73fa3e7159a6074c2c88f4a89adb15e3cba23cd732b3fff3c9d9bdba29de/pi_heif-1.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f03ebfe71ab89b1e9d8d9976f306bb881e156d16ecb323ced9fce59a6ca46a20", size = 642373, upload-time = "2025-08-02T09:58:36.929Z" }, - { url = "https://files.pythonhosted.org/packages/03/3a/773d071227e5d2c740afa73c5766d31d82f3866895f0234246c301cceda2/pi_heif-1.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88d3825502b6fa415021c400e955b07e9111122eb8d1a4b5e3dd75c6936491d9", size = 1290964, upload-time = "2025-08-02T09:58:38.112Z" }, - { url = "https://files.pythonhosted.org/packages/47/3c/7c6c7475d57d52cf45c9a8cbb170c6e9904792b2700c15f1df98fbfa23b4/pi_heif-1.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f24a6bf385374e7fc94f3ca17eed3d47a0f16ef7bcdeaa3aabdc3c5e43858643", size = 1415137, upload-time = "2025-08-02T09:58:39.212Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d6/bba3d4872e3b50752fdb2bc0c65dbbe1f1c181cc1eecc4961df988fb7c94/pi_heif-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d25aaee75cbd4ff209088513d2e8b0361d8fd24dfb68b848cd78f04a273c0904", size = 2272169, upload-time = "2025-08-02T09:58:40.42Z" }, - { url = "https://files.pythonhosted.org/packages/59/c5/f202417df536bd0ea9c63daf7623cd2259fb4adb9a8909d274949f221faa/pi_heif-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:919d147273cd53116aa7bad1530e0b5d466a72959bc6455497bf833565484992", size = 2430695, upload-time = "2025-08-02T09:58:42.088Z" }, - { url = "https://files.pythonhosted.org/packages/10/5e/b32bb95bd047e1831095bc9480c7280dc593657ec048312df86b623f4083/pi_heif-1.1.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:104ed9674f5e3067e3dc413a38c26611b7256760c7f3d5c5adaaf6651a009cc8", size = 714303, upload-time = "2025-08-02T09:58:44.731Z" }, - { url = "https://files.pythonhosted.org/packages/97/6c/221fbf9fbcfd66508e376883ac12d4e590210ecded78a046e2c515594b19/pi_heif-1.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c468181374f64ab6376893541bc91b954e62c2e92703b2e0a8a9d1b023d78b1", size = 642375, upload-time = "2025-08-02T09:58:46.314Z" }, - { url = "https://files.pythonhosted.org/packages/6d/78/e956fc64d901b2e55d946ff819275fa9cb0156299f52e3570e2f73fb1de9/pi_heif-1.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1074ad1d30fb45222b741b1d5daf7daa84414fd137ed3ca1a495557b0e9b377", size = 1292835, upload-time = "2025-08-02T09:58:47.435Z" }, - { url = "https://files.pythonhosted.org/packages/54/cb/7eff4030c63b286aba023d6c12c57a7e73ece21ebdfd8405a6c8e4170999/pi_heif-1.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:40754dd2085f8b9c2367c1c49c06fb8e96f93bd5701f6bcb26311442c07373f5", size = 1416805, upload-time = "2025-08-02T09:58:48.605Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bf/c37eefec6c252d3065fb390744b16520a744498f9233b2abec7124c4f9b0/pi_heif-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a599f40fc94d4ed00efd0bed5066b8522a0f6cea79f73990042204cb1598c38a", size = 2273717, upload-time = "2025-08-02T09:58:49.761Z" }, - { url = "https://files.pythonhosted.org/packages/c2/52/50dc5c9f7c3c3f515dcc90f45aa2f8ad19b40ee3ab6b86a86e446653f528/pi_heif-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2eae0dcf439b7592f754c594e74c866b5fa791fa07428d29166755fbe18b4e1d", size = 2432169, upload-time = "2025-08-02T09:58:50.97Z" }, - { url = "https://files.pythonhosted.org/packages/38/49/64b2de6f44c1ad2e7be034d516a24a8e5e4acbc66ed6f1d195d46b0737ac/pi_heif-1.1.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:b6d7db7d5506afc6755f535cded7f21b3759457a52734776d929cf4fec220ec1", size = 714538, upload-time = "2025-08-02T09:58:53.507Z" }, - { url = "https://files.pythonhosted.org/packages/de/ff/2c8021d6db6836e65b88f63aba0f1c551c293f51bc1533ed68440432baf0/pi_heif-1.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ff0e6b2036f6f3f6bb4147b4ae99735c3e199ce58e3473d830decae76238f986", size = 642359, upload-time = "2025-08-02T09:58:54.745Z" }, - { url = "https://files.pythonhosted.org/packages/b1/19/14d2eed494ee1492cc881149cbbbc48113dc1f63239b8f1167321b0b28c4/pi_heif-1.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ac2ba474703d70e2e62aa9f73ccfe4929274f22f2219c0152a8f481eba3c0d5", size = 1291396, upload-time = "2025-08-02T09:58:55.905Z" }, - { url = "https://files.pythonhosted.org/packages/43/11/43f872ef2c6c4a68c9c99fe0bce1fbfea50428dabbe813e94b89d3dcf60a/pi_heif-1.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24b3c29fe0edbba5419391d180a43bde72125a1a35ee1f073ef8b96eda65279d", size = 1416099, upload-time = "2025-08-02T09:58:57.183Z" }, - { url = "https://files.pythonhosted.org/packages/87/d5/65d97be2c56ff8bf4f6312be171ef737d5a120bbd3f63f69bfd848731ed7/pi_heif-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:019fb0eddabe713c7f01b1de78c438c393aff8c0b0823bccd47f40cf12f2f347", size = 2272591, upload-time = "2025-08-02T09:58:58.487Z" }, - { url = "https://files.pythonhosted.org/packages/f5/d9/aa4456eec621608110ee43d5e824381cc8e66b39cc182a333206f6918cc5/pi_heif-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8ef5caad093589f7bc7ef07ccc33e5c3eafb3168c0fa5482befd34f344cd3ca", size = 2431520, upload-time = "2025-08-02T09:59:00.193Z" }, - { url = "https://files.pythonhosted.org/packages/72/d5/1c90b161b3012ce1d93a0ddb648734f62bb075af8d2a9f7e01c2e2ce745d/pi_heif-1.1.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:228abec71f87cd854ece251c84f28f025ab3d004b8f0ba731bd954b07fe9c14c", size = 714536, upload-time = "2025-08-02T09:59:02.684Z" }, - { url = "https://files.pythonhosted.org/packages/70/9c/43712a6c7d8a66e440aa8ebc651d1fa9eb640c41f35f88bf278a356c28b8/pi_heif-1.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5a7bb04ce197a15aaa3b2e8a30243fdf9c257e676e74d09aef26053cfe615145", size = 642356, upload-time = "2025-08-02T09:59:03.778Z" }, - { url = "https://files.pythonhosted.org/packages/3e/21/0f733a1e62ef4099e2642dd8345e56388cee01edf2a6f25c9a088070593c/pi_heif-1.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:587d8de4a672a65e57e7c6c591ed75386c4f5d32b70d499c0dd1023152326890", size = 1291429, upload-time = "2025-08-02T09:59:04.86Z" }, - { url = "https://files.pythonhosted.org/packages/c3/72/08d3695966c096b110f21ff62e61fabd51b970b6a45cb964d27240192881/pi_heif-1.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4dfee3431a262eb83640ee19a5993840a863ed216bbd08b4c7f1214cf0bb5379", size = 1416190, upload-time = "2025-08-02T09:59:06.2Z" }, - { url = "https://files.pythonhosted.org/packages/9e/57/47911f5ac5fa179d51e3641dcda9491ca4a173756dfaf428151c035f098f/pi_heif-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3930f8dd8b1929ae704955611cb4431e2bea7c673b634c950cfc5657adcab485", size = 2272625, upload-time = "2025-08-02T09:59:07.937Z" }, - { url = "https://files.pythonhosted.org/packages/05/41/44ab8f98d79db9a2550260f5a5d3cf55bd2dee078563f38e46785f46d02a/pi_heif-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:056cd407f5af858491d68fd40b2072763fd9719c446e5c48cb3ad70b16829043", size = 2431590, upload-time = "2025-08-02T09:59:09.129Z" }, - { url = "https://files.pythonhosted.org/packages/8a/14/13e6ab10c62091d9d9d81b634ac7ebbde84556651a9cda9122ab345c418d/pi_heif-1.1.0-cp314-cp314-macosx_13_0_x86_64.whl", hash = "sha256:d2f1ecbadbed3afb2f3bf87db2a5276d773e57996052f2adc23b881b7eaef84f", size = 714495, upload-time = "2025-08-02T09:59:11.716Z" }, - { url = "https://files.pythonhosted.org/packages/ff/74/81a041640fde479c3503a713f007edab481301056cf04f52a46dd809cabb/pi_heif-1.1.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:6dcd89781e73d9035ed87c8e65bd7bfe164d3b5e9670e2ebf0df481a9ed73201", size = 642448, upload-time = "2025-08-02T09:59:13.262Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/58bb9cc23161d77259e111a5f1cb489003cd93ea9d6c72668162c2880e2f/pi_heif-1.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d667a91b710ec6af66fbd4e3cda28b08e9c32239e2a3547a29ab22b640e4cece", size = 1291620, upload-time = "2025-08-02T09:59:14.516Z" }, - { url = "https://files.pythonhosted.org/packages/03/66/d4ff09ee80bcf303a1c6a5a9553a723c4728b472358c44e62d5158df212e/pi_heif-1.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c39980385edd3ed946b79ca87b6c83418e09f483fa993ca02513ca6d9660895c", size = 1416269, upload-time = "2025-08-02T09:59:15.685Z" }, - { url = "https://files.pythonhosted.org/packages/00/09/07961a650e0b7ea3b2feeca7146d1617af42b409e700ddfa8603b32e0ccf/pi_heif-1.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:918d571b409b7c04e529a54ebdbb2fd9cec36347b49fc5e859211d3f574fa2be", size = 2272805, upload-time = "2025-08-02T09:59:17.383Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f7/f7c62a9d9907daaa555de18fc394cff86d251eb15d89fa88d19a4aff0a37/pi_heif-1.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d1ddf59f91eac869c2602e7418f876096433c069ee3bc4d41df8e8008c876d14", size = 2431604, upload-time = "2025-08-02T09:59:18.816Z" }, - { url = "https://files.pythonhosted.org/packages/03/42/81e456fc5db44ae99a1e4d6efd2c467349797ff775b99ce147db8c9bf0b2/pi_heif-1.1.0-pp310-pypy310_pp73-macosx_13_0_x86_64.whl", hash = "sha256:63fec82b6f1d1f50d67fdfdca9b2cc9fc241ebcb79dea5aa08915e47441289de", size = 703066, upload-time = "2025-08-02T09:59:31.684Z" }, - { url = "https://files.pythonhosted.org/packages/c9/39/e5a06bb0d8569539f4a729ca639c3641723ac87ddfa2f90077dfcff306da/pi_heif-1.1.0-pp310-pypy310_pp73-macosx_14_0_arm64.whl", hash = "sha256:9d3a1a583d3da53041205c1f6a241fdf027b64a06eeb223c597c8695b43c3850", size = 638910, upload-time = "2025-08-02T09:59:32.763Z" }, - { url = "https://files.pythonhosted.org/packages/cc/46/6876dad0898fe0bda652b9663371ce56dad25f0dc158dee1f49248479c8b/pi_heif-1.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b9d2075336a7f8eb6dbccc1f3c3b5d3083e434a7f4bd918119eeee1a17e2e9", size = 1251437, upload-time = "2025-08-02T09:59:33.853Z" }, - { url = "https://files.pythonhosted.org/packages/e2/81/fb3a2e5669ea11706314856359972721b2996d4054ebd27cef0122c596aa/pi_heif-1.1.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bc2a8a14e92efee9e07ae5abe6635d5e30cb113fa172a14e3d77a580887285a", size = 1372541, upload-time = "2025-08-02T09:59:35.061Z" }, - { url = "https://files.pythonhosted.org/packages/43/3d/e11091f073060a2a3f6be2d4862cd4006f60c027d395a3d763784cb8e3d2/pi_heif-1.1.0-pp311-pypy311_pp73-macosx_13_0_x86_64.whl", hash = "sha256:cfbf1e5ea3364cd025e1d10c378a9e4a752e94041f108610625cb4d871822209", size = 702996, upload-time = "2025-08-02T09:59:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c5/3118bc20dc876edd84ec1610af6fda175f7b5a233fcef68099017cbc78fb/pi_heif-1.1.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:eb7c5bc1437fed64f47cb8b6ac9f556aa2263372e17d7360b2269a8fbc7a5679", size = 638831, upload-time = "2025-08-02T09:59:39.048Z" }, - { url = "https://files.pythonhosted.org/packages/0b/4d/6a5455768b4d10df26ed30eead89d49965cde29661972117c4a67df831a1/pi_heif-1.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2bf9a8905cab92e436f0d67cad55478f18f8842a6856ee71bd85af9c25c48551", size = 1251456, upload-time = "2025-08-02T09:59:40.663Z" }, - { url = "https://files.pythonhosted.org/packages/5b/16/1ce9562c6bbd0cfe8efa72fc30c25972e7f8fd100e19d5c1fba9c4448a38/pi_heif-1.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f74889fa91614efa29a100ea2a6f85a58dd35a6bd256c087c344684b08be7299", size = 1372549, upload-time = "2025-08-02T09:59:42.255Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c5/0b/0c97767b8171c7f9f0584c0a70e7b86655a1898c2f5b8ae04a69f4e481a1/pi_heif-1.2.0.tar.gz", hash = "sha256:52bbbc8c30b803288a9f1bb02e4575797940fdc1f5091fce743c699e812418cc", size = 17126431, upload-time = "2026-01-23T07:36:26.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/26/a08d352e861153f6c61ead733cda4a1b237636ca8de3edfe79e0039ef1bf/pi_heif-1.2.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:680939024f6dd760925f0bffbe24a325845b8a4a6acf380ba6251b34485adc05", size = 1046544, upload-time = "2026-01-23T07:35:38.983Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/e3fb06ee73b262c1a2cb611dc1439e7b189b50cc5539c68fc743c68b1169/pi_heif-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f2cb2a102175b59acb3d61f93499553609ab07911284b30e6255fbee23c9347", size = 941939, upload-time = "2026-01-23T07:35:40.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/60/66d2de00df006b4e7eeb04d4e9cdce4cb26be3aa16b1db014323f5effd9f/pi_heif-1.2.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d486b40f71a57e401625ae853f7b0b70ce0027c2378a2f69af89aa5f49d96b72", size = 1361699, upload-time = "2026-01-23T07:35:41.411Z" }, + { url = "https://files.pythonhosted.org/packages/8d/e1/30143e60e0a51d1c7c8c73f920dbc90f1e46ae32195826b8690598657f28/pi_heif-1.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13e46b0850ef4b66e2fee9a3ad8b3c337ae1a93e963fe2180feb0b6159af0e03", size = 1489366, upload-time = "2026-01-23T07:35:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/66/b8/34276a703bc7a60deb1bb723cfeaac26720cbea530e9ef792183dc2d8c31/pi_heif-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d37c88e3da7c285e58de9b68c778ec241e2ad4722b4cc25e9068eb51e41d6fa2", size = 2344080, upload-time = "2026-01-23T07:35:44.57Z" }, + { url = "https://files.pythonhosted.org/packages/12/d3/b2113375e31eb878dc8958306689e19f630f216f2e0425a86b7fc6efa267/pi_heif-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dbc53e52f940394351f85c7fa1c7cabc845a18d924245806cafb91c29998804c", size = 2507697, upload-time = "2026-01-23T07:35:45.995Z" }, + { url = "https://files.pythonhosted.org/packages/22/fb/1b77865d7c003ca620a91faad2e66005817eb5cb35ddcd64c047693d3d16/pi_heif-1.2.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:e007c14570acf9e522e9a7e750bcfbd6924b2a9d86dd845857cce203ec5d696f", size = 1046786, upload-time = "2026-01-23T07:35:49.039Z" }, + { url = "https://files.pythonhosted.org/packages/e4/32/1ab6c52f1b7123c26be15851a8b10bb47d32961459895ca95c42b9f31a1a/pi_heif-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d74f70d60549f7198b1b1954bfceff48f5b527229cf211b83905c458819ed5a", size = 941880, upload-time = "2026-01-23T07:35:50.187Z" }, + { url = "https://files.pythonhosted.org/packages/48/73/090f23ed9f96e8f3f9af0dcdcb5eb05d49284932a3c32a14b05b4460c127/pi_heif-1.2.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:760d3ca420a46514cfd06a440d46c10eb0fbea5cc9c2c8fbd151c520a907a248", size = 1360268, upload-time = "2026-01-23T07:35:51.398Z" }, + { url = "https://files.pythonhosted.org/packages/ed/04/64b3777d44bec9b80d901ae2e67a4f13f221e43f947f24b26aca30d7e250/pi_heif-1.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:264e8e50835c2e7f835f92508580da5859b63fa61ffe9319b2b97feba2120ccc", size = 1488770, upload-time = "2026-01-23T07:35:52.576Z" }, + { url = "https://files.pythonhosted.org/packages/69/07/1503ae48aacbe6d2449c494f4a2324f13fd8ddbf5111cadc18bc559c7a5d/pi_heif-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:46e934a72f7baed86525d9e0511a234b687b6aa80a764b33b42eedbe3d56d860", size = 2342938, upload-time = "2026-01-23T07:35:54.003Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/2c548ea4e91ecb5c5d772362f13451dbc4e9de4a777c4cb220bef22beb76/pi_heif-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8307d668d40b156b9d19d13158a4a015540061f1694b4c6593a931e823c5959c", size = 2507029, upload-time = "2026-01-23T07:35:55.456Z" }, + { url = "https://files.pythonhosted.org/packages/36/a9/2c0cc22e4649055b95e5765dadaaff133177c40754ed5a0a434d8d88ceeb/pi_heif-1.2.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:06947b98598026cf71df9ab841a17bd2cf0da704789e4fff73311d79539d6cc5", size = 1046774, upload-time = "2026-01-23T07:35:58.182Z" }, + { url = "https://files.pythonhosted.org/packages/5e/71/a4774de12b5e9bf576b013d81f2e8001f2b1fd81b6368e0e20d220c92e6a/pi_heif-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3b7bdefbf3bec7dd644bc8e17810d1f658db2ee60f35ef3943fcb9b435aca479", size = 941879, upload-time = "2026-01-23T07:35:59.66Z" }, + { url = "https://files.pythonhosted.org/packages/66/c6/5c58d3083adfd9b6f9753431d398842120bdbc33d3815bb561aeea669da0/pi_heif-1.2.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ad88e50bcb0aa25f9febde017ce7fce6801d927f032c1983d6846ead106c50e", size = 1360283, upload-time = "2026-01-23T07:36:00.835Z" }, + { url = "https://files.pythonhosted.org/packages/0b/24/40ecac0eb3c046a4afcf30ef187f45bf640bd7a30506f2f678ee4b25f7f2/pi_heif-1.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c90cf1238c75fb118eaeedf573fca833fef9ace8788c527f76758ac038e262d", size = 1488814, upload-time = "2026-01-23T07:36:02.351Z" }, + { url = "https://files.pythonhosted.org/packages/06/73/85265720fd58c72cd1c96eac47a27bdf8d2c88845fa4644b92b16e8d3340/pi_heif-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c4fc7a877807ef7f156f26ae920074d1f40a96868a5962ead743049b7c96c8", size = 2342994, upload-time = "2026-01-23T07:36:03.782Z" }, + { url = "https://files.pythonhosted.org/packages/be/9f/d00b4466382ecdd06cb11695c75d434856cf58504b1bfc1c0899a838cdb5/pi_heif-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eb7f0fcdbc80ae75b0881ee1e63d1e8b873df72ff2bdd154d500d6d0644d22e2", size = 2507054, upload-time = "2026-01-23T07:36:05.085Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b5/fcf63fc20a1513062671a40348248d992b0c50c37112b2e155347ffbb5a1/pi_heif-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:cde6e4ebfdae0044d2852036d7f4f2399f8f89923501eceaecc564efc6a82899", size = 1046814, upload-time = "2026-01-23T07:36:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d9/bb7e517d96725bcc0fb16151b49d752f23d069440dcfa24e9acca55617e1/pi_heif-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3e51c6a56868be96534bd04c521637c71ad39b7a65a5aaa297adebe7e2d15ffb", size = 941968, upload-time = "2026-01-23T07:36:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/41/82/b52a5f4e24dfb7b7a90841637b7668b13156e36bea31ecc8f0695bb53fc6/pi_heif-1.2.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b663f82cc3c87e315977577e6d267ecce2a17c96a766aae3fd807abc0ab45900", size = 1360470, upload-time = "2026-01-23T07:36:11.16Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1a/de369800616a00b1e1237563d8cea44da43912c31ec3ce7aa38b393ac0bd/pi_heif-1.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5e62c54ba42ca4d74fba84f92668e6bf825f4b827fb182b5e22244a2e2fb1b3", size = 1488949, upload-time = "2026-01-23T07:36:12.859Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ee/6fc4cec1a9fa71897b7664880d6f681e22bfddfb9364db847405fbee8fc3/pi_heif-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bc0fa16a0751aba3a3d5fb222fd5587a789dd79a675ddf0532de5ec090e0003a", size = 2343115, upload-time = "2026-01-23T07:36:14.147Z" }, + { url = "https://files.pythonhosted.org/packages/26/28/74736d7d0fc3efea3cc5b82a5a310fcbc0dc6157844e4015e1bcf7222498/pi_heif-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fe00abdb62faf1a37ef77d01ed7b0302196897a47da1fc14758ae1522a705733", size = 2507162, upload-time = "2026-01-23T07:36:15.634Z" }, + { url = "https://files.pythonhosted.org/packages/79/80/d86e455d9b001ab5064c80b66748e0666c1624a3889c7779727514ee562c/pi_heif-1.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0495913cfd4ddf726fd3dc12cc0af065218f682bfb091feb1641223e7563065b", size = 1034973, upload-time = "2026-01-23T07:36:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/37/4c/2588670e2196760a9e8db079830f88b2112ad055c5ad2cd1b232efafb9b9/pi_heif-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5d8f049862694534eced877e438df0687e7cb3e037348ab5792bee8fc86f2633", size = 938424, upload-time = "2026-01-23T07:36:19.709Z" }, + { url = "https://files.pythonhosted.org/packages/94/99/ed05f4b9442c5078f94c627f0b79b5df5f5f8c9e4b01390cd7057f82044e/pi_heif-1.2.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b0407727fdda6d410481e3b2ccd1c9eb1eb0e762aeb40c87a368f7b1f5d9d44", size = 1320112, upload-time = "2026-01-23T07:36:21.141Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5c/05b2db716de7b4b47d97e27e65130eb759a2fa035c770677b6be06bc491f/pi_heif-1.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c698bf9bf4e39be88e91f1c12de603fbf321034ba5aee9280b789dae13532a71", size = 1444880, upload-time = "2026-01-23T07:36:22.477Z" }, ] [[package]] name = "pikepdf" -version = "9.11.0" +version = "10.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2483,126 +3226,109 @@ dependencies = [ { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/4c/62b37a3ee301c245be6ad269ca771c2c5298bf049366e1094cfdf80d850c/pikepdf-9.11.0.tar.gz", hash = "sha256:5ad6bffba08849c21eee273ba0b6fcd4b6a9cff81bcbca6988f87a765ba62163", size = 4546289, upload-time = "2025-09-12T07:15:11.096Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/66/0f/443a152687cb110e4adb7d998b413d124830cc8967a74e5f236c244c352b/pikepdf-9.11.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:8ac1adbb2e32a1cefb9fc51f1e892de1ce0af506f040593384b3af973a46089b", size = 4989446, upload-time = "2025-09-12T07:13:44.401Z" }, - { url = "https://files.pythonhosted.org/packages/4c/b4/a0f3208d2a95f75f1204bbb5a36f83441826fa8463edf92ff08810d4ed0b/pikepdf-9.11.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f53ccda7be5aa7457a1b32b635a1e289dcdccb607b4fa7198a2c70e163fc0b8b", size = 4682716, upload-time = "2025-09-12T07:13:47.902Z" }, - { url = "https://files.pythonhosted.org/packages/a6/10/12a1f044b3e923a0998b0fb5f81265c4cbf0aa5f6e0d992782497241667e/pikepdf-9.11.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:491345765d819a9d9d4676bd55ccff15a043db794104325a181e1870ec511855", size = 2380569, upload-time = "2025-09-12T07:13:49.817Z" }, - { url = "https://files.pythonhosted.org/packages/91/3f/eec913d34c01076b02ccb5b897eae4381f95343a69e4a5e19d9783d667a3/pikepdf-9.11.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:501dd145a3e89ee25c612ae88530813f2612fe24abb178f2907d3cf7997a0719", size = 2597555, upload-time = "2025-09-12T07:13:51.459Z" }, - { url = "https://files.pythonhosted.org/packages/68/82/1d1d6e93d9a456d5309e79d17b32edf8f1faf635cb2106e36e4eccf67ddb/pikepdf-9.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab2980881f8a8e500a1ce27e16a69907a87fe0875894ed5269586012794d6bd6", size = 3573555, upload-time = "2025-09-12T07:13:53.2Z" }, - { url = "https://files.pythonhosted.org/packages/ce/92/2c90ea29c11a4cc0e522b32259c1326e6ed58a58d5cf35c5b3436800cc40/pikepdf-9.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eb5c579c1da45aa771d379eacf213daceb789055e11f851f662d17eafd56868e", size = 3757083, upload-time = "2025-09-12T07:13:55.337Z" }, - { url = "https://files.pythonhosted.org/packages/fd/19/5a648ca803c98e4195a3c5b4a9e28fc2f919ea6c71a9b30e3bd199ce728d/pikepdf-9.11.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:f501ff4c065246d4cf72d8bb50e248189b8d0cfcbf3c6388580658d011d41123", size = 4991632, upload-time = "2025-09-12T07:13:59.685Z" }, - { url = "https://files.pythonhosted.org/packages/73/1b/9b2e4b835ff8f43c9863866eb0841587dc7c5f4ac56f7822bac217bd1766/pikepdf-9.11.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:adb2910ca1ced9c8cd1952fec6788c1e87ac39cd1b7e0c51e466ee8a4b7974c6", size = 4685285, upload-time = "2025-09-12T07:14:01.52Z" }, - { url = "https://files.pythonhosted.org/packages/e9/10/49713c45c524ad97335bedbc5a2bdbc0295c81c023e6d503d2d8eeb5d12b/pikepdf-9.11.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3958ea903993f8d97714d460a74f63e1f01da2a67c8a24362b7d2c3f8ee49e41", size = 2387526, upload-time = "2025-09-12T07:14:03.141Z" }, - { url = "https://files.pythonhosted.org/packages/c7/51/0b03dd0b3048bb521a486dc60dfa407f583f9b70248b7cc27008044d1212/pikepdf-9.11.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f642be1eaf3ab6f2c8d9a5c8d90c83dbfcb556624e426574b8fb15578dad11cf", size = 2605773, upload-time = "2025-09-12T07:14:04.837Z" }, - { url = "https://files.pythonhosted.org/packages/b9/1b/d14309b905ab8b88a93f7364025135bfe9489b1169bb32a4c5ce66538266/pikepdf-9.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ec710fde0543a73221d1553671559b4cb1fe4f883bff6ff4094d23a7c6e0a65", size = 3582806, upload-time = "2025-09-12T07:14:06.582Z" }, - { url = "https://files.pythonhosted.org/packages/d6/72/1496333781ac5fb209b58914ca0fe39559e4cfa9491a9954bbbe13a0aec6/pikepdf-9.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec2147018edf5a5c7ab981a5fb3b060e5af1366c4d6aa085f2dcf881fdb4ee7e", size = 3765976, upload-time = "2025-09-12T07:14:08.345Z" }, - { url = "https://files.pythonhosted.org/packages/fe/58/0da186afd9e50bf93fa71838378ecde096cff5a16c69b0de8d629ded127a/pikepdf-9.11.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:bd9ab8286316f758a107bfa7496c2fcada9f687467e4c68b3bfd6f3167a86d54", size = 5008605, upload-time = "2025-09-12T07:14:12.419Z" }, - { url = "https://files.pythonhosted.org/packages/c9/66/4de410fbfae6e1a02e9240a1831a7d7430a9bce67ad3af9456e5322a2513/pikepdf-9.11.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a0cc52f3161b1245d810c16bb8e244a1b53bad9a47cd004ea1dd7b291a4f3db7", size = 4697137, upload-time = "2025-09-12T07:14:14.329Z" }, - { url = "https://files.pythonhosted.org/packages/e5/99/e7b5d3daccb9d6f19b06dfcfb77853d2ca26d3c84c1a9b9649d89e10bfe3/pikepdf-9.11.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2a5a618e35e98fd9872bbbab4f183d7fd574a8e141c92cb01f7147323289413", size = 2395911, upload-time = "2025-09-12T07:14:16.024Z" }, - { url = "https://files.pythonhosted.org/packages/bc/af/11c28aace8696221613ed0799f547c58e64d92718ca62388ffae273e664d/pikepdf-9.11.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa87a2c31143037b78a397a0242879c11c0131e5660acbc20e2a6d6b193d48b0", size = 2630093, upload-time = "2025-09-12T07:14:17.904Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9c/793cb2602f4903847437dbf47e30c126fded689e00a5737c8ccb6fda440a/pikepdf-9.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70e008bc3da40b5a0b7007702291cd529a8917c6862e4d3db1eab986beae95ed", size = 3587720, upload-time = "2025-09-12T07:14:19.884Z" }, - { url = "https://files.pythonhosted.org/packages/c0/bb/6091c136fc7b605fb38d41777e8f887b830f22a95d2b3469b93c9763f2b3/pikepdf-9.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56e3aca58aeeef52fca3dd9555eb735f2cc37166ff658a3837b5f73d59627b4f", size = 3789963, upload-time = "2025-09-12T07:14:22.282Z" }, - { url = "https://files.pythonhosted.org/packages/83/c7/e6808027895f312f711c528c0ff4acee30183b1ab11657283ba50ef08009/pikepdf-9.11.0-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:4216120eec527596b23ab280f4eb4f029a150ec5f1227a2988e87b91ca51cfd7", size = 5008670, upload-time = "2025-09-12T07:14:27.612Z" }, - { url = "https://files.pythonhosted.org/packages/1d/0b/9b8fcc33778cc01cdebd8b8f397cacc45b44d252758bd49efd5c19c28ddc/pikepdf-9.11.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:2a7b3ca12af17e165c10bc500dbacefefbe78108cf8bc1db860f70fda0c399b2", size = 4697038, upload-time = "2025-09-12T07:14:29.538Z" }, - { url = "https://files.pythonhosted.org/packages/82/62/32dc82a07d4a080ae21d937587b58cfa939ed55ac5c8828fe1faad96109d/pikepdf-9.11.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbb550492e82e79056793d191838676dd01af849a27e5da7905797dac3d88a0b", size = 2396860, upload-time = "2025-09-12T07:14:32.203Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e9/ea6f34fb94d17c74e7eca0cd7bf22e281f005446280d77c46aa1f077e1bd/pikepdf-9.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b8280279d2229854df7f3c579d06926902d8b70649eb64ad9589f17e0bd352", size = 2632683, upload-time = "2025-09-12T07:14:34.29Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b1/fcf8e3fec8be17b74768448da94cffe3a69b418ffde2f620d093fd693ddf/pikepdf-9.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8569c338365c0f5187e250e7668477de222a784f1fa1d17574e99588d65defe0", size = 3588446, upload-time = "2025-09-12T07:14:36.625Z" }, - { url = "https://files.pythonhosted.org/packages/52/03/9ce3bd1a4f87789981b560003d5786163ccae34090b1c872a09cbd9a0168/pikepdf-9.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bbc42f95714d09ad4c5345b010126d25639abe402643737d2b74c41167f932c0", size = 3790549, upload-time = "2025-09-12T07:14:38.54Z" }, - { url = "https://files.pythonhosted.org/packages/e6/43/adfd1daf833d646ada849c4f3f50ad6032e8e82112595cbeacebcc25d1d8/pikepdf-9.11.0-cp314-cp314-macosx_13_0_x86_64.whl", hash = "sha256:b366aefe9a30caababfbdc9f4647c8d0b7e92cfe34b6399399b78d4b96db9004", size = 5003377, upload-time = "2025-09-12T07:14:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/c7/d9/5932cb5d884d360b253f0cb615f0f78f30c0a1d762c5a10760abf96a0811/pikepdf-9.11.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3aed8fa4dabbf8ac1d9f5b8c15fa0881040f21ae58b4436c7f51f43c2375fc77", size = 4692845, upload-time = "2025-09-12T07:14:44.299Z" }, - { url = "https://files.pythonhosted.org/packages/f5/87/a674468806890d10f2f931641f06aa7dac8400594a96a7baf4d9f1d8810e/pikepdf-9.11.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a09b060e52449080a87720d6af00f551f879e55c6d8e8884526e5434843fc15e", size = 2401793, upload-time = "2025-09-12T07:14:46.202Z" }, - { url = "https://files.pythonhosted.org/packages/1c/99/7727cd512db321ee81d20f96a072933677ed58ece03b449fe003ff78ed92/pikepdf-9.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42e5a69c32718b25da863ff3d408aa8bde677e19dbf8b05e6a12244f99c65f3", size = 2635642, upload-time = "2025-09-12T07:14:48.172Z" }, - { url = "https://files.pythonhosted.org/packages/0d/a0/0ebde63512eb79851eda33c2e798ffcc4956b34a0e425f8185c18f27eb0c/pikepdf-9.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:82f628fcfd98f27b0feac273aa2e088e47bc6e2b22d73c6251449b6bc901244a", size = 3593088, upload-time = "2025-09-12T07:14:50.499Z" }, - { url = "https://files.pythonhosted.org/packages/78/5b/da03983f19c7603cf3945d79df7e729070d10e6c1845b8f9d0ae70baac69/pikepdf-9.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c84358dce401f5bbb0725d38567fbd218de4e1efedd139b9626a8f9e3dc2cd66", size = 3794158, upload-time = "2025-09-12T07:14:52.801Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/6e/e9/a1462d6160805ca80c8f4aafc941aaf410a92d0fcc683706e94f499c2fac/pikepdf-10.2.0.tar.gz", hash = "sha256:0f398b0daeb2ffd2358f75c06f1dd47b9ba76f1a77dfe938cccf7080c58227d7", size = 4568506, upload-time = "2026-01-09T22:54:25.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/dc/aa7293763b603a9080ffab7ab87c7b571d637a389e9fb2ba839b864ca283/pikepdf-10.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:fb93732127d5183a91300af39e1cda5ded309e8439daec93536331a472b5e190", size = 4727891, upload-time = "2026-01-09T22:53:26.262Z" }, + { url = "https://files.pythonhosted.org/packages/d2/dc/700c31f2c14f94d92483b10e1918390948ed20f6f572d82beb78ac5f94d0/pikepdf-10.2.0-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:ab7bd4629539cf2136a799dc3eaa2dfda59937035a97b0c5e22a7a3a4033cc49", size = 5030510, upload-time = "2026-01-09T22:53:28.023Z" }, + { url = "https://files.pythonhosted.org/packages/23/46/dc63364b05aa1913f2d7480cad62676bfb473065ba4b02d314dfd482f7dd/pikepdf-10.2.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f5623a5ba456d69dfeb86dc3bb3ec31ec1d120382d8c24804d1b430fce715ea", size = 2439498, upload-time = "2026-01-09T22:53:30.122Z" }, + { url = "https://files.pythonhosted.org/packages/59/b6/1f9b8ca588fd34d9e3df49a80c62016e0b42ce6e580146c46d9728fdb6e8/pikepdf-10.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec4d12f294df378d122ae441c27c1e76fb0d15b1e9d7374ae70c26604559bab", size = 2666945, upload-time = "2026-01-09T22:53:32.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/31/b1e61fac59f0b807edde655a821ff83bb041ae1500234c52ed1a2403c44a/pikepdf-10.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c0cebe3235232f1bd3c5f7956218ce92241c94223cb80eba837d372a40c61765", size = 3638109, upload-time = "2026-01-09T22:53:34.144Z" }, + { url = "https://files.pythonhosted.org/packages/02/e9/a99bbf503c9d55e54553edff84ec67cac49d335fc33f3d5516c4746b6340/pikepdf-10.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0908e845c9140e245ad89a19fdfc6e5a6d82fcb505b8cc2c0ce81439ac4f064", size = 3829538, upload-time = "2026-01-09T22:53:36.341Z" }, + { url = "https://files.pythonhosted.org/packages/73/18/598383493a0f0f0c4eecd09b8fe06dddb9d326a89e2623a134d43e051485/pikepdf-10.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:18c35d00baff72bfae82d67028bedb02ea2b208e1af5545c23cd681f2487a279", size = 4737716, upload-time = "2026-01-09T22:53:39.973Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/bec04784ba07d44f03b52ea524bcb7409bf7185ee8abec7ae29e3ac9e9ae/pikepdf-10.2.0-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:dd849d033b95de15965c095ebc4d78983099a11bb7b7897801dfaf3cb4083a35", size = 5042152, upload-time = "2026-01-09T22:53:41.808Z" }, + { url = "https://files.pythonhosted.org/packages/38/3e/148b3c8e101c8ac3a33f41e86c5739413575495e471bce45ee228aafcbd6/pikepdf-10.2.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9910efdc7907af3da9e7b2a125a1f67d512165ffa623f62825deeb642669a7a", size = 2445796, upload-time = "2026-01-09T22:53:44.027Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ef/b06f8fd68c34fed631cb8e3520dd955e59987de0eee6960dbc94bed11711/pikepdf-10.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0ec947e6429d7a3306153d32a0142462fdd8f905c5fe08c8a8e8c53b9c28a5c", size = 2693908, upload-time = "2026-01-09T22:53:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/3e/bf/e5c40e9210e2ae8da7cad2cf6ae7d1db3b63a2916e6040645958e9ab4054/pikepdf-10.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b6383219a1cd31400403a69737a4e2a0c5d2a2c4cb9f380bcf45e33e8de802ea", size = 3643423, upload-time = "2026-01-09T22:53:48.333Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1b/969dfb29dc9fd7b82fa7bc065df498e8a3e7ddb81e982140634ee539a8db/pikepdf-10.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:46d2f9ef5a84949bfc11152a323558f94cf85d9d97e9c510c061c7f803028f3f", size = 3854816, upload-time = "2026-01-09T22:53:50.158Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c5/e6f9e3407dd73ec570000a64747ff84e2f57b06b0477d1da6eaca5038162/pikepdf-10.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:09ff28d1de7fc7711a7ef8dfc40396d9243b64ee24c37cd1ab2a9f9827895caa", size = 4737680, upload-time = "2026-01-09T22:53:54.905Z" }, + { url = "https://files.pythonhosted.org/packages/eb/de/dffb785235ac2d930db86b215c1848d7258e625fa1949dd0633f8b72ab0a/pikepdf-10.2.0-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:62348b66e1401a4db0c64976b72dd74bb1a9eb3a33007a661500f4f8a64436bd", size = 5042150, upload-time = "2026-01-09T22:53:57.722Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f0/4d883f57304d98650ade30a8c73fe593582d9afd9a7dada1f5f3f4cce362/pikepdf-10.2.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9e91780cb9ea3c6a350ffbcf03d5d95c30084d238afbd1d4b927cdb9e3649d", size = 2445446, upload-time = "2026-01-09T22:53:59.993Z" }, + { url = "https://files.pythonhosted.org/packages/62/65/ffe2555812a152d616accacea7c1c617c27a75590379ea7d9cc3a26bd92d/pikepdf-10.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52360a49a22e9353ec9a08ff5713cec8aacaf3ef960c704bc0a89ca8f050bdad", size = 2696242, upload-time = "2026-01-09T22:54:01.687Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/2f937b0e2867cd48b523122e08753571fc9847978e239d7b5db9bd46879c/pikepdf-10.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4c1046939eb22c24c396deb37f8e0500caaa66b73114be55377d5554b4167", size = 3643730, upload-time = "2026-01-09T22:54:04.177Z" }, + { url = "https://files.pythonhosted.org/packages/2e/17/f2919e4085c399e938bb945ea712dea70b3849e17cae6403f0cc1100e9ef/pikepdf-10.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3dcd8957a08e0a47f7a138904dca8cf73962fa17a096a47cd8bc33eb83a4f0a7", size = 3856645, upload-time = "2026-01-09T22:54:07.887Z" }, + { url = "https://files.pythonhosted.org/packages/1d/6e/846902abe8286d3b4ab70893e9ffbeec99aadd93ba1536cf471b222bb910/pikepdf-10.2.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:194c9a81ecb49e425a5cd5162621270b5e42cf05709d87eac018bd6f9ce98f80", size = 4733930, upload-time = "2026-01-09T22:54:11.931Z" }, + { url = "https://files.pythonhosted.org/packages/8b/6d/abdbb794d2a512d4e828ef2014cc47ca263ad3fbd1b65f25f791b9c0bb1e/pikepdf-10.2.0-cp314-cp314-macosx_15_0_x86_64.whl", hash = "sha256:5adcf87dbfff4e1cd0a850db487274f474c94a6bf6347f3842c53da8d0eaa8df", size = 5042477, upload-time = "2026-01-09T22:54:13.708Z" }, + { url = "https://files.pythonhosted.org/packages/52/6c/6c42694fe1574a37aa2a40b4ba29a6713b4226436155ef7aa0bef649c117/pikepdf-10.2.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5de3cecbb35c4bc651e9326932974217be1d450d4a9840d77a592062eb507e27", size = 2448419, upload-time = "2026-01-09T22:54:15.6Z" }, + { url = "https://files.pythonhosted.org/packages/45/f4/aca3286aa37ace581afc8e3e0644a0cc55b9f9ceb31f28219d12ca11536c/pikepdf-10.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77868fd25182a45a4f3dec3c461aea8c696ef9565894c5cde4394bc8c32fb069", size = 2697600, upload-time = "2026-01-09T22:54:18.123Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a6/9135f9f0189634de61410573a0712d849e0157e3902e6b867339cc7dbf1b/pikepdf-10.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9a10e15e2f4d0bba36a2b4328342d00eff1a5a31399e1d1a93483c70d3c2b0e", size = 3647720, upload-time = "2026-01-09T22:54:20.158Z" }, + { url = "https://files.pythonhosted.org/packages/83/60/f282077773a3321fad4cbfb16fe73ee3f8dd93b408df65c24779f12227c5/pikepdf-10.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a8f80ecf00fb15a760f218432a1046e7797cd14eaa6ccb52c8814ae8852745d8", size = 3859133, upload-time = "2026-01-09T22:54:22.358Z" }, ] [[package]] name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, ] [[package]] name = "platformdirs" -version = "4.4.0" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] [[package]] @@ -2624,41 +3350,33 @@ wheels = [ ] [[package]] -name = "pre-commit" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "identify", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "nodeenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "virtualenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, -] - -[[package]] -name = "pre-commit-uv" -version = "4.2.0" +name = "prek" +version = "0.3.5" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pre-commit", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "uv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/42/84372bc99a841bfdd8b182a50186471a7f5e873d8e8bcec0d0cb6dabcbb0/pre_commit_uv-4.2.0.tar.gz", hash = "sha256:c32bb1d90235507726eee2aeef2be5fdab431a6f1906e3f1addb0a4e99b369d1", size = 6912, upload-time = "2025-10-09T19:30:48.354Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/d6/277e002e56eeab3a9d48f1ca4cc067d249d6326fc1783b770d70ad5ae2be/prek-0.3.5.tar.gz", hash = "sha256:ca40b6685a4192256bc807f32237af94bf9b8799c0d708b98735738250685642", size = 374806, upload-time = "2026-03-09T10:35:18.842Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/9f/ec8491f6b3022489a4d36ce372214c10a34f90b425aa61ff2e0a8dc5b9d5/pre_commit_uv-4.2.0-py3-none-any.whl", hash = "sha256:cc1b56641e6c62d90a4d8b4f0af6f2610f1c397ce81af024e768c0f33715cb81", size = 5650, upload-time = "2025-10-09T19:30:47.257Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a9/16dd8d3a50362ebccffe58518af1f1f571c96f0695d7fcd8bbd386585f58/prek-0.3.5-py3-none-linux_armv6l.whl", hash = "sha256:44b3e12791805804f286d103682b42a84e0f98a2687faa37045e9d3375d3d73d", size = 5105604, upload-time = "2026-03-09T10:35:00.332Z" }, + { url = "https://files.pythonhosted.org/packages/e4/74/bc6036f5bf03860cda66ab040b32737e54802b71a81ec381839deb25df9e/prek-0.3.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3cb451cc51ac068974557491beb4c7d2d41dfde29ed559c1694c8ce23bf53e8", size = 5506155, upload-time = "2026-03-09T10:35:17.64Z" }, + { url = "https://files.pythonhosted.org/packages/02/d9/a3745c2a10509c63b6a118ada766614dd705efefd08f275804d5c807aa4a/prek-0.3.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ad8f5f0d8da53dc94d00b76979af312b3dacccc9dcbc6417756c5dca3633c052", size = 5100383, upload-time = "2026-03-09T10:35:13.302Z" }, + { url = "https://files.pythonhosted.org/packages/43/8e/de965fc515d39309a332789cd3778161f7bc80cde15070bedf17f9f8cb93/prek-0.3.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:4511e15d34072851ac88e4b2006868fbe13655059ad941d7a0ff9ee17138fd9f", size = 5334913, upload-time = "2026-03-09T10:35:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/44f07e8940256059cfd82520e3cbe0764ab06ddb4aa43148465db00b39ad/prek-0.3.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc0b63b8337e2046f51267facaac63ba755bc14aad53991840a5eccba3e5c28", size = 5033825, upload-time = "2026-03-09T10:35:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/94/85/3ff0f96881ff2360c212d310ff23c3cf5a15b223d34fcfa8cdcef203be69/prek-0.3.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5fc0d78c3896a674aeb8247a83bbda7efec85274dbdfbc978ceff8d37e4ed20", size = 5438586, upload-time = "2026-03-09T10:34:58.779Z" }, + { url = "https://files.pythonhosted.org/packages/79/a5/c6d08d31293400fcb5d427f8e7e6bacfc959988e868ad3a9d97b4d87c4b7/prek-0.3.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64cad21cb9072d985179495b77b312f6b81e7b45357d0c68dc1de66e0408eabc", size = 6359714, upload-time = "2026-03-09T10:34:57.454Z" }, + { url = "https://files.pythonhosted.org/packages/ba/18/321dcff9ece8065d42c8c1c7a53a23b45d2b4330aa70993be75dc5f2822f/prek-0.3.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45ee84199bb48e013bdfde0c84352c17a44cc42d5792681b86d94e9474aab6f8", size = 5717632, upload-time = "2026-03-09T10:35:08.634Z" }, + { url = "https://files.pythonhosted.org/packages/a3/7f/1288226aa381d0cea403157f4e6b64b356e1a745f2441c31dd9d8a1d63da/prek-0.3.5-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:f43275e5d564e18e52133129ebeb5cb071af7ce4a547766c7f025aa0955dfbb6", size = 5339040, upload-time = "2026-03-09T10:35:03.665Z" }, + { url = "https://files.pythonhosted.org/packages/22/94/cfec83df9c2b8e7ed1608087bcf9538a6a77b4c2e7365123e9e0a3162cd1/prek-0.3.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:abcee520d31522bcbad9311f21326b447694cd5edba33618c25fd023fc9865ec", size = 5162586, upload-time = "2026-03-09T10:35:11.564Z" }, + { url = "https://files.pythonhosted.org/packages/13/b7/741d62132f37a5f7cc0fad1168bd31f20dea9628f482f077f569547e0436/prek-0.3.5-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:499c56a94a155790c75a973d351a33f8065579d9094c93f6d451ada5d1e469be", size = 5002933, upload-time = "2026-03-09T10:35:16.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/83/630a5671df6550fcfa67c54955e8a8174eb9b4d97ac38fb05a362029245b/prek-0.3.5-py3-none-musllinux_1_1_i686.whl", hash = "sha256:de1065b59f194624adc9dea269d4ff6b50e98a1b5bb662374a9adaa496b3c1eb", size = 5304934, upload-time = "2026-03-09T10:35:09.975Z" }, + { url = "https://files.pythonhosted.org/packages/de/79/67a7afd0c0b6c436630b7dba6e586a42d21d5d6e5778fbd9eba7bbd3dd26/prek-0.3.5-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:a1c4869e45ee341735d07179da3a79fa2afb5959cef8b3c8a71906eb52dc6933", size = 5829914, upload-time = "2026-03-09T10:35:05.39Z" }, ] [[package]] name = "prometheus-client" -version = "0.23.1" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce", size = 80481, upload-time = "2025-09-18T20:47:25.043Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/58/a794d23feb6b00fc0c72787d7e87d872a6730dd9ed7c7b3e954637d8f280/prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9", size = 85616, upload-time = "2026-01-14T15:26:26.965Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99", size = 61145, upload-time = "2025-09-18T20:47:23.875Z" }, + { url = "https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055", size = 64057, upload-time = "2026-01-14T15:26:24.42Z" }, ] [[package]] @@ -2673,23 +3391,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, ] +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + [[package]] name = "psycopg" -version = "3.2.9" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/4a/93a6ab570a8d1a4ad171a1f4256e205ce48d828781312c0bbaff36380ecb/psycopg-3.2.9.tar.gz", hash = "sha256:2fbb46fcd17bc81f993f28c47f1ebea38d66ae97cc2dbc3cad73b37cefbff700", size = 158122, upload-time = "2025-05-13T16:11:15.533Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/bd/06dc36aeda16ffff129d03d90e75fd5e24222a719adcef37cd07f1926b06/psycopg-3.3.0.tar.gz", hash = "sha256:68950107fb8979d34bfc16b61560a26afe5d8dab96617881c87dfff58221df09", size = 165593, upload-time = "2025-12-01T11:35:07.076Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b0/a73c195a56eb6b92e937a5ca58521a5c3346fb233345adc80fd3e2f542e2/psycopg-3.2.9-py3-none-any.whl", hash = "sha256:01a8dadccdaac2123c916208c96e06631641c0566b22005493f09663c7a8d3b6", size = 202705, upload-time = "2025-05-13T16:06:26.584Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5d/3569bab5a92f33e4a1b3c3c16816718ef5cc306f55f3965a8cb630c496ac/psycopg-3.3.0-py3-none-any.whl", hash = "sha256:c9f070afeda682f6364f86cd77145f43feaf60648b2ce1f6e883e594d04cbea8", size = 212759, upload-time = "2025-12-01T11:21:15.91Z" }, ] [package.optional-dependencies] c = [ - { name = "psycopg-c", version = "3.2.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version != '3.12.*' and implementation_name != 'pypy' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and implementation_name != 'pypy' and platform_machine == 'x86_64' and sys_platform == 'linux') or (implementation_name != 'pypy' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (implementation_name != 'pypy' and sys_platform == 'darwin')" }, - { name = "psycopg-c", version = "3.2.9", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl" }, marker = "python_full_version == '3.12.*' and implementation_name != 'pypy' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, - { name = "psycopg-c", version = "3.2.9", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl" }, marker = "python_full_version == '3.12.*' and implementation_name != 'pypy' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "psycopg-c", version = "3.3.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version != '3.12.*' and implementation_name != 'pypy' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and implementation_name != 'pypy' and platform_machine == 'x86_64' and sys_platform == 'linux') or (implementation_name != 'pypy' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (implementation_name != 'pypy' and sys_platform == 'darwin')" }, + { name = "psycopg-c", version = "3.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl" }, marker = "python_full_version == '3.12.*' and implementation_name != 'pypy' and platform_machine == 'aarch64' and sys_platform == 'linux'" }, + { name = "psycopg-c", version = "3.3.0", source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl" }, marker = "python_full_version == '3.12.*' and implementation_name != 'pypy' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, ] pool = [ { name = "psycopg-pool", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2697,57 +3496,63 @@ pool = [ [[package]] name = "psycopg-c" -version = "3.2.9" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'darwin'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", - "python_full_version < '3.11' and sys_platform == 'linux'", + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and sys_platform == 'darwin'", + "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", + "python_full_version < '3.12' and sys_platform == 'linux'", ] -sdist = { url = "https://files.pythonhosted.org/packages/83/7f/6147cb842081b0b32692bf5a0fdf58e9ac95418ebac1184d4431ec44b85f/psycopg_c-3.2.9.tar.gz", hash = "sha256:8c9f654f20c6c56bddc4543a3caab236741ee94b6732ab7090b95605502210e2", size = 609538, upload-time = "2025-05-13T16:11:19.856Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/96/5a86ed5c23911ca62b4745529a6ead68f504f6ae717f98527c979290e823/psycopg_c-3.3.0.tar.gz", hash = "sha256:07372de01bf18b3ebec726d6bbeed73be1af40b342c364695e80e11ff75607e3", size = 623980, upload-time = "2025-12-01T11:34:31.923Z" } [[package]] name = "psycopg-c" -version = "3.2.9" -source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl" } +version = "3.3.0" +source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl" } resolution-markers = [ "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", ] wheels = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl", hash = "sha256:f045e0e0c532d95c9056329439d7c8578a32842be6d26c666a50bec447972e54" }, + { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:07b3848db40beb9458fe033ae3d6d227af98cb4312b7caa4afc1f4e84663e2d4" }, ] [[package]] name = "psycopg-c" -version = "3.2.9" -source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl" } +version = "3.3.0" +source = { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl" } resolution-markers = [ "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", ] wheels = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl", hash = "sha256:250c357319242da102047b04c5cc78af872dbf85c2cb05abf114e1fb5f207917" }, + { url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-trixie-3.3.0/psycopg_c-3.3.0-cp312-cp312-linux_x86_64.whl", hash = "sha256:9fe4cd5e57c6aea8de5298d47024db7485809eed64d0e92e653c732576ed451f" }, ] [[package]] name = "psycopg-pool" -version = "3.2.6" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/13/1e7850bb2c69a63267c3dbf37387d3f71a00fd0e2fa55c5db14d64ba1af4/psycopg_pool-3.2.6.tar.gz", hash = "sha256:0f92a7817719517212fbfe2fd58b8c35c1850cdd2a80d36b581ba2085d9148e5", size = 29770, upload-time = "2025-02-26T12:03:47.129Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/9a/9470d013d0d50af0da9c4251614aeb3c1823635cab3edc211e3839db0bcf/psycopg_pool-3.3.0.tar.gz", hash = "sha256:fa115eb2860bd88fce1717d75611f41490dec6135efb619611142b24da3f6db5", size = 31606, upload-time = "2025-12-01T11:34:33.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/fd/4feb52a55c1a4bd748f2acaed1903ab54a723c47f6d0242780f4d97104d4/psycopg_pool-3.2.6-py3-none-any.whl", hash = "sha256:5887318a9f6af906d041a0b1dc1c60f8f0dda8340c2572b74e10907b51ed5da7", size = 38252, upload-time = "2025-02-26T12:03:45.073Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c3/26b8a0908a9db249de3b4169692e1c7c19048a9bc41a4d3209cee7dbb758/psycopg_pool-3.3.0-py3-none-any.whl", hash = "sha256:2e44329155c410b5e8666372db44276a8b1ebd8c90f1c3026ebba40d4bc81063", size = 39995, upload-time = "2025-12-01T11:34:29.761Z" }, ] +[[package]] +name = "py-ubjson" +version = "0.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/28220d37e041fe1df03e857fe48f768dcd30cd151480bf6f00da8713214a/py-ubjson-0.16.1.tar.gz", hash = "sha256:b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69a5a482", size = 50316, upload-time = "2020-04-18T15:05:57.698Z" } + [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] [[package]] @@ -2764,11 +3569,107 @@ wheels = [ [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydantic-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-inspection", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, ] [[package]] @@ -2782,11 +3683,11 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/10/e8192be5f38f3e8e7e046716de4cae33d56fd5ae08927a823bb916be36c1/pyjwt-2.12.0.tar.gz", hash = "sha256:2f62390b667cd8257de560b850bb5a883102a388829274147f1d724453f8fb02", size = 102511, upload-time = "2026-03-12T17:15:30.831Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/15/70/70f895f404d363d291dcf62c12c85fdd47619ad9674ac0f53364d035925a/pyjwt-2.12.0-py3-none-any.whl", hash = "sha256:9bb459d1bdd0387967d287f5656bf7ec2b9a26645d1961628cda1764e087fd6e", size = 29700, upload-time = "2026-03-12T17:15:29.257Z" }, ] [package.optional-dependencies] @@ -2796,45 +3697,80 @@ crypto = [ [[package]] name = "pymdown-extensions" -version = "10.16.1" +version = "10.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b3/6d2b3f149bc5413b0a29761c2c5832d8ce904a1d7f621e86616d96f505cc/pymdown_extensions-10.16.1.tar.gz", hash = "sha256:aace82bcccba3efc03e25d584e6a22d27a8e17caa3f4dd9f207e49b787aa9a91", size = 853277, upload-time = "2025-07-28T16:19:34.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/6c/9e370934bfa30e889d12e61d0dae009991294f40055c238980066a7fbd83/pymdown_extensions-10.20.1.tar.gz", hash = "sha256:e7e39c865727338d434b55f1dd8da51febcffcaebd6e1a0b9c836243f660740a", size = 852860, upload-time = "2026-01-24T05:56:56.758Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/06/43084e6cbd4b3bc0e80f6be743b2e79fbc6eed8de9ad8c629939fa55d972/pymdown_extensions-10.16.1-py3-none-any.whl", hash = "sha256:d6ba157a6c03146a7fb122b2b9a121300056384eafeec9c9f9e584adfdb2a32d", size = 266178, upload-time = "2025-07-28T16:19:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/40/6d/b6ee155462a0156b94312bdd82d2b92ea56e909740045a87ccb98bf52405/pymdown_extensions-10.20.1-py3-none-any.whl", hash = "sha256:24af7feacbca56504b313b7b418c4f5e1317bb5fea60f03d57be7fcc40912aa0", size = 268768, upload-time = "2026-01-24T05:56:54.537Z" }, ] [[package]] name = "pyopenssl" -version = "25.1.0" +version = "26.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/8c/cd89ad05804f8e3c17dea8f178c3f40eeab5694c30e0c9f5bcd49f576fc3/pyopenssl-25.1.0.tar.gz", hash = "sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b", size = 179937, upload-time = "2025-05-17T16:28:31.31Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/11/a62e1d33b373da2b2c2cd9eb508147871c80f12b1cacde3c5d314922afdd/pyopenssl-26.0.0.tar.gz", hash = "sha256:f293934e52936f2e3413b89c6ce36df66a0b34ae1ea3a053b8c5020ff2f513fc", size = 185534, upload-time = "2026-03-15T14:28:26.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/28/2659c02301b9500751f8d42f9a6632e1508aa5120de5e43042b8b30f8d5d/pyopenssl-25.1.0-py3-none-any.whl", hash = "sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab", size = 56771, upload-time = "2025-05-17T16:28:29.197Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7d/d4f7d908fa8415571771b30669251d57c3cf313b36a856e6d7548ae01619/pyopenssl-26.0.0-py3-none-any.whl", hash = "sha256:df94d28498848b98cc1c0ffb8ef1e71e40210d3b0a8064c9d29571ed2904bf81", size = 57969, upload-time = "2026-03-15T14:28:24.864Z" }, +] + +[[package]] +name = "pypdfium2" +version = "5.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/01/be763b9081c7eb823196e7d13d9c145bf75ac43f3c1466de81c21c24b381/pypdfium2-5.6.0.tar.gz", hash = "sha256:bcb9368acfe3547054698abbdae68ba0cbd2d3bda8e8ee437e061deef061976d", size = 270714, upload-time = "2026-03-08T01:05:06.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/f6/9f9e190fe0e5a6b86b82f83bd8b5d3490348766062381140ca5cad8e00b1/pypdfium2-5.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e468c38997573f0e86f03273c2c1fbdea999de52ba43fee96acaa2f6b2ad35f7", size = 3412541, upload-time = "2026-03-08T01:04:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/e57492cb2228ba56ed57de1ff044c8ac114b46905f8b1445c33299ba0488/pypdfium2-5.6.0-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:ad3abddc5805424f962e383253ccad6a0d1d2ebd86afa9a9e1b9ca659773cd0d", size = 3592320, upload-time = "2026-03-08T01:04:27.509Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8a/8ab82e33e9c551494cbe1526ea250ca8cc4e9e98d6a4fc6b6f8d959aa1d1/pypdfium2-5.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b5eb9eae5c45076395454522ca26add72ba8bd1fe473e1e4721aa58521470c", size = 3596450, upload-time = "2026-03-08T01:04:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b5/602a792282312ccb158cc63849528079d94b0a11efdc61f2a359edfb41e9/pypdfium2-5.6.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:258624da8ef45cdc426e11b33e9d83f9fb723c1c201c6e0f4ab5a85966c6b876", size = 3325442, upload-time = "2026-03-08T01:04:30.886Z" }, + { url = "https://files.pythonhosted.org/packages/81/1f/9e48ec05ed8d19d736c2d1f23c1bd0f20673f02ef846a2576c69e237f15d/pypdfium2-5.6.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9367451c8a00931d6612db0822525a18c06f649d562cd323a719e46ac19c9bb", size = 3727434, upload-time = "2026-03-08T01:04:33.619Z" }, + { url = "https://files.pythonhosted.org/packages/33/90/0efd020928b4edbd65f4f3c2af0c84e20b43a3ada8fa6d04f999a97afe7a/pypdfium2-5.6.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a757869f891eac1cc1372e38a4aa01adac8abc8fe2a8a4e2ebf50595e3bf5937", size = 4139029, upload-time = "2026-03-08T01:04:36.08Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/a640b288a48dab1752281dd9b72c0679fccea107874e80a65a606b00efa9/pypdfium2-5.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:515be355222cc57ae9e62cd5c7c350b8e0c863efc539f80c7d75e2811ba45cb6", size = 3646387, upload-time = "2026-03-08T01:04:38.151Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/a344c19c01021eeb5d830c102e4fc9b1602f19c04aa7d11abbe2d188fd8e/pypdfium2-5.6.0-py3-none-manylinux_2_27_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c4753c7caf7d004211d7f57a21f10d127f5e0e5510a14d24bc073e7220a3ea", size = 3097212, upload-time = "2026-03-08T01:04:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/e48e13789ace22aeb9b7510904a1b1493ec588196e11bbacc122da330b3d/pypdfium2-5.6.0-py3-none-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c49729090281fdd85775fb8912c10bd19e99178efaa98f145ab06e7ce68554d2", size = 2965026, upload-time = "2026-03-08T01:04:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/cb/06/3100e44d4935f73af8f5d633d3bd40f0d36d606027085a0ef1f0566a6320/pypdfium2-5.6.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a4a1749a8d4afd62924a8d95cfa4f2e26fc32957ce34ac3b674be6f127ed252e", size = 4131431, upload-time = "2026-03-08T01:04:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/d8df63569ce9a66c8496057782eb8af78e0d28667922d62ec958434e3d4b/pypdfium2-5.6.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:36469ebd0fdffb7130ce45ed9c44f8232d91571c89eb851bd1633c64b6f6114f", size = 3747469, upload-time = "2026-03-08T01:04:46.702Z" }, + { url = "https://files.pythonhosted.org/packages/a6/47/fd2c6a67a49fade1acd719fbd11f7c375e7219912923ef2de0ea0ac1544e/pypdfium2-5.6.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da900df09be3cf546b637a127a7b6428fb22d705951d731269e25fd3adef457", size = 4337578, upload-time = "2026-03-08T01:04:49.007Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f5/836c83e54b01e09478c4d6bf4912651d6053c932250fcee953f5c72d8e4a/pypdfium2-5.6.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:45fccd5622233c5ec91a885770ae7dd4004d4320ac05a4ad8fa03a66dea40244", size = 4376104, upload-time = "2026-03-08T01:04:51.04Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7f/b940b6a1664daf8f9bad87c6c99b84effa3611615b8708d10392dc33036c/pypdfium2-5.6.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:282dc030e767cd61bd0299f9d581052b91188e2b87561489057a8e7963e7e0cb", size = 3929824, upload-time = "2026-03-08T01:04:53.544Z" }, + { url = "https://files.pythonhosted.org/packages/88/79/00267d92a6a58c229e364d474f5698efe446e0c7f4f152f58d0138715e99/pypdfium2-5.6.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:a1c1dfe950382c76a7bba1ba160ec5e40df8dd26b04a1124ae268fda55bc4cbe", size = 4270201, upload-time = "2026-03-08T01:04:55.81Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/b127f38aba41746bdf9ace15ba08411d7ef6ecba1326d529ba414eb1ed50/pypdfium2-5.6.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:43b0341ca6feb6c92e4b7a9eb4813e5466f5f5e8b6baeb14df0a94d5f312c00b", size = 4180793, upload-time = "2026-03-08T01:04:57.961Z" }, +] + +[[package]] +name = "pyrefly" +version = "0.55.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/c4/76e0797215e62d007f81f86c9c4fb5d6202685a3f5e70810f3fd94294f92/pyrefly-0.55.0.tar.gz", hash = "sha256:434c3282532dd4525c4840f2040ed0eb79b0ec8224fe18d957956b15471f2441", size = 5135682, upload-time = "2026-03-03T00:46:38.122Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/b0/16e50cf716784513648e23e726a24f71f9544aa4f86103032dcaa5ff71a2/pyrefly-0.55.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:49aafcefe5e2dd4256147db93e5b0ada42bff7d9a60db70e03d1f7055338eec9", size = 12210073, upload-time = "2026-03-03T00:46:15.51Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ad/89500c01bac3083383011600370289fbc67700c5be46e781787392628a3a/pyrefly-0.55.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2827426e6b28397c13badb93c0ede0fb0f48046a7a89e3d774cda04e8e2067cd", size = 11767474, upload-time = "2026-03-03T00:46:18.003Z" }, + { url = "https://files.pythonhosted.org/packages/78/68/4c66b260f817f304ead11176ff13985625f7c269e653304b4bdb546551af/pyrefly-0.55.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7346b2d64dc575bd61aa3bca854fbf8b5a19a471cbdb45e0ca1e09861b63488c", size = 33260395, upload-time = "2026-03-03T00:46:20.509Z" }, + { url = "https://files.pythonhosted.org/packages/47/09/10bd48c9f860064f29f412954126a827d60f6451512224912c265e26bbe6/pyrefly-0.55.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:233b861b4cff008b1aff62f4f941577ed752e4d0060834229eb9b6826e6973c9", size = 35848269, upload-time = "2026-03-03T00:46:23.418Z" }, + { url = "https://files.pythonhosted.org/packages/a9/39/bc65cdd5243eb2dfea25dd1321f9a5a93e8d9c3a308501c4c6c05d011585/pyrefly-0.55.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5aa85657d76da1d25d081a49f0e33c8fc3ec91c1a0f185a8ed393a5a3d9e178", size = 38449820, upload-time = "2026-03-03T00:46:26.309Z" }, ] [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, { name = "iniconfig", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pluggy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, ] [[package]] @@ -2853,40 +3789,40 @@ wheels = [ [[package]] name = "pytest-django" -version = "4.11.1" +version = "4.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/fb/55d580352db26eb3d59ad50c64321ddfe228d3d8ac107db05387a2fadf3a/pytest_django-4.11.1.tar.gz", hash = "sha256:a949141a1ee103cb0e7a20f1451d355f83f5e4a5d07bdd4dcfdd1fd0ff227991", size = 86202, upload-time = "2025-04-03T18:56:09.338Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/2b/db9a193df89e5660137f5428063bcc2ced7ad790003b26974adf5c5ceb3b/pytest_django-4.12.0.tar.gz", hash = "sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758", size = 91156, upload-time = "2026-02-14T18:40:49.235Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/ac/bd0608d229ec808e51a21044f3f2f27b9a37e7a0ebaca7247882e67876af/pytest_django-4.11.1-py3-none-any.whl", hash = "sha256:1b63773f648aa3d8541000c26929c1ea63934be1cfa674c76436966d73fe6a10", size = 25281, upload-time = "2025-04-03T18:56:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/83/a5/41d091f697c09609e7ef1d5d61925494e0454ebf51de7de05f0f0a728f1d/pytest_django-4.12.0-py3-none-any.whl", hash = "sha256:3ff300c49f8350ba2953b90297d23bf5f589db69545f56f1ec5f8cff5da83e85", size = 26123, upload-time = "2026-02-14T18:40:47.381Z" }, ] [[package]] name = "pytest-env" -version = "1.2.0" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, + { name = "python-dotenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/12/9c87d0ca45d5992473208bcef2828169fa7d39b8d7fc6e3401f5c08b8bf7/pytest_env-1.2.0.tar.gz", hash = "sha256:475e2ebe8626cee01f491f304a74b12137742397d6c784ea4bc258f069232b80", size = 8973, upload-time = "2025-10-09T19:15:47.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/56/a931c6f6194917ff44be41b8586e2ffd13a18fa70fb28d9800a4695befa5/pytest_env-1.5.0.tar.gz", hash = "sha256:db8994b9ce170f135a37acc09ac753a6fc697d15e691b576ed8d8ca261c40246", size = 15271, upload-time = "2026-02-17T18:31:39.095Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/98/822b924a4a3eb58aacba84444c7439fce32680592f394de26af9c76e2569/pytest_env-1.2.0-py3-none-any.whl", hash = "sha256:d7e5b7198f9b83c795377c09feefa45d56083834e60d04767efd64819fc9da00", size = 6251, upload-time = "2025-10-09T19:15:46.077Z" }, + { url = "https://files.pythonhosted.org/packages/61/af/99b52a8524983bfece35e51e65a0b517b22920c023e57855c95e744e19e4/pytest_env-1.5.0-py3-none-any.whl", hash = "sha256:89a15686ac837c9cd009a8a2d52bd55865e2f23c82094247915dae4540c87161", size = 10122, upload-time = "2026-02-17T18:31:37.496Z" }, ] [[package]] name = "pytest-httpx" -version = "0.35.0" +version = "0.36.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/89/5b12b7b29e3d0af3a4b9c071ee92fa25a9017453731a38f08ba01c280f4c/pytest_httpx-0.35.0.tar.gz", hash = "sha256:d619ad5d2e67734abfbb224c3d9025d64795d4b8711116b1a13f72a251ae511f", size = 54146, upload-time = "2024-11-28T19:16:54.237Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/5574834da9499066fa1a5ea9c336f94dba2eae02298d36dab192fcf95c86/pytest_httpx-0.36.0.tar.gz", hash = "sha256:9edb66a5fd4388ce3c343189bc67e7e1cb50b07c2e3fc83b97d511975e8a831b", size = 56793, upload-time = "2025-12-02T16:34:57.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/ed/026d467c1853dd83102411a78126b4842618e86c895f93528b0528c7a620/pytest_httpx-0.35.0-py3-none-any.whl", hash = "sha256:ee11a00ffcea94a5cbff47af2114d34c5b231c326902458deed73f9c459fd744", size = 19442, upload-time = "2024-11-28T19:16:52.787Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d2/1eb1ea9c84f0d2033eb0b49675afdc71aa4ea801b74615f00f3c33b725e3/pytest_httpx-0.36.0-py3-none-any.whl", hash = "sha256:bd4c120bb80e142df856e825ec9f17981effb84d159f9fa29ed97e2357c3a9c8", size = 20229, upload-time = "2025-12-02T16:34:56.45Z" }, ] [[package]] @@ -2954,20 +3890,20 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.1.1" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, ] [[package]] name = "python-gnupg" -version = "0.5.5" +version = "0.5.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/42/d0/72a14a79f26c6119b281f6ccc475a787432ef155560278e60df97ce68a86/python-gnupg-0.5.5.tar.gz", hash = "sha256:3fdcaf76f60a1b948ff8e37dc398d03cf9ce7427065d583082b92da7a4ff5a63", size = 66467, upload-time = "2025-08-04T19:26:55.778Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/2c/6cd2c7cff4bdbb434be5429ef6b8e96ee6b50155551361f30a1bb2ea3c1d/python_gnupg-0.5.6.tar.gz", hash = "sha256:5743e96212d38923fc19083812dc127907e44dbd3bcf0db4d657e291d3c21eac", size = 66825, upload-time = "2025-12-31T17:19:33.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/19/c147f78cc18c8788f54d4a16a22f6c05deba85ead5672d3ddf6dcba5a5fe/python_gnupg-0.5.5-py2.py3-none-any.whl", hash = "sha256:51fa7b8831ff0914bc73d74c59b99c613de7247b91294323c39733bb85ac3fc1", size = 21916, upload-time = "2025-08-04T19:26:54.307Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ab/0ea9de971caf3cd2e268d2b05dfe9883b21cfe686a59249bd2dccb4bae33/python_gnupg-0.5.6-py2.py3-none-any.whl", hash = "sha256:b5050a55663d8ab9fcc8d97556d229af337a87a3ebebd7054cbd8b7e2043394a", size = 22082, upload-time = "2025-12-31T17:16:22.743Z" }, ] [[package]] @@ -2997,60 +3933,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] -[[package]] -name = "pywavelets" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/45/bfaaab38545a33a9f06c61211fc3bea2e23e8a8e00fedeb8e57feda722ff/pywavelets-1.8.0.tar.gz", hash = "sha256:f3800245754840adc143cbc29534a1b8fc4b8cff6e9d403326bd52b7bb5c35aa", size = 3935274, upload-time = "2024-12-04T19:54:20.593Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/7e/c5e398f25c70558ca195dd4144ee004666401f6167084c1e76059d7e68d8/pywavelets-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f5c86fcb203c8e61d1f3d4afbfc08d626c64e4e3708207315577264c724632bf", size = 4323291, upload-time = "2024-12-04T19:53:01.836Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d7/2fc8067c3520ce25f7632b0f47b89d1b75653cab804a42700e95126f2679/pywavelets-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafb5fa126277e1690c3d6329287122fc08e4d25a262ce126e3d81b1f5709308", size = 4291864, upload-time = "2024-12-04T19:53:04.659Z" }, - { url = "https://files.pythonhosted.org/packages/2f/17/a868aa26e45c104613d9069f9d8ec0123687cb6945062d274f20a3992436/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec23dfe6d5a3f4312b12456b8c546aa90a11c1138e425a885987505f0658ae0", size = 4447532, upload-time = "2024-12-04T19:53:06.383Z" }, - { url = "https://files.pythonhosted.org/packages/53/7a/7f5889a57177e2b1182080fc2c52236d1e03a0fad5e0b3d7c5312070c0be/pywavelets-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:880a0197e9fa108939af50a95e97c1bf9b7d3e148e0fad92ea60a9ed8c8947c0", size = 4487695, upload-time = "2024-12-04T19:53:08.84Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e6/04d76d93c158919ef0d8e1d40d1d453168305031eca6733fdc844f7cbb07/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bfa833d08b60d0bf53a7939fbbf3d98015dd34efe89cbe4e53ced880d085fc1", size = 4473752, upload-time = "2024-12-04T19:53:10.848Z" }, - { url = "https://files.pythonhosted.org/packages/3b/a7/42ea5bbb6055abd312e45b27d931200fd6eed5414a87ec5d62020a4c651b/pywavelets-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e10c3fc7f4a796e94da4bca9871be2186a7bb7a3b3536a0ca9376d84263140f0", size = 4504191, upload-time = "2024-12-04T19:53:13.912Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8a/9f8e794120b55caa1c4ae8d72696111bc408251615f351a8e54a5d8c4d4e/pywavelets-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e8dd5be4faed994581a8a4b3c0169be20567a9346e523f0b57f903c8f6722bce", size = 4324170, upload-time = "2024-12-04T19:53:19.66Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b8/f6246be5c78e9fa73fcbba9ab4cbfe0d4dcb79ea5491f28d673a53466134/pywavelets-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d8abaf7c120b151ef309c9ff57e0a44ba9febf49045056dbc1577526ecec6c8", size = 4294254, upload-time = "2024-12-04T19:53:21.767Z" }, - { url = "https://files.pythonhosted.org/packages/2c/dc/ba1f212e9b43117ed28e0fd092e72e817790427400f88937ea742d260153/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b43a4c58707b1e8d941bec7f1d83e67c482278575ff0db3189d5c0dfae23a57", size = 4447178, upload-time = "2024-12-04T19:53:23.525Z" }, - { url = "https://files.pythonhosted.org/packages/58/10/e59c162a11d2fedb4454abbf7b74a52390aba5edc9605bf829bfa8708dac/pywavelets-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1aad0b97714e3079a2bfe48e4fb8ccd60778d0427e9ee5e0a9ff922e6c61e4", size = 4486799, upload-time = "2024-12-04T19:53:25.238Z" }, - { url = "https://files.pythonhosted.org/packages/03/ee/90c3d0a0a3bda74e6e097e4c06bff9446ff2a4c90b8617aaf4902c46966b/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0e1db96dcf3ce08156859df8b359e9ff66fa15061a1b90e70e020bf4cd077a0", size = 4486403, upload-time = "2024-12-04T19:53:26.954Z" }, - { url = "https://files.pythonhosted.org/packages/05/54/58b87f8b636a9f044f3f9814d2ec696cf25f3b33af97c11811f13c364085/pywavelets-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e62c8fb52ab0e8ff212fff9acae681a8f12d68b76c36fe24cc48809d5b6825ba", size = 4515011, upload-time = "2024-12-04T19:53:28.832Z" }, - { url = "https://files.pythonhosted.org/packages/2d/8b/4870f11559307416470158a5aa6f61e5c2a910f1645a7a836ffae580b7ad/pywavelets-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3f431c9e2aff1a2240765eff5e804975d0fcc24c82d6f3d4271243f228e5963b", size = 4326187, upload-time = "2024-12-04T19:53:35.19Z" }, - { url = "https://files.pythonhosted.org/packages/c4/35/66835d889fd7fbf3119c7a9bd9d9bd567fc0bb603dfba408e9226db7cb44/pywavelets-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e39b0e2314e928cb850ee89b9042733a10ea044176a495a54dc84d2c98407a51", size = 4295428, upload-time = "2024-12-04T19:53:36.962Z" }, - { url = "https://files.pythonhosted.org/packages/63/1c/42e5130226538c70d4bbbaee00eb1bc06ec3287f7ea43d5fcf85bfc761ce/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cae701117f5c7244b7c8d48b9e92a0289637cdc02a9c205e8be83361f0c11fae", size = 4421259, upload-time = "2024-12-04T19:53:39.119Z" }, - { url = "https://files.pythonhosted.org/packages/6f/c5/1ce93657432e22a5debc21e8b52ec6980f819ecb7fa727bb86744224d967/pywavelets-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649936baee933e80083788e0adc4d8bc2da7cdd8b10464d3b113475be2cc5308", size = 4447650, upload-time = "2024-12-04T19:53:41.589Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d6/b54ef30daca71824f811f9d2322a978b0a58d27674b8e3af6520f67e9ec6/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8c68e9d072c536bc646e8bdce443bb1826eeb9aa21b2cb2479a43954dea692a3", size = 4448538, upload-time = "2024-12-04T19:53:44.308Z" }, - { url = "https://files.pythonhosted.org/packages/ce/8c/1688b790e55674667ad644262f174405c2c9873cb13e773432e78b1b33e4/pywavelets-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:63f67fa2ee1610445de64f746fb9c1df31980ad13d896ea2331fc3755f49b3ae", size = 4485228, upload-time = "2024-12-04T19:53:46.778Z" }, - { url = "https://files.pythonhosted.org/packages/94/73/7ff347d77c6bda11330565050c3346c54bc210086380abeb84e402c1c9cd/pywavelets-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:441ba45c8dff8c6916dbe706958d0d7f91da675695ca0c0d75e483f6f52d0a12", size = 4321474, upload-time = "2024-12-04T19:53:53.369Z" }, - { url = "https://files.pythonhosted.org/packages/b0/70/c58937ebbca1aba3475ca5ee63c7bcebf09f3c93891ae5942eaec7e95707/pywavelets-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:24bb282bab09349d9d128ed0536fa50fff5c2147891971a69c2c36155dfeeeac", size = 4291502, upload-time = "2024-12-04T19:53:55.396Z" }, - { url = "https://files.pythonhosted.org/packages/da/55/87b4ad6128b2e85985908e958e856e0b680cdcc03cc490e2cc995164b13a/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426ff3799446cb4da1db04c2084e6e58edfe24225596805665fd39c14f53dece", size = 4412669, upload-time = "2024-12-04T19:53:57.393Z" }, - { url = "https://files.pythonhosted.org/packages/bf/1a/bfca9eab23bd7b27843b0ce95c47796033a7b2c93048315f5fc5d6ac6428/pywavelets-1.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0607a9c085b8285bc0d04e33d461a6c80f8c325389221ffb1a45141861138e", size = 4454604, upload-time = "2024-12-04T19:53:59.105Z" }, - { url = "https://files.pythonhosted.org/packages/c3/23/9ce38829f57159e812c469c4f9d7b5a16c1ba922c1802985e8c504468206/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d31c36a39110e8fcc7b1a4a11cfed7d22b610c285d3e7f4fe73ec777aa49fa39", size = 4445507, upload-time = "2024-12-04T19:54:00.78Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d2/e78a976b0600a6ef7a70f4430122d6ad11b3e1cbda3c8b3565661d094678/pywavelets-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa7c68ed1e5bab23b1bafe60ccbcf709b878652d03de59e961baefa5210fcd0a", size = 4479078, upload-time = "2024-12-04T19:54:02.46Z" }, - { url = "https://files.pythonhosted.org/packages/de/2a/4cac0bba67d3bc0ad697d0680539864db0a6964c7ad953d8d9d887f360b3/pywavelets-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:2e1c79784bebeafd3715c1bea6621daa2e2e6ed37b687719322e2078fb35bb70", size = 4335183, upload-time = "2024-12-04T19:54:08.349Z" }, - { url = "https://files.pythonhosted.org/packages/58/d1/3abe4cf34a35b09ad847f0e9a85f340c1988611222926d295fa8710659e7/pywavelets-1.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f489380c95013cc8fb3ef338f6d8c1a907125db453cc4dc739e2cca06fcd8b6", size = 4454723, upload-time = "2024-12-04T19:54:11.007Z" }, - { url = "https://files.pythonhosted.org/packages/d5/62/f05dd191232ae94e0b48509bb0ee65c9d45abf5e8f3612b09fd309b41384/pywavelets-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:06786201a91b5e74540f4f3c115c49a29190de2eb424823abbd3a1fd75ea3e28", size = 4472192, upload-time = "2024-12-04T19:54:12.754Z" }, -] - [[package]] name = "pywavelets" version = "1.9.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", -] dependencies = [ - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/75/50581633d199812205ea8cdd0f6d52f12a624886b74bf1486335b67f01ff/pywavelets-1.9.0.tar.gz", hash = "sha256:148d12203377772bea452a59211d98649c8ee4a05eff019a9021853a36babdc8", size = 3938340, upload-time = "2025-08-04T16:20:04.978Z" } wheels = [ @@ -3098,13 +3986,6 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, @@ -3142,26 +4023,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, ] -[[package]] -name = "pyyaml-env-tag" -version = "1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, -] - -[[package]] -name = "pyzbar" -version = "0.1.9" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/24/81ebe6a1c00760471a3028a23cbe0b94e5fa2926e5ba47adc895920887bc/pyzbar-0.1.9-py2.py3-none-any.whl", hash = "sha256:4559628b8192feb25766d954b36a3753baaf5c97c03135aec7e4a026036b475d", size = 32560, upload-time = "2022-03-15T14:53:40.637Z" }, -] - [[package]] name = "qrcode" version = "8.2" @@ -3173,78 +4034,62 @@ wheels = [ [[package]] name = "rapidfuzz" -version = "3.14.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/fc/a98b616db9a42dcdda7c78c76bdfdf6fe290ac4c5ffbb186f73ec981ad5b/rapidfuzz-3.14.1.tar.gz", hash = "sha256:b02850e7f7152bd1edff27e9d584505b84968cacedee7a734ec4050c655a803c", size = 57869570, upload-time = "2025-09-08T21:08:15.922Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/b9/4e35178f405a1a95abd37cce4dc09d4a5bbc5e098687680b5ba796d3115b/rapidfuzz-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:489440e4b5eea0d150a31076eb183bed0ec84f934df206c72ae4fc3424501758", size = 1939645, upload-time = "2025-09-08T21:05:16.569Z" }, - { url = "https://files.pythonhosted.org/packages/51/af/fd7b8662a3b6952559af322dcf1c9d4eb5ec6be2697c30ae8ed3c44876ca/rapidfuzz-3.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eff22cc938c3f74d194df03790a6c3325d213b28cf65cdefd6fdeae759b745d5", size = 1393620, upload-time = "2025-09-08T21:05:18.598Z" }, - { url = "https://files.pythonhosted.org/packages/c5/5b/5715445e29c1c6ba364b3d27278da3fdffb18d9147982e977c6638dcecbf/rapidfuzz-3.14.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0307f018b16feaa36074bcec2496f6f120af151a098910296e72e233232a62f", size = 1387721, upload-time = "2025-09-08T21:05:20.408Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/83a14a6a90982b090257c4b2e96b9b9c423a89012b8504d5a14d92a4f8c2/rapidfuzz-3.14.1-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bc133652da143aca1ab72de235446432888b2b7f44ee332d006f8207967ecb8a", size = 1694545, upload-time = "2025-09-08T21:05:22.137Z" }, - { url = "https://files.pythonhosted.org/packages/99/f7/94618fcaaac8c04abf364f405c6811a02bc9edef209f276dc513a9a50f7c/rapidfuzz-3.14.1-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e9e71b3fe7e4a1590843389a90fe2a8684649fc74b9b7446e17ee504ddddb7de", size = 2237075, upload-time = "2025-09-08T21:05:23.637Z" }, - { url = "https://files.pythonhosted.org/packages/58/f6/a5ee2db25f36b0e5e06502fb77449b7718cd9f92ad36d598e669ba91db7b/rapidfuzz-3.14.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c51519eb2f20b52eba6fc7d857ae94acc6c2a1f5d0f2d794b9d4977cdc29dd7", size = 3168778, upload-time = "2025-09-08T21:05:25.508Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e8/c9620e358805c099e6755b7d2827b1e711b5e61914d6112ce2faa2c2af79/rapidfuzz-3.14.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:fe87d94602624f8f25fff9a0a7b47f33756c4d9fc32b6d3308bb142aa483b8a4", size = 1223827, upload-time = "2025-09-08T21:05:27.299Z" }, - { url = "https://files.pythonhosted.org/packages/84/08/24916c3c3d55d6236474c9da0a595641d0013d3604de0625e8a8974371c3/rapidfuzz-3.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2d665380503a575dda52eb712ea521f789e8f8fd629c7a8e6c0f8ff480febc78", size = 2408366, upload-time = "2025-09-08T21:05:28.808Z" }, - { url = "https://files.pythonhosted.org/packages/40/d4/4152e8821b5c548443a6c46568fccef13de5818a5ab370d553ea3d5955b3/rapidfuzz-3.14.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0f0dd022b8a7cbf3c891f6de96a80ab6a426f1069a085327816cea749e096c2", size = 2530148, upload-time = "2025-09-08T21:05:30.782Z" }, - { url = "https://files.pythonhosted.org/packages/bd/af/6587c6d590abe232c530ad43fbfbcaec899bff7204e237f1fd21e2e44b81/rapidfuzz-3.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf1ba22d36858b265c95cd774ba7fe8991e80a99cd86fe4f388605b01aee81a3", size = 2810628, upload-time = "2025-09-08T21:05:32.844Z" }, - { url = "https://files.pythonhosted.org/packages/d7/90/a99e6cfd90feb9d770654f1f39321099bbbf7f85d2832f2ef48d3f4ebc5f/rapidfuzz-3.14.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ca1c1494ac9f9386d37f0e50cbaf4d07d184903aed7691549df1b37e9616edc9", size = 3314406, upload-time = "2025-09-08T21:05:34.585Z" }, - { url = "https://files.pythonhosted.org/packages/5f/b3/eba5a6c217200fd1d3615997930a9e5db6a74e3002b7867b54545f9b5cbb/rapidfuzz-3.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9e4b12e921b0fa90d7c2248742a536f21eae5562174090b83edd0b4ab8b557d7", size = 4280030, upload-time = "2025-09-08T21:05:36.646Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c7/c3c860d512606225c11c8ee455b4dc0b0214dbcfac90a2c22dddf55320f3/rapidfuzz-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d976701060886a791c8a9260b1d4139d14c1f1e9a6ab6116b45a1acf3baff67", size = 1938398, upload-time = "2025-09-08T21:05:44.031Z" }, - { url = "https://files.pythonhosted.org/packages/c0/f3/67f5c5cd4d728993c48c1dcb5da54338d77c03c34b4903cc7839a3b89faf/rapidfuzz-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e6ba7e6eb2ab03870dcab441d707513db0b4264c12fba7b703e90e8b4296df2", size = 1392819, upload-time = "2025-09-08T21:05:45.549Z" }, - { url = "https://files.pythonhosted.org/packages/d5/06/400d44842f4603ce1bebeaeabe776f510e329e7dbf6c71b6f2805e377889/rapidfuzz-3.14.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e532bf46de5fd3a1efde73a16a4d231d011bce401c72abe3c6ecf9de681003f", size = 1391798, upload-time = "2025-09-08T21:05:47.044Z" }, - { url = "https://files.pythonhosted.org/packages/90/97/a6944955713b47d88e8ca4305ca7484940d808c4e6c4e28b6fa0fcbff97e/rapidfuzz-3.14.1-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f9b6a6fb8ed9b951e5f3b82c1ce6b1665308ec1a0da87f799b16e24fc59e4662", size = 1699136, upload-time = "2025-09-08T21:05:48.919Z" }, - { url = "https://files.pythonhosted.org/packages/a8/1e/f311a5c95ddf922db6dd8666efeceb9ac69e1319ed098ac80068a4041732/rapidfuzz-3.14.1-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b6ac3f9810949caef0e63380b11a3c32a92f26bacb9ced5e32c33560fcdf8d1", size = 2236238, upload-time = "2025-09-08T21:05:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/85/27/e14e9830255db8a99200f7111b158ddef04372cf6332a415d053fe57cc9c/rapidfuzz-3.14.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e52e4c34fd567f77513e886b66029c1ae02f094380d10eba18ba1c68a46d8b90", size = 3183685, upload-time = "2025-09-08T21:05:52.362Z" }, - { url = "https://files.pythonhosted.org/packages/61/b2/42850c9616ddd2887904e5dd5377912cbabe2776fdc9fd4b25e6e12fba32/rapidfuzz-3.14.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:2ef72e41b1a110149f25b14637f1cedea6df192462120bea3433980fe9d8ac05", size = 1231523, upload-time = "2025-09-08T21:05:53.927Z" }, - { url = "https://files.pythonhosted.org/packages/de/b5/6b90ed7127a1732efef39db46dd0afc911f979f215b371c325a2eca9cb15/rapidfuzz-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fb654a35b373d712a6b0aa2a496b2b5cdd9d32410cfbaecc402d7424a90ba72a", size = 2415209, upload-time = "2025-09-08T21:05:55.422Z" }, - { url = "https://files.pythonhosted.org/packages/70/60/af51c50d238c82f2179edc4b9f799cc5a50c2c0ebebdcfaa97ded7d02978/rapidfuzz-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2b2c12e5b9eb8fe9a51b92fe69e9ca362c0970e960268188a6d295e1dec91e6d", size = 2532957, upload-time = "2025-09-08T21:05:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/50/92/29811d2ba7c984251a342c4f9ccc7cc4aa09d43d800af71510cd51c36453/rapidfuzz-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4f069dec5c450bd987481e752f0a9979e8fdf8e21e5307f5058f5c4bb162fa56", size = 2815720, upload-time = "2025-09-08T21:05:58.618Z" }, - { url = "https://files.pythonhosted.org/packages/78/69/cedcdee16a49e49d4985eab73b59447f211736c5953a58f1b91b6c53a73f/rapidfuzz-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4d0d9163725b7ad37a8c46988cae9ebab255984db95ad01bf1987ceb9e3058dd", size = 3323704, upload-time = "2025-09-08T21:06:00.576Z" }, - { url = "https://files.pythonhosted.org/packages/76/3e/5a3f9a5540f18e0126e36f86ecf600145344acb202d94b63ee45211a18b8/rapidfuzz-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db656884b20b213d846f6bc990c053d1f4a60e6d4357f7211775b02092784ca1", size = 4287341, upload-time = "2025-09-08T21:06:02.301Z" }, - { url = "https://files.pythonhosted.org/packages/df/77/2f4887c9b786f203e50b816c1cde71f96642f194e6fa752acfa042cf53fd/rapidfuzz-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:809515194f628004aac1b1b280c3734c5ea0ccbd45938c9c9656a23ae8b8f553", size = 1932216, upload-time = "2025-09-08T21:06:09.342Z" }, - { url = "https://files.pythonhosted.org/packages/de/bd/b5e445d156cb1c2a87d36d8da53daf4d2a1d1729b4851660017898b49aa0/rapidfuzz-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0afcf2d6cb633d0d4260d8df6a40de2d9c93e9546e2c6b317ab03f89aa120ad7", size = 1393414, upload-time = "2025-09-08T21:06:10.959Z" }, - { url = "https://files.pythonhosted.org/packages/de/bd/98d065dd0a4479a635df855616980eaae1a1a07a876db9400d421b5b6371/rapidfuzz-3.14.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1c3d07d53dcafee10599da8988d2b1f39df236aee501ecbd617bd883454fcd", size = 1377194, upload-time = "2025-09-08T21:06:12.471Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8a/1265547b771128b686f3c431377ff1db2fa073397ed082a25998a7b06d4e/rapidfuzz-3.14.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e9ee3e1eb0a027717ee72fe34dc9ac5b3e58119f1bd8dd15bc19ed54ae3e62b", size = 1669573, upload-time = "2025-09-08T21:06:14.016Z" }, - { url = "https://files.pythonhosted.org/packages/a8/57/e73755c52fb451f2054196404ccc468577f8da023b3a48c80bce29ee5d4a/rapidfuzz-3.14.1-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:70c845b64a033a20c44ed26bc890eeb851215148cc3e696499f5f65529afb6cb", size = 2217833, upload-time = "2025-09-08T21:06:15.666Z" }, - { url = "https://files.pythonhosted.org/packages/20/14/7399c18c460e72d1b754e80dafc9f65cb42a46cc8f29cd57d11c0c4acc94/rapidfuzz-3.14.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26db0e815213d04234298dea0d884d92b9cb8d4ba954cab7cf67a35853128a33", size = 3159012, upload-time = "2025-09-08T21:06:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/f8/5e/24f0226ddb5440cabd88605d2491f99ae3748a6b27b0bc9703772892ced7/rapidfuzz-3.14.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:6ad3395a416f8b126ff11c788531f157c7debeb626f9d897c153ff8980da10fb", size = 1227032, upload-time = "2025-09-08T21:06:21.06Z" }, - { url = "https://files.pythonhosted.org/packages/40/43/1d54a4ad1a5fac2394d5f28a3108e2bf73c26f4f23663535e3139cfede9b/rapidfuzz-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:61c5b9ab6f730e6478aa2def566223712d121c6f69a94c7cc002044799442afd", size = 2395054, upload-time = "2025-09-08T21:06:23.482Z" }, - { url = "https://files.pythonhosted.org/packages/0c/71/e9864cd5b0f086c4a03791f5dfe0155a1b132f789fe19b0c76fbabd20513/rapidfuzz-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:13e0ea3d0c533969158727d1bb7a08c2cc9a816ab83f8f0dcfde7e38938ce3e6", size = 2524741, upload-time = "2025-09-08T21:06:26.825Z" }, - { url = "https://files.pythonhosted.org/packages/b2/0c/53f88286b912faf4a3b2619a60df4f4a67bd0edcf5970d7b0c1143501f0c/rapidfuzz-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6325ca435b99f4001aac919ab8922ac464999b100173317defb83eae34e82139", size = 2785311, upload-time = "2025-09-08T21:06:29.471Z" }, - { url = "https://files.pythonhosted.org/packages/53/9a/229c26dc4f91bad323f07304ee5ccbc28f0d21c76047a1e4f813187d0bad/rapidfuzz-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:07a9fad3247e68798424bdc116c1094e88ecfabc17b29edf42a777520347648e", size = 3303630, upload-time = "2025-09-08T21:06:31.094Z" }, - { url = "https://files.pythonhosted.org/packages/05/de/20e330d6d58cbf83da914accd9e303048b7abae2f198886f65a344b69695/rapidfuzz-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8ff5dbe78db0a10c1f916368e21d328935896240f71f721e073cf6c4c8cdedd", size = 4262364, upload-time = "2025-09-08T21:06:32.877Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f2/0024cc8eead108c4c29337abe133d72ddf3406ce9bbfbcfc110414a7ea07/rapidfuzz-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8d69f470d63ee824132ecd80b1974e1d15dd9df5193916901d7860cef081a260", size = 1926515, upload-time = "2025-09-08T21:06:39.834Z" }, - { url = "https://files.pythonhosted.org/packages/12/ae/6cb211f8930bea20fa989b23f31ee7f92940caaf24e3e510d242a1b28de4/rapidfuzz-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6f571d20152fc4833b7b5e781b36d5e4f31f3b5a596a3d53cf66a1bd4436b4f4", size = 1388431, upload-time = "2025-09-08T21:06:41.73Z" }, - { url = "https://files.pythonhosted.org/packages/39/88/bfec24da0607c39e5841ced5594ea1b907d20f83adf0e3ee87fa454a425b/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61d77e09b2b6bc38228f53b9ea7972a00722a14a6048be9a3672fb5cb08bad3a", size = 1375664, upload-time = "2025-09-08T21:06:43.737Z" }, - { url = "https://files.pythonhosted.org/packages/f4/43/9f282ba539e404bdd7052c7371d3aaaa1a9417979d2a1d8332670c7f385a/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b41d95ef86a6295d353dc3bb6c80550665ba2c3bef3a9feab46074d12a9af8f", size = 1668113, upload-time = "2025-09-08T21:06:45.758Z" }, - { url = "https://files.pythonhosted.org/packages/7f/2f/0b3153053b1acca90969eb0867922ac8515b1a8a48706a3215c2db60e87c/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0591df2e856ad583644b40a2b99fb522f93543c65e64b771241dda6d1cfdc96b", size = 2212875, upload-time = "2025-09-08T21:06:47.447Z" }, - { url = "https://files.pythonhosted.org/packages/f8/9b/623001dddc518afaa08ed1fbbfc4005c8692b7a32b0f08b20c506f17a770/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f277801f55b2f3923ef2de51ab94689a0671a4524bf7b611de979f308a54cd6f", size = 3161181, upload-time = "2025-09-08T21:06:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b7/d8404ed5ad56eb74463e5ebf0a14f0019d7eb0e65e0323f709fe72e0884c/rapidfuzz-3.14.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:893fdfd4f66ebb67f33da89eb1bd1674b7b30442fdee84db87f6cb9074bf0ce9", size = 1225495, upload-time = "2025-09-08T21:06:51.056Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6c/b96af62bc7615d821e3f6b47563c265fd7379d7236dfbc1cbbcce8beb1d2/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fe2651258c1f1afa9b66f44bf82f639d5f83034f9804877a1bbbae2120539ad1", size = 2396294, upload-time = "2025-09-08T21:06:53.063Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b7/c60c9d22a7debed8b8b751f506a4cece5c22c0b05e47a819d6b47bc8c14e/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ace21f7a78519d8e889b1240489cd021c5355c496cb151b479b741a4c27f0a25", size = 2529629, upload-time = "2025-09-08T21:06:55.188Z" }, - { url = "https://files.pythonhosted.org/packages/25/94/a9ec7ccb28381f14de696ffd51c321974762f137679df986f5375d35264f/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cb5acf24590bc5e57027283b015950d713f9e4d155fda5cfa71adef3b3a84502", size = 2782960, upload-time = "2025-09-08T21:06:57.339Z" }, - { url = "https://files.pythonhosted.org/packages/68/80/04e5276d223060eca45250dbf79ea39940c0be8b3083661d58d57572c2c5/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:67ea46fa8cc78174bad09d66b9a4b98d3068e85de677e3c71ed931a1de28171f", size = 3298427, upload-time = "2025-09-08T21:06:59.319Z" }, - { url = "https://files.pythonhosted.org/packages/4a/63/24759b2a751562630b244e68ccaaf7a7525c720588fcc77c964146355aee/rapidfuzz-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:44e741d785de57d1a7bae03599c1cbc7335d0b060a35e60c44c382566e22782e", size = 4267736, upload-time = "2025-09-08T21:07:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cb/1ad9a76d974d153783f8e0be8dbe60ec46488fac6e519db804e299e0da06/rapidfuzz-3.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d937dbeda71c921ef6537c6d41a84f1b8112f107589c9977059de57a1d726dd6", size = 1945173, upload-time = "2025-09-08T21:07:08.893Z" }, - { url = "https://files.pythonhosted.org/packages/d9/61/959ed7460941d8a81cbf6552b9c45564778a36cf5e5aa872558b30fc02b2/rapidfuzz-3.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a2d80cc1a4fcc7e259ed4f505e70b36433a63fa251f1bb69ff279fe376c5efd", size = 1413949, upload-time = "2025-09-08T21:07:11.033Z" }, - { url = "https://files.pythonhosted.org/packages/d6/36/53debca45fbe693bd6181fb05b6a2fd561c87669edb82ec0d7c1961a43f0/rapidfuzz-3.14.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e84d9a844dc2e4d5c4cabd14c096374ead006583304333c14a6fbde51f612a44", size = 1926336, upload-time = "2025-09-08T21:07:18.809Z" }, - { url = "https://files.pythonhosted.org/packages/ae/32/b874f48609665fcfeaf16cbaeb2bbc210deef2b88e996c51cfc36c3eb7c3/rapidfuzz-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:40301b93b99350edcd02dbb22e37ca5f2a75d0db822e9b3c522da451a93d6f27", size = 1389653, upload-time = "2025-09-08T21:07:20.667Z" }, - { url = "https://files.pythonhosted.org/packages/97/25/f6c5a1ff4ec11edadacb270e70b8415f51fa2f0d5730c2c552b81651fbe3/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fedd5097a44808dddf341466866e5c57a18a19a336565b4ff50aa8f09eb528f6", size = 1380911, upload-time = "2025-09-08T21:07:22.584Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f3/d322202ef8fab463759b51ebfaa33228100510c82e6153bd7a922e150270/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e3e61c9e80d8c26709d8aa5c51fdd25139c81a4ab463895f8a567f8347b0548", size = 1673515, upload-time = "2025-09-08T21:07:24.417Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b9/6b2a97f4c6be96cac3749f32301b8cdf751ce5617b1c8934c96586a0662b/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da011a373722fac6e64687297a1d17dc8461b82cb12c437845d5a5b161bc24b9", size = 2219394, upload-time = "2025-09-08T21:07:26.402Z" }, - { url = "https://files.pythonhosted.org/packages/11/bf/afb76adffe4406e6250f14ce48e60a7eb05d4624945bd3c044cfda575fbc/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5967d571243cfb9ad3710e6e628ab68c421a237b76e24a67ac22ee0ff12784d6", size = 3163582, upload-time = "2025-09-08T21:07:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/42/34/e6405227560f61e956cb4c5de653b0f874751c5ada658d3532d6c1df328e/rapidfuzz-3.14.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:474f416cbb9099676de54aa41944c154ba8d25033ee460f87bb23e54af6d01c9", size = 1221116, upload-time = "2025-09-08T21:07:30.8Z" }, - { url = "https://files.pythonhosted.org/packages/55/e6/5b757e2e18de384b11d1daf59608453f0baf5d5d8d1c43e1a964af4dc19a/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ae2d57464b59297f727c4e201ea99ec7b13935f1f056c753e8103da3f2fc2404", size = 2402670, upload-time = "2025-09-08T21:07:32.702Z" }, - { url = "https://files.pythonhosted.org/packages/43/c4/d753a415fe54531aa882e288db5ed77daaa72e05c1a39e1cbac00d23024f/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:57047493a1f62f11354c7143c380b02f1b355c52733e6b03adb1cb0fe8fb8816", size = 2521659, upload-time = "2025-09-08T21:07:35.218Z" }, - { url = "https://files.pythonhosted.org/packages/cd/28/d4e7fe1515430db98f42deb794c7586a026d302fe70f0216b638d89cf10f/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4acc20776f225ee37d69517a237c090b9fa7e0836a0b8bc58868e9168ba6ef6f", size = 2788552, upload-time = "2025-09-08T21:07:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/4f/00/eab05473af7a2cafb4f3994bc6bf408126b8eec99a569aac6254ac757db4/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4373f914ff524ee0146919dea96a40a8200ab157e5a15e777a74a769f73d8a4a", size = 3306261, upload-time = "2025-09-08T21:07:39.624Z" }, - { url = "https://files.pythonhosted.org/packages/d1/31/2feb8dfcfcff6508230cd2ccfdde7a8bf988c6fda142fe9ce5d3eb15704d/rapidfuzz-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:37017b84953927807847016620d61251fe236bd4bcb25e27b6133d955bb9cafb", size = 4269522, upload-time = "2025-09-08T21:07:41.663Z" }, - { url = "https://files.pythonhosted.org/packages/b7/e7/f0a242687143cebd33a1fb165226b73bd9496d47c5acfad93de820a18fa8/rapidfuzz-3.14.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:60879fcae2f7618403c4c746a9a3eec89327d73148fb6e89a933b78442ff0669", size = 1945182, upload-time = "2025-09-08T21:07:51.84Z" }, - { url = "https://files.pythonhosted.org/packages/96/29/ca8a3f8525e3d0e7ab49cb927b5fb4a54855f794c9ecd0a0b60a6c96a05f/rapidfuzz-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f94d61e44db3fc95a74006a394257af90fa6e826c900a501d749979ff495d702", size = 1413946, upload-time = "2025-09-08T21:07:53.702Z" }, - { url = "https://files.pythonhosted.org/packages/6d/10/0ed838b296fdac08ecbaa3a220fb4f1d887ff41b0be44fe8eade45bb650e/rapidfuzz-3.14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:673ce55a9be5b772dade911909e42382c0828b8a50ed7f9168763fa6b9f7054d", size = 1860246, upload-time = "2025-09-08T21:08:02.762Z" }, - { url = "https://files.pythonhosted.org/packages/a4/70/a08f4a86387dec97508ead51cc7a4b3130d4e62ac0eae938a6d8e1feff14/rapidfuzz-3.14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:45c62ada1980ebf4c64c4253993cc8daa018c63163f91db63bb3af69cb74c2e3", size = 1336749, upload-time = "2025-09-08T21:08:04.783Z" }, - { url = "https://files.pythonhosted.org/packages/05/c7/1b17347e30f2b50dd976c54641aa12003569acb1bdaabf45a5cc6f471c58/rapidfuzz-3.14.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4a21ccdf1bd7d57a1009030527ba8fae1c74bf832d0a08f6b67de8f5c506c96f", size = 1862602, upload-time = "2025-09-08T21:08:09.088Z" }, - { url = "https://files.pythonhosted.org/packages/09/cf/95d0dacac77eda22499991bd5f304c77c5965fb27348019a48ec3fe4a3f6/rapidfuzz-3.14.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:589fb0af91d3aff318750539c832ea1100dbac2c842fde24e42261df443845f6", size = 1339548, upload-time = "2025-09-08T21:08:11.059Z" }, +version = "3.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/28/9d808fe62375b9aab5ba92fa9b29371297b067c2790b2d7cda648b1e2f8d/rapidfuzz-3.14.3.tar.gz", hash = "sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f", size = 57863900, upload-time = "2025-11-01T11:54:52.321Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/25/5b0a33ad3332ee1213068c66f7c14e9e221be90bab434f0cb4defa9d6660/rapidfuzz-3.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dea2d113e260a5da0c4003e0a5e9fdf24a9dc2bb9eaa43abd030a1e46ce7837d", size = 1953885, upload-time = "2025-11-01T11:52:47.75Z" }, + { url = "https://files.pythonhosted.org/packages/2d/ab/f1181f500c32c8fcf7c966f5920c7e56b9b1d03193386d19c956505c312d/rapidfuzz-3.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e6c31a4aa68cfa75d7eede8b0ed24b9e458447db604c2db53f358be9843d81d3", size = 1390200, upload-time = "2025-11-01T11:52:49.491Z" }, + { url = "https://files.pythonhosted.org/packages/14/2a/0f2de974ececad873865c6bb3ea3ad07c976ac293d5025b2d73325aac1d4/rapidfuzz-3.14.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02821366d928e68ddcb567fed8723dad7ea3a979fada6283e6914d5858674850", size = 1389319, upload-time = "2025-11-01T11:52:51.224Z" }, + { url = "https://files.pythonhosted.org/packages/ed/69/309d8f3a0bb3031fd9b667174cc4af56000645298af7c2931be5c3d14bb4/rapidfuzz-3.14.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe8df315ab4e6db4e1be72c5170f8e66021acde22cd2f9d04d2058a9fd8162e", size = 3178495, upload-time = "2025-11-01T11:52:53.005Z" }, + { url = "https://files.pythonhosted.org/packages/10/b7/f9c44a99269ea5bf6fd6a40b84e858414b6e241288b9f2b74af470d222b1/rapidfuzz-3.14.3-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:769f31c60cd79420188fcdb3c823227fc4a6deb35cafec9d14045c7f6743acae", size = 1228443, upload-time = "2025-11-01T11:52:54.991Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0a/3b3137abac7f19c9220e14cd7ce993e35071a7655e7ef697785a3edfea1a/rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54fa03062124e73086dae66a3451c553c1e20a39c077fd704dc7154092c34c63", size = 2411998, upload-time = "2025-11-01T11:52:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b6/983805a844d44670eaae63831024cdc97ada4e9c62abc6b20703e81e7f9b/rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:834d1e818005ed0d4ae38f6b87b86fad9b0a74085467ece0727d20e15077c094", size = 2530120, upload-time = "2025-11-01T11:52:58.298Z" }, + { url = "https://files.pythonhosted.org/packages/b4/cc/2c97beb2b1be2d7595d805682472f1b1b844111027d5ad89b65e16bdbaaa/rapidfuzz-3.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:948b00e8476a91f510dd1ec07272efc7d78c275d83b630455559671d4e33b678", size = 4283129, upload-time = "2025-11-01T11:53:00.188Z" }, + { url = "https://files.pythonhosted.org/packages/fa/8e/3c215e860b458cfbedb3ed73bc72e98eb7e0ed72f6b48099604a7a3260c2/rapidfuzz-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226", size = 1945306, upload-time = "2025-11-01T11:53:06.452Z" }, + { url = "https://files.pythonhosted.org/packages/36/d9/31b33512015c899f4a6e6af64df8dfe8acddf4c8b40a4b3e0e6e1bcd00e5/rapidfuzz-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb", size = 1390788, upload-time = "2025-11-01T11:53:08.721Z" }, + { url = "https://files.pythonhosted.org/packages/a9/67/2ee6f8de6e2081ccd560a571d9c9063184fe467f484a17fa90311a7f4a2e/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941", size = 1374580, upload-time = "2025-11-01T11:53:10.164Z" }, + { url = "https://files.pythonhosted.org/packages/30/83/80d22997acd928eda7deadc19ccd15883904622396d6571e935993e0453a/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382", size = 3154947, upload-time = "2025-11-01T11:53:12.093Z" }, + { url = "https://files.pythonhosted.org/packages/5b/cf/9f49831085a16384695f9fb096b99662f589e30b89b4a589a1ebc1a19d34/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43", size = 1223872, upload-time = "2025-11-01T11:53:13.664Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0f/41ee8034e744b871c2e071ef0d360686f5ccfe5659f4fd96c3ec406b3c8b/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db", size = 2392512, upload-time = "2025-11-01T11:53:15.109Z" }, + { url = "https://files.pythonhosted.org/packages/da/86/280038b6b0c2ccec54fb957c732ad6b41cc1fd03b288d76545b9cf98343f/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed", size = 2521398, upload-time = "2025-11-01T11:53:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7b/05c26f939607dca0006505e3216248ae2de631e39ef94dd63dbbf0860021/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc", size = 4259416, upload-time = "2025-11-01T11:53:19.34Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/0d94d09646853bd26978cb3a7541b6233c5760687777fa97da8de0d9a6ac/rapidfuzz-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae", size = 1939646, upload-time = "2025-11-01T11:53:25.292Z" }, + { url = "https://files.pythonhosted.org/packages/b6/eb/f96aefc00f3bbdbab9c0657363ea8437a207d7545ac1c3789673e05d80bd/rapidfuzz-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff", size = 1385512, upload-time = "2025-11-01T11:53:27.594Z" }, + { url = "https://files.pythonhosted.org/packages/26/34/71c4f7749c12ee223dba90017a5947e8f03731a7cc9f489b662a8e9e643d/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457", size = 1373571, upload-time = "2025-11-01T11:53:29.096Z" }, + { url = "https://files.pythonhosted.org/packages/32/00/ec8597a64f2be301ce1ee3290d067f49f6a7afb226b67d5f15b56d772ba5/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c", size = 3156759, upload-time = "2025-11-01T11:53:30.777Z" }, + { url = "https://files.pythonhosted.org/packages/61/d5/b41eeb4930501cc899d5a9a7b5c9a33d85a670200d7e81658626dcc0ecc0/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e", size = 1222067, upload-time = "2025-11-01T11:53:32.334Z" }, + { url = "https://files.pythonhosted.org/packages/2a/7d/6d9abb4ffd1027c6ed837b425834f3bed8344472eb3a503ab55b3407c721/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10", size = 2394775, upload-time = "2025-11-01T11:53:34.24Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/4f3ab4c401c5a55364da1ffff8cc879fc97b4e5f4fa96033827da491a973/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41", size = 2526123, upload-time = "2025-11-01T11:53:35.779Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4b/54f804975376a328f57293bd817c12c9036171d15cf7292032e3f5820b2d/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0", size = 4262874, upload-time = "2025-11-01T11:53:37.866Z" }, + { url = "https://files.pythonhosted.org/packages/92/13/a486369e63ff3c1a58444d16b15c5feb943edd0e6c28a1d7d67cb8946b8f/rapidfuzz-3.14.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424", size = 1967702, upload-time = "2025-11-01T11:53:44.554Z" }, + { url = "https://files.pythonhosted.org/packages/f1/82/efad25e260b7810f01d6b69122685e355bed78c94a12784bac4e0beb2afb/rapidfuzz-3.14.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e", size = 1410702, upload-time = "2025-11-01T11:53:46.066Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1a/34c977b860cde91082eae4a97ae503f43e0d84d4af301d857679b66f9869/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8", size = 1382337, upload-time = "2025-11-01T11:53:47.62Z" }, + { url = "https://files.pythonhosted.org/packages/88/74/f50ea0e24a5880a9159e8fd256b84d8f4634c2f6b4f98028bdd31891d907/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519", size = 3165563, upload-time = "2025-11-01T11:53:49.216Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7a/e744359404d7737049c26099423fc54bcbf303de5d870d07d2fb1410f567/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_31_armv7l.whl", hash = "sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a", size = 1214727, upload-time = "2025-11-01T11:53:50.883Z" }, + { url = "https://files.pythonhosted.org/packages/d3/2e/87adfe14ce75768ec6c2b8acd0e05e85e84be4be5e3d283cdae360afc4fe/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897", size = 2403349, upload-time = "2025-11-01T11:53:52.322Z" }, + { url = "https://files.pythonhosted.org/packages/70/17/6c0b2b2bff9c8b12e12624c07aa22e922b0c72a490f180fa9183d1ef2c75/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58", size = 2507596, upload-time = "2025-11-01T11:53:53.835Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d1/87852a7cbe4da7b962174c749a47433881a63a817d04f3e385ea9babcd9e/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f", size = 4273595, upload-time = "2025-11-01T11:53:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/32/6f/1b88aaeade83abc5418788f9e6b01efefcd1a69d65ded37d89cd1662be41/rapidfuzz-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea", size = 1942086, upload-time = "2025-11-01T11:54:02.592Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2c/b23861347436cb10f46c2bd425489ec462790faaa360a54a7ede5f78de88/rapidfuzz-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6", size = 1386993, upload-time = "2025-11-01T11:54:04.12Z" }, + { url = "https://files.pythonhosted.org/packages/83/86/5d72e2c060aa1fbdc1f7362d938f6b237dff91f5b9fc5dd7cc297e112250/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4", size = 1379126, upload-time = "2025-11-01T11:54:05.777Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/ef2cee3e4d8b3fc22705ff519f0d487eecc756abdc7c25d53686689d6cf2/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1", size = 3159304, upload-time = "2025-11-01T11:54:07.351Z" }, + { url = "https://files.pythonhosted.org/packages/a0/36/dc5f2f62bbc7bc90be1f75eeaf49ed9502094bb19290dfb4747317b17f12/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421", size = 1218207, upload-time = "2025-11-01T11:54:09.641Z" }, + { url = "https://files.pythonhosted.org/packages/df/7e/8f4be75c1bc62f47edf2bbbe2370ee482fae655ebcc4718ac3827ead3904/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b", size = 2401245, upload-time = "2025-11-01T11:54:11.543Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/f7c92759e1bb188dd05b80d11c630ba59b8d7856657baf454ff56059c2ab/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c", size = 2518308, upload-time = "2025-11-01T11:54:13.134Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ac/85820f70fed5ecb5f1d9a55f1e1e2090ef62985ef41db289b5ac5ec56e28/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a", size = 4265011, upload-time = "2025-11-01T11:54:15.087Z" }, + { url = "https://files.pythonhosted.org/packages/03/1b/6b6084576ba87bf21877c77218a0c97ba98cb285b0c02eaaee3acd7c4513/rapidfuzz-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50", size = 1968658, upload-time = "2025-11-01T11:54:22.25Z" }, + { url = "https://files.pythonhosted.org/packages/38/c0/fb02a0db80d95704b0a6469cc394e8c38501abf7e1c0b2afe3261d1510c2/rapidfuzz-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296", size = 1410742, upload-time = "2025-11-01T11:54:23.863Z" }, + { url = "https://files.pythonhosted.org/packages/a4/72/3fbf12819fc6afc8ec75a45204013b40979d068971e535a7f3512b05e765/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655", size = 1382810, upload-time = "2025-11-01T11:54:25.571Z" }, + { url = "https://files.pythonhosted.org/packages/0f/18/0f1991d59bb7eee28922a00f79d83eafa8c7bfb4e8edebf4af2a160e7196/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1", size = 3166349, upload-time = "2025-11-01T11:54:27.195Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f0/baa958b1989c8f88c78bbb329e969440cf330b5a01a982669986495bb980/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7", size = 1214994, upload-time = "2025-11-01T11:54:28.821Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a0/cd12ec71f9b2519a3954febc5740291cceabc64c87bc6433afcb36259f3b/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf", size = 2403919, upload-time = "2025-11-01T11:54:30.393Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ce/019bd2176c1644098eced4f0595cb4b3ef52e4941ac9a5854f209d0a6e16/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785", size = 2508346, upload-time = "2025-11-01T11:54:32.048Z" }, + { url = "https://files.pythonhosted.org/packages/23/f8/be16c68e2c9e6c4f23e8f4adbb7bccc9483200087ed28ff76c5312da9b14/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35", size = 4274105, upload-time = "2025-11-01T11:54:33.701Z" }, + { url = "https://files.pythonhosted.org/packages/c9/33/b5bd6475c7c27164b5becc9b0e3eb978f1e3640fea590dd3dced6006ee83/rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7cf174b52cb3ef5d49e45d0a1133b7e7d0ecf770ed01f97ae9962c5c91d97d23", size = 1888499, upload-time = "2025-11-01T11:54:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/30/d2/89d65d4db4bb931beade9121bc71ad916b5fa9396e807d11b33731494e8e/rapidfuzz-3.14.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:442cba39957a008dfc5bdef21a9c3f4379e30ffb4e41b8555dbaf4887eca9300", size = 1336747, upload-time = "2025-11-01T11:54:43.957Z" }, + { url = "https://files.pythonhosted.org/packages/85/33/cd87d92b23f0b06e8914a61cea6850c6d495ca027f669fab7a379041827a/rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1faa0f8f76ba75fd7b142c984947c280ef6558b5067af2ae9b8729b0a0f99ede", size = 1352187, upload-time = "2025-11-01T11:54:45.518Z" }, + { url = "https://files.pythonhosted.org/packages/22/20/9d30b4a1ab26aac22fff17d21dec7e9089ccddfe25151d0a8bb57001dc3d/rapidfuzz-3.14.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e6eefec45625c634926a9fd46c9e4f31118ac8f3156fff9494422cee45207e6", size = 3101472, upload-time = "2025-11-01T11:54:47.255Z" }, ] [[package]] @@ -3266,102 +4111,102 @@ hiredis = [ [[package]] name = "referencing" -version = "0.36.2" +version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "rpds-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "typing-extensions", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] [[package]] name = "regex" -version = "2025.9.18" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/d3/eaa0d28aba6ad1827ad1e716d9a93e1ba963ada61887498297d3da715133/regex-2025.9.18.tar.gz", hash = "sha256:c5ba23274c61c6fef447ba6a39333297d0c247f53059dba0bca415cac511edc4", size = 400917, upload-time = "2025-09-19T00:38:35.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d8/7e06171db8e55f917c5b8e89319cea2d86982e3fc46b677f40358223dece/regex-2025.9.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:12296202480c201c98a84aecc4d210592b2f55e200a1d193235c4db92b9f6788", size = 484829, upload-time = "2025-09-19T00:35:05.215Z" }, - { url = "https://files.pythonhosted.org/packages/8d/70/bf91bb39e5bedf75ce730ffbaa82ca585584d13335306d637458946b8b9f/regex-2025.9.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:220381f1464a581f2ea988f2220cf2a67927adcef107d47d6897ba5a2f6d51a4", size = 288993, upload-time = "2025-09-19T00:35:08.154Z" }, - { url = "https://files.pythonhosted.org/packages/fe/89/69f79b28365eda2c46e64c39d617d5f65a2aa451a4c94de7d9b34c2dc80f/regex-2025.9.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87f681bfca84ebd265278b5daa1dcb57f4db315da3b5d044add7c30c10442e61", size = 286624, upload-time = "2025-09-19T00:35:09.717Z" }, - { url = "https://files.pythonhosted.org/packages/44/31/81e62955726c3a14fcc1049a80bc716765af6c055706869de5e880ddc783/regex-2025.9.18-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34d674cbba70c9398074c8a1fcc1a79739d65d1105de2a3c695e2b05ea728251", size = 780473, upload-time = "2025-09-19T00:35:11.013Z" }, - { url = "https://files.pythonhosted.org/packages/fb/23/07072b7e191fbb6e213dc03b2f5b96f06d3c12d7deaded84679482926fc7/regex-2025.9.18-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:385c9b769655cb65ea40b6eea6ff763cbb6d69b3ffef0b0db8208e1833d4e746", size = 849290, upload-time = "2025-09-19T00:35:12.348Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f0/aec7f6a01f2a112210424d77c6401b9015675fb887ced7e18926df4ae51e/regex-2025.9.18-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8900b3208e022570ae34328712bef6696de0804c122933414014bae791437ab2", size = 897335, upload-time = "2025-09-19T00:35:14.058Z" }, - { url = "https://files.pythonhosted.org/packages/cc/90/2e5f9da89d260de7d0417ead91a1bc897f19f0af05f4f9323313b76c47f2/regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c204e93bf32cd7a77151d44b05eb36f469d0898e3fba141c026a26b79d9914a0", size = 789946, upload-time = "2025-09-19T00:35:15.403Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d5/1c712c7362f2563d389be66bae131c8bab121a3fabfa04b0b5bfc9e73c51/regex-2025.9.18-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3acc471d1dd7e5ff82e6cacb3b286750decd949ecd4ae258696d04f019817ef8", size = 780787, upload-time = "2025-09-19T00:35:17.061Z" }, - { url = "https://files.pythonhosted.org/packages/4f/92/c54cdb4aa41009632e69817a5aa452673507f07e341076735a2f6c46a37c/regex-2025.9.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6479d5555122433728760e5f29edb4c2b79655a8deb681a141beb5c8a025baea", size = 773632, upload-time = "2025-09-19T00:35:18.57Z" }, - { url = "https://files.pythonhosted.org/packages/db/99/75c996dc6a2231a8652d7ad0bfbeaf8a8c77612d335580f520f3ec40e30b/regex-2025.9.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:431bd2a8726b000eb6f12429c9b438a24062a535d06783a93d2bcbad3698f8a8", size = 844104, upload-time = "2025-09-19T00:35:20.259Z" }, - { url = "https://files.pythonhosted.org/packages/1c/f7/25aba34cc130cb6844047dbfe9716c9b8f9629fee8b8bec331aa9241b97b/regex-2025.9.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0cc3521060162d02bd36927e20690129200e5ac9d2c6d32b70368870b122db25", size = 834794, upload-time = "2025-09-19T00:35:22.002Z" }, - { url = "https://files.pythonhosted.org/packages/51/eb/64e671beafa0ae29712268421597596d781704973551312b2425831d4037/regex-2025.9.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a021217b01be2d51632ce056d7a837d3fa37c543ede36e39d14063176a26ae29", size = 778535, upload-time = "2025-09-19T00:35:23.298Z" }, - { url = "https://files.pythonhosted.org/packages/58/61/80eda662fc4eb32bfedc331f42390974c9e89c7eac1b79cd9eea4d7c458c/regex-2025.9.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:51076980cd08cd13c88eb7365427ae27f0d94e7cebe9ceb2bb9ffdae8fc4d82a", size = 484832, upload-time = "2025-09-19T00:35:30.011Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d9/33833d9abddf3f07ad48504ddb53fe3b22f353214bbb878a72eee1e3ddbf/regex-2025.9.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:828446870bd7dee4e0cbeed767f07961aa07f0ea3129f38b3ccecebc9742e0b8", size = 288994, upload-time = "2025-09-19T00:35:31.733Z" }, - { url = "https://files.pythonhosted.org/packages/2a/b3/526ee96b0d70ea81980cbc20c3496fa582f775a52e001e2743cc33b2fa75/regex-2025.9.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c28821d5637866479ec4cc23b8c990f5bc6dd24e5e4384ba4a11d38a526e1414", size = 286619, upload-time = "2025-09-19T00:35:33.221Z" }, - { url = "https://files.pythonhosted.org/packages/65/4f/c2c096b02a351b33442aed5895cdd8bf87d372498d2100927c5a053d7ba3/regex-2025.9.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726177ade8e481db669e76bf99de0b278783be8acd11cef71165327abd1f170a", size = 792454, upload-time = "2025-09-19T00:35:35.361Z" }, - { url = "https://files.pythonhosted.org/packages/24/15/b562c9d6e47c403c4b5deb744f8b4bf6e40684cf866c7b077960a925bdff/regex-2025.9.18-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5cca697da89b9f8ea44115ce3130f6c54c22f541943ac8e9900461edc2b8bd4", size = 858723, upload-time = "2025-09-19T00:35:36.949Z" }, - { url = "https://files.pythonhosted.org/packages/f2/01/dba305409849e85b8a1a681eac4c03ed327d8de37895ddf9dc137f59c140/regex-2025.9.18-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dfbde38f38004703c35666a1e1c088b778e35d55348da2b7b278914491698d6a", size = 905899, upload-time = "2025-09-19T00:35:38.723Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d0/c51d1e6a80eab11ef96a4cbad17fc0310cf68994fb01a7283276b7e5bbd6/regex-2025.9.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f2f422214a03fab16bfa495cfec72bee4aaa5731843b771860a471282f1bf74f", size = 798981, upload-time = "2025-09-19T00:35:40.416Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5e/72db90970887bbe02296612bd61b0fa31e6d88aa24f6a4853db3e96c575e/regex-2025.9.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a295916890f4df0902e4286bc7223ee7f9e925daa6dcdec4192364255b70561a", size = 781900, upload-time = "2025-09-19T00:35:42.077Z" }, - { url = "https://files.pythonhosted.org/packages/50/ff/596be45eea8e9bc31677fde243fa2904d00aad1b32c31bce26c3dbba0b9e/regex-2025.9.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5db95ff632dbabc8c38c4e82bf545ab78d902e81160e6e455598014f0abe66b9", size = 852952, upload-time = "2025-09-19T00:35:43.751Z" }, - { url = "https://files.pythonhosted.org/packages/e5/1b/2dfa348fa551e900ed3f5f63f74185b6a08e8a76bc62bc9c106f4f92668b/regex-2025.9.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb967eb441b0f15ae610b7069bdb760b929f267efbf522e814bbbfffdf125ce2", size = 844355, upload-time = "2025-09-19T00:35:45.309Z" }, - { url = "https://files.pythonhosted.org/packages/f4/bf/aefb1def27fe33b8cbbb19c75c13aefccfbef1c6686f8e7f7095705969c7/regex-2025.9.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f04d2f20da4053d96c08f7fde6e1419b7ec9dbcee89c96e3d731fca77f411b95", size = 787254, upload-time = "2025-09-19T00:35:46.904Z" }, - { url = "https://files.pythonhosted.org/packages/b0/99/05859d87a66ae7098222d65748f11ef7f2dff51bfd7482a4e2256c90d72b/regex-2025.9.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:436e1b31d7efd4dcd52091d076482031c611dde58bf9c46ca6d0a26e33053a7e", size = 486335, upload-time = "2025-09-19T00:36:03.661Z" }, - { url = "https://files.pythonhosted.org/packages/97/7e/d43d4e8b978890932cf7b0957fce58c5b08c66f32698f695b0c2c24a48bf/regex-2025.9.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c190af81e5576b9c5fdc708f781a52ff20f8b96386c6e2e0557a78402b029f4a", size = 289720, upload-time = "2025-09-19T00:36:05.471Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3b/ff80886089eb5dcf7e0d2040d9aaed539e25a94300403814bb24cc775058/regex-2025.9.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4121f1ce2b2b5eec4b397cc1b277686e577e658d8f5870b7eb2d726bd2300ab", size = 287257, upload-time = "2025-09-19T00:36:07.072Z" }, - { url = "https://files.pythonhosted.org/packages/ee/66/243edf49dd8720cba8d5245dd4d6adcb03a1defab7238598c0c97cf549b8/regex-2025.9.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:300e25dbbf8299d87205e821a201057f2ef9aa3deb29caa01cd2cac669e508d5", size = 797463, upload-time = "2025-09-19T00:36:08.399Z" }, - { url = "https://files.pythonhosted.org/packages/df/71/c9d25a1142c70432e68bb03211d4a82299cd1c1fbc41db9409a394374ef5/regex-2025.9.18-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b47fcf9f5316c0bdaf449e879407e1b9937a23c3b369135ca94ebc8d74b1742", size = 862670, upload-time = "2025-09-19T00:36:10.101Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8f/329b1efc3a64375a294e3a92d43372bf1a351aa418e83c21f2f01cf6ec41/regex-2025.9.18-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:57a161bd3acaa4b513220b49949b07e252165e6b6dc910ee7617a37ff4f5b425", size = 910881, upload-time = "2025-09-19T00:36:12.223Z" }, - { url = "https://files.pythonhosted.org/packages/35/9e/a91b50332a9750519320ed30ec378b74c996f6befe282cfa6bb6cea7e9fd/regex-2025.9.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f130c3a7845ba42de42f380fff3c8aebe89a810747d91bcf56d40a069f15352", size = 802011, upload-time = "2025-09-19T00:36:13.901Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1d/6be3b8d7856b6e0d7ee7f942f437d0a76e0d5622983abbb6d21e21ab9a17/regex-2025.9.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f96fa342b6f54dcba928dd452e8d8cb9f0d63e711d1721cd765bb9f73bb048d", size = 786668, upload-time = "2025-09-19T00:36:15.391Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ce/4a60e53df58bd157c5156a1736d3636f9910bdcc271d067b32b7fcd0c3a8/regex-2025.9.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f0d676522d68c207828dcd01fb6f214f63f238c283d9f01d85fc664c7c85b56", size = 856578, upload-time = "2025-09-19T00:36:16.845Z" }, - { url = "https://files.pythonhosted.org/packages/86/e8/162c91bfe7217253afccde112868afb239f94703de6580fb235058d506a6/regex-2025.9.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:40532bff8a1a0621e7903ae57fce88feb2e8a9a9116d341701302c9302aef06e", size = 849017, upload-time = "2025-09-19T00:36:18.597Z" }, - { url = "https://files.pythonhosted.org/packages/35/34/42b165bc45289646ea0959a1bc7531733e90b47c56a72067adfe6b3251f6/regex-2025.9.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:039f11b618ce8d71a1c364fdee37da1012f5a3e79b1b2819a9f389cd82fd6282", size = 788150, upload-time = "2025-09-19T00:36:20.464Z" }, - { url = "https://files.pythonhosted.org/packages/d2/c7/5c48206a60ce33711cf7dcaeaed10dd737733a3569dc7e1dce324dd48f30/regex-2025.9.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2a40f929cd907c7e8ac7566ac76225a77701a6221bca937bdb70d56cb61f57b2", size = 485955, upload-time = "2025-09-19T00:36:26.822Z" }, - { url = "https://files.pythonhosted.org/packages/e9/be/74fc6bb19a3c491ec1ace943e622b5a8539068771e8705e469b2da2306a7/regex-2025.9.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c90471671c2cdf914e58b6af62420ea9ecd06d1554d7474d50133ff26ae88feb", size = 289583, upload-time = "2025-09-19T00:36:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/25/c4/9ceaa433cb5dc515765560f22a19578b95b92ff12526e5a259321c4fc1a0/regex-2025.9.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a351aff9e07a2dabb5022ead6380cff17a4f10e4feb15f9100ee56c4d6d06af", size = 287000, upload-time = "2025-09-19T00:36:30.161Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e6/68bc9393cb4dc68018456568c048ac035854b042bc7c33cb9b99b0680afa/regex-2025.9.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc4b8e9d16e20ddfe16430c23468a8707ccad3365b06d4536142e71823f3ca29", size = 797535, upload-time = "2025-09-19T00:36:31.876Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/ebae9032d34b78ecfe9bd4b5e6575b55351dc8513485bb92326613732b8c/regex-2025.9.18-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4b8cdbddf2db1c5e80338ba2daa3cfa3dec73a46fff2a7dda087c8efbf12d62f", size = 862603, upload-time = "2025-09-19T00:36:33.344Z" }, - { url = "https://files.pythonhosted.org/packages/3b/74/12332c54b3882557a4bcd2b99f8be581f5c6a43cf1660a85b460dd8ff468/regex-2025.9.18-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a276937d9d75085b2c91fb48244349c6954f05ee97bba0963ce24a9d915b8b68", size = 910829, upload-time = "2025-09-19T00:36:34.826Z" }, - { url = "https://files.pythonhosted.org/packages/86/70/ba42d5ed606ee275f2465bfc0e2208755b06cdabd0f4c7c4b614d51b57ab/regex-2025.9.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92a8e375ccdc1256401c90e9dc02b8642894443d549ff5e25e36d7cf8a80c783", size = 802059, upload-time = "2025-09-19T00:36:36.664Z" }, - { url = "https://files.pythonhosted.org/packages/da/c5/fcb017e56396a7f2f8357412638d7e2963440b131a3ca549be25774b3641/regex-2025.9.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0dc6893b1f502d73037cf807a321cdc9be29ef3d6219f7970f842475873712ac", size = 786781, upload-time = "2025-09-19T00:36:38.168Z" }, - { url = "https://files.pythonhosted.org/packages/c6/ee/21c4278b973f630adfb3bcb23d09d83625f3ab1ca6e40ebdffe69901c7a1/regex-2025.9.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a61e85bfc63d232ac14b015af1261f826260c8deb19401c0597dbb87a864361e", size = 856578, upload-time = "2025-09-19T00:36:40.129Z" }, - { url = "https://files.pythonhosted.org/packages/87/0b/de51550dc7274324435c8f1539373ac63019b0525ad720132866fff4a16a/regex-2025.9.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1ef86a9ebc53f379d921fb9a7e42b92059ad3ee800fcd9e0fe6181090e9f6c23", size = 849119, upload-time = "2025-09-19T00:36:41.651Z" }, - { url = "https://files.pythonhosted.org/packages/60/52/383d3044fc5154d9ffe4321696ee5b2ee4833a28c29b137c22c33f41885b/regex-2025.9.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d3bc882119764ba3a119fbf2bd4f1b47bc56c1da5d42df4ed54ae1e8e66fdf8f", size = 788219, upload-time = "2025-09-19T00:36:43.575Z" }, - { url = "https://files.pythonhosted.org/packages/e8/83/6887e16a187c6226cb85d8301e47d3b73ecc4505a3a13d8da2096b44fd76/regex-2025.9.18-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fe5d50572bc885a0a799410a717c42b1a6b50e2f45872e2b40f4f288f9bce8a2", size = 489765, upload-time = "2025-09-19T00:36:49.996Z" }, - { url = "https://files.pythonhosted.org/packages/51/c5/e2f7325301ea2916ff301c8d963ba66b1b2c1b06694191df80a9c4fea5d0/regex-2025.9.18-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b9d9a2d6cda6621551ca8cf7a06f103adf72831153f3c0d982386110870c4d3", size = 291228, upload-time = "2025-09-19T00:36:51.654Z" }, - { url = "https://files.pythonhosted.org/packages/91/60/7d229d2bc6961289e864a3a3cfebf7d0d250e2e65323a8952cbb7e22d824/regex-2025.9.18-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:13202e4c4ac0ef9a317fff817674b293c8f7e8c68d3190377d8d8b749f566e12", size = 289270, upload-time = "2025-09-19T00:36:53.118Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d7/b4f06868ee2958ff6430df89857fbf3d43014bbf35538b6ec96c2704e15d/regex-2025.9.18-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:874ff523b0fecffb090f80ae53dc93538f8db954c8bb5505f05b7787ab3402a0", size = 806326, upload-time = "2025-09-19T00:36:54.631Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e4/bca99034a8f1b9b62ccf337402a8e5b959dd5ba0e5e5b2ead70273df3277/regex-2025.9.18-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d13ab0490128f2bb45d596f754148cd750411afc97e813e4b3a61cf278a23bb6", size = 871556, upload-time = "2025-09-19T00:36:56.208Z" }, - { url = "https://files.pythonhosted.org/packages/6d/df/e06ffaf078a162f6dd6b101a5ea9b44696dca860a48136b3ae4a9caf25e2/regex-2025.9.18-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:05440bc172bc4b4b37fb9667e796597419404dbba62e171e1f826d7d2a9ebcef", size = 913817, upload-time = "2025-09-19T00:36:57.807Z" }, - { url = "https://files.pythonhosted.org/packages/9e/05/25b05480b63292fd8e84800b1648e160ca778127b8d2367a0a258fa2e225/regex-2025.9.18-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5514b8e4031fdfaa3d27e92c75719cbe7f379e28cacd939807289bce76d0e35a", size = 811055, upload-time = "2025-09-19T00:36:59.762Z" }, - { url = "https://files.pythonhosted.org/packages/70/97/7bc7574655eb651ba3a916ed4b1be6798ae97af30104f655d8efd0cab24b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:65d3c38c39efce73e0d9dc019697b39903ba25b1ad45ebbd730d2cf32741f40d", size = 794534, upload-time = "2025-09-19T00:37:01.405Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c2/d5da49166a52dda879855ecdba0117f073583db2b39bb47ce9a3378a8e9e/regex-2025.9.18-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ae77e447ebc144d5a26d50055c6ddba1d6ad4a865a560ec7200b8b06bc529368", size = 866684, upload-time = "2025-09-19T00:37:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/bd/2d/0a5c4e6ec417de56b89ff4418ecc72f7e3feca806824c75ad0bbdae0516b/regex-2025.9.18-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e3ef8cf53dc8df49d7e28a356cf824e3623764e9833348b655cfed4524ab8a90", size = 853282, upload-time = "2025-09-19T00:37:04.985Z" }, - { url = "https://files.pythonhosted.org/packages/f4/8e/d656af63e31a86572ec829665d6fa06eae7e144771e0330650a8bb865635/regex-2025.9.18-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9feb29817df349c976da9a0debf775c5c33fc1c8ad7b9f025825da99374770b7", size = 797830, upload-time = "2025-09-19T00:37:06.697Z" }, - { url = "https://files.pythonhosted.org/packages/44/b7/3b4663aa3b4af16819f2ab6a78c4111c7e9b066725d8107753c2257448a5/regex-2025.9.18-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c6db75b51acf277997f3adcd0ad89045d856190d13359f15ab5dda21581d9129", size = 486130, upload-time = "2025-09-19T00:37:14.527Z" }, - { url = "https://files.pythonhosted.org/packages/80/5b/4533f5d7ac9c6a02a4725fe8883de2aebc713e67e842c04cf02626afb747/regex-2025.9.18-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8f9698b6f6895d6db810e0bda5364f9ceb9e5b11328700a90cae573574f61eea", size = 289539, upload-time = "2025-09-19T00:37:16.356Z" }, - { url = "https://files.pythonhosted.org/packages/b8/8d/5ab6797c2750985f79e9995fad3254caa4520846580f266ae3b56d1cae58/regex-2025.9.18-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29cd86aa7cb13a37d0f0d7c21d8d949fe402ffa0ea697e635afedd97ab4b69f1", size = 287233, upload-time = "2025-09-19T00:37:18.025Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/95afcb02ba8d3a64e6ffeb801718ce73471ad6440c55d993f65a4a5e7a92/regex-2025.9.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c9f285a071ee55cd9583ba24dde006e53e17780bb309baa8e4289cd472bcc47", size = 797876, upload-time = "2025-09-19T00:37:19.609Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fb/720b1f49cec1f3b5a9fea5b34cd22b88b5ebccc8c1b5de9cc6f65eed165a/regex-2025.9.18-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5adf266f730431e3be9021d3e5b8d5ee65e563fec2883ea8093944d21863b379", size = 863385, upload-time = "2025-09-19T00:37:21.65Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ca/e0d07ecf701e1616f015a720dc13b84c582024cbfbb3fc5394ae204adbd7/regex-2025.9.18-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1137cabc0f38807de79e28d3f6e3e3f2cc8cfb26bead754d02e6d1de5f679203", size = 910220, upload-time = "2025-09-19T00:37:23.723Z" }, - { url = "https://files.pythonhosted.org/packages/b6/45/bba86413b910b708eca705a5af62163d5d396d5f647ed9485580c7025209/regex-2025.9.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cc9e5525cada99699ca9223cce2d52e88c52a3d2a0e842bd53de5497c604164", size = 801827, upload-time = "2025-09-19T00:37:25.684Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a6/740fbd9fcac31a1305a8eed30b44bf0f7f1e042342be0a4722c0365ecfca/regex-2025.9.18-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bbb9246568f72dce29bcd433517c2be22c7791784b223a810225af3b50d1aafb", size = 786843, upload-time = "2025-09-19T00:37:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/80/a7/0579e8560682645906da640c9055506465d809cb0f5415d9976f417209a6/regex-2025.9.18-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6a52219a93dd3d92c675383efff6ae18c982e2d7651c792b1e6d121055808743", size = 857430, upload-time = "2025-09-19T00:37:29.362Z" }, - { url = "https://files.pythonhosted.org/packages/8d/9b/4dc96b6c17b38900cc9fee254fc9271d0dde044e82c78c0811b58754fde5/regex-2025.9.18-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:ae9b3840c5bd456780e3ddf2f737ab55a79b790f6409182012718a35c6d43282", size = 848612, upload-time = "2025-09-19T00:37:31.42Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6a/6f659f99bebb1775e5ac81a3fb837b85897c1a4ef5acffd0ff8ffe7e67fb/regex-2025.9.18-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d488c236ac497c46a5ac2005a952c1a0e22a07be9f10c3e735bc7d1209a34773", size = 787967, upload-time = "2025-09-19T00:37:34.019Z" }, - { url = "https://files.pythonhosted.org/packages/99/cb/8a1ab05ecf404e18b54348e293d9b7a60ec2bd7aa59e637020c5eea852e8/regex-2025.9.18-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:b176326bcd544b5e9b17d6943f807697c0cb7351f6cfb45bf5637c95ff7e6306", size = 489773, upload-time = "2025-09-19T00:37:40.968Z" }, - { url = "https://files.pythonhosted.org/packages/93/3b/6543c9b7f7e734d2404fa2863d0d710c907bef99d4598760ed4563d634c3/regex-2025.9.18-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0ffd9e230b826b15b369391bec167baed57c7ce39efc35835448618860995946", size = 291221, upload-time = "2025-09-19T00:37:42.901Z" }, - { url = "https://files.pythonhosted.org/packages/cd/91/e9fdee6ad6bf708d98c5d17fded423dcb0661795a49cba1b4ffb8358377a/regex-2025.9.18-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec46332c41add73f2b57e2f5b642f991f6b15e50e9f86285e08ffe3a512ac39f", size = 289268, upload-time = "2025-09-19T00:37:44.823Z" }, - { url = "https://files.pythonhosted.org/packages/94/a6/bc3e8a918abe4741dadeaeb6c508e3a4ea847ff36030d820d89858f96a6c/regex-2025.9.18-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b80fa342ed1ea095168a3f116637bd1030d39c9ff38dc04e54ef7c521e01fc95", size = 806659, upload-time = "2025-09-19T00:37:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/2b/71/ea62dbeb55d9e6905c7b5a49f75615ea1373afcad95830047e4e310db979/regex-2025.9.18-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4d97071c0ba40f0cf2a93ed76e660654c399a0a04ab7d85472239460f3da84b", size = 871701, upload-time = "2025-09-19T00:37:48.882Z" }, - { url = "https://files.pythonhosted.org/packages/6a/90/fbe9dedb7dad24a3a4399c0bae64bfa932ec8922a0a9acf7bc88db30b161/regex-2025.9.18-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0ac936537ad87cef9e0e66c5144484206c1354224ee811ab1519a32373e411f3", size = 913742, upload-time = "2025-09-19T00:37:51.015Z" }, - { url = "https://files.pythonhosted.org/packages/f0/1c/47e4a8c0e73d41eb9eb9fdeba3b1b810110a5139a2526e82fd29c2d9f867/regex-2025.9.18-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec57f96d4def58c422d212d414efe28218d58537b5445cf0c33afb1b4768571", size = 811117, upload-time = "2025-09-19T00:37:52.686Z" }, - { url = "https://files.pythonhosted.org/packages/2a/da/435f29fddfd015111523671e36d30af3342e8136a889159b05c1d9110480/regex-2025.9.18-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48317233294648bf7cd068857f248e3a57222259a5304d32c7552e2284a1b2ad", size = 794647, upload-time = "2025-09-19T00:37:54.626Z" }, - { url = "https://files.pythonhosted.org/packages/23/66/df5e6dcca25c8bc57ce404eebc7342310a0d218db739d7882c9a2b5974a3/regex-2025.9.18-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:274687e62ea3cf54846a9b25fc48a04459de50af30a7bd0b61a9e38015983494", size = 866747, upload-time = "2025-09-19T00:37:56.367Z" }, - { url = "https://files.pythonhosted.org/packages/82/42/94392b39b531f2e469b2daa40acf454863733b674481fda17462a5ffadac/regex-2025.9.18-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a78722c86a3e7e6aadf9579e3b0ad78d955f2d1f1a8ca4f67d7ca258e8719d4b", size = 853434, upload-time = "2025-09-19T00:37:58.39Z" }, - { url = "https://files.pythonhosted.org/packages/a8/f8/dcc64c7f7bbe58842a8f89622b50c58c3598fbbf4aad0a488d6df2c699f1/regex-2025.9.18-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:06104cd203cdef3ade989a1c45b6215bf42f8b9dd705ecc220c173233f7cba41", size = 798024, upload-time = "2025-09-19T00:38:00.397Z" }, +version = "2026.2.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/db/8cbfd0ba3f302f2d09dd0019a9fcab74b63fee77a76c937d0e33161fb8c1/regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9", size = 488462, upload-time = "2026-02-28T02:16:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/5d/10/ccc22c52802223f2368731964ddd117799e1390ffc39dbb31634a83022ee/regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97", size = 290774, upload-time = "2026-02-28T02:16:23.993Z" }, + { url = "https://files.pythonhosted.org/packages/62/b9/6796b3bf3101e64117201aaa3a5a030ec677ecf34b3cd6141b5d5c6c67d5/regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703", size = 288724, upload-time = "2026-02-28T02:16:25.403Z" }, + { url = "https://files.pythonhosted.org/packages/9c/02/291c0ae3f3a10cea941d0f5366da1843d8d1fa8a25b0671e20a0e454bb38/regex-2026.2.28-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c1b34dfa72f826f535b20712afa9bb3ba580020e834f3c69866c5bddbf10098", size = 791924, upload-time = "2026-02-28T02:16:26.863Z" }, + { url = "https://files.pythonhosted.org/packages/0f/57/f0235cc520d9672742196c5c15098f8f703f2758d48d5a7465a56333e496/regex-2026.2.28-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:851fa70df44325e1e4cdb79c5e676e91a78147b1b543db2aec8734d2add30ec2", size = 860095, upload-time = "2026-02-28T02:16:28.772Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7c/393c94cbedda79a0f5f2435ebd01644aba0b338d327eb24b4aa5b8d6c07f/regex-2026.2.28-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:516604edd17b1c2c3e579cf4e9b25a53bf8fa6e7cedddf1127804d3e0140ca64", size = 906583, upload-time = "2026-02-28T02:16:30.977Z" }, + { url = "https://files.pythonhosted.org/packages/2c/73/a72820f47ca5abf2b5d911d0407ba5178fc52cf9780191ed3a54f5f419a2/regex-2026.2.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7ce83654d1ab701cb619285a18a8e5a889c1216d746ddc710c914ca5fd71022", size = 800234, upload-time = "2026-02-28T02:16:32.55Z" }, + { url = "https://files.pythonhosted.org/packages/34/b3/6e6a4b7b31fa998c4cf159a12cbeaf356386fbd1a8be743b1e80a3da51e4/regex-2026.2.28-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2791948f7c70bb9335a9102df45e93d428f4b8128020d85920223925d73b9e1", size = 772803, upload-time = "2026-02-28T02:16:34.029Z" }, + { url = "https://files.pythonhosted.org/packages/10/e7/5da0280c765d5a92af5e1cd324b3fe8464303189cbaa449de9a71910e273/regex-2026.2.28-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03a83cc26aa2acda6b8b9dfe748cf9e84cbd390c424a1de34fdcef58961a297a", size = 781117, upload-time = "2026-02-28T02:16:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/76/39/0b8d7efb256ae34e1b8157acc1afd8758048a1cf0196e1aec2e71fd99f4b/regex-2026.2.28-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ec6f5674c5dc836994f50f1186dd1fafde4be0666aae201ae2fcc3d29d8adf27", size = 854224, upload-time = "2026-02-28T02:16:38.119Z" }, + { url = "https://files.pythonhosted.org/packages/21/ff/a96d483ebe8fe6d1c67907729202313895d8de8495569ec319c6f29d0438/regex-2026.2.28-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:50c2fc924749543e0eacc93ada6aeeb3ea5f6715825624baa0dccaec771668ae", size = 761898, upload-time = "2026-02-28T02:16:40.333Z" }, + { url = "https://files.pythonhosted.org/packages/89/bd/d4f2e75cb4a54b484e796017e37c0d09d8a0a837de43d17e238adf163f4e/regex-2026.2.28-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ba55c50f408fb5c346a3a02d2ce0ebc839784e24f7c9684fde328ff063c3cdea", size = 844832, upload-time = "2026-02-28T02:16:41.875Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a7/428a135cf5e15e4e11d1e696eb2bf968362f8ea8a5f237122e96bc2ae950/regex-2026.2.28-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:edb1b1b3a5576c56f08ac46f108c40333f222ebfd5cf63afdfa3aab0791ebe5b", size = 788347, upload-time = "2026-02-28T02:16:43.472Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/9061b03cf0fc4b5fa2c3984cbbaed54324377e440a5c5a29d29a72518d62/regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7", size = 489574, upload-time = "2026-02-28T02:16:50.455Z" }, + { url = "https://files.pythonhosted.org/packages/77/83/0c8a5623a233015595e3da499c5a1c13720ac63c107897a6037bb97af248/regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d", size = 291426, upload-time = "2026-02-28T02:16:52.52Z" }, + { url = "https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d", size = 289200, upload-time = "2026-02-28T02:16:54.08Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc", size = 796765, upload-time = "2026-02-28T02:16:55.905Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5d/57702597627fc23278ebf36fbb497ac91c0ce7fec89ac6c81e420ca3e38c/regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8", size = 863093, upload-time = "2026-02-28T02:16:58.094Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/f3ecad537ca2811b4d26b54ca848cf70e04fcfc138667c146a9f3157779c/regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d", size = 909455, upload-time = "2026-02-28T02:17:00.918Z" }, + { url = "https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4", size = 802037, upload-time = "2026-02-28T02:17:02.842Z" }, + { url = "https://files.pythonhosted.org/packages/44/7c/c6d91d8911ac6803b45ca968e8e500c46934e58c0903cbc6d760ee817a0a/regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05", size = 775113, upload-time = "2026-02-28T02:17:04.506Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/4a9368d168d47abd4158580b8c848709667b1cd293ff0c0c277279543bd0/regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5", size = 784194, upload-time = "2026-02-28T02:17:06.888Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bf/2c72ab5d8b7be462cb1651b5cc333da1d0068740342f350fcca3bca31947/regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59", size = 856846, upload-time = "2026-02-28T02:17:09.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f4/6b65c979bb6d09f51bb2d2a7bc85de73c01ec73335d7ddd202dcb8cd1c8f/regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf", size = 763516, upload-time = "2026-02-28T02:17:11.004Z" }, + { url = "https://files.pythonhosted.org/packages/8e/32/29ea5e27400ee86d2cc2b4e80aa059df04eaf78b4f0c18576ae077aeff68/regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae", size = 849278, upload-time = "2026-02-28T02:17:12.693Z" }, + { url = "https://files.pythonhosted.org/packages/1d/91/3233d03b5f865111cd517e1c95ee8b43e8b428d61fa73764a80c9bb6f537/regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b", size = 790068, upload-time = "2026-02-28T02:17:14.9Z" }, + { url = "https://files.pythonhosted.org/packages/87/f6/dc9ef48c61b79c8201585bf37fa70cd781977da86e466cd94e8e95d2443b/regex-2026.2.28-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6d63a07e5ec8ce7184452cb00c41c37b49e67dc4f73b2955b5b8e782ea970784", size = 489311, upload-time = "2026-02-28T02:17:22.591Z" }, + { url = "https://files.pythonhosted.org/packages/95/c8/c20390f2232d3f7956f420f4ef1852608ad57aa26c3dd78516cb9f3dc913/regex-2026.2.28-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e59bc8f30414d283ae8ee1617b13d8112e7135cb92830f0ec3688cb29152585a", size = 291285, upload-time = "2026-02-28T02:17:24.355Z" }, + { url = "https://files.pythonhosted.org/packages/d2/a6/ba1068a631ebd71a230e7d8013fcd284b7c89c35f46f34a7da02082141b1/regex-2026.2.28-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:de0cf053139f96219ccfabb4a8dd2d217c8c82cb206c91d9f109f3f552d6b43d", size = 289051, upload-time = "2026-02-28T02:17:26.722Z" }, + { url = "https://files.pythonhosted.org/packages/1d/1b/7cc3b7af4c244c204b7a80924bd3d85aecd9ba5bc82b485c5806ee8cda9e/regex-2026.2.28-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb4db2f17e6484904f986c5a657cec85574c76b5c5e61c7aae9ffa1bc6224f95", size = 796842, upload-time = "2026-02-28T02:17:29.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/87/26bd03efc60e0d772ac1e7b60a2e6325af98d974e2358f659c507d3c76db/regex-2026.2.28-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:52b017b35ac2214d0db5f4f90e303634dc44e4aba4bd6235a27f97ecbe5b0472", size = 863083, upload-time = "2026-02-28T02:17:31.363Z" }, + { url = "https://files.pythonhosted.org/packages/ae/54/aeaf4afb1aa0a65e40de52a61dc2ac5b00a83c6cb081c8a1d0dda74f3010/regex-2026.2.28-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:69fc560ccbf08a09dc9b52ab69cacfae51e0ed80dc5693078bdc97db2f91ae96", size = 909412, upload-time = "2026-02-28T02:17:33.248Z" }, + { url = "https://files.pythonhosted.org/packages/12/2f/049901def913954e640d199bbc6a7ca2902b6aeda0e5da9d17f114100ec2/regex-2026.2.28-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e61eea47230eba62a31f3e8a0e3164d0f37ef9f40529fb2c79361bc6b53d2a92", size = 802101, upload-time = "2026-02-28T02:17:35.053Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/512fb9ff7f5b15ea204bb1967ebb649059446decacccb201381f9fa6aad4/regex-2026.2.28-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4f5c0b182ad4269e7381b7c27fdb0408399881f7a92a4624fd5487f2971dfc11", size = 775260, upload-time = "2026-02-28T02:17:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/9a92935878aba19bd72706b9db5646a6f993d99b3f6ed42c02ec8beb1d61/regex-2026.2.28-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:96f6269a2882fbb0ee76967116b83679dc628e68eaea44e90884b8d53d833881", size = 784311, upload-time = "2026-02-28T02:17:39.855Z" }, + { url = "https://files.pythonhosted.org/packages/09/d3/fc51a8a738a49a6b6499626580554c9466d3ea561f2b72cfdc72e4149773/regex-2026.2.28-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b5acd4b6a95f37c3c3828e5d053a7d4edaedb85de551db0153754924cb7c83e3", size = 856876, upload-time = "2026-02-28T02:17:42.317Z" }, + { url = "https://files.pythonhosted.org/packages/08/b7/2e641f3d084b120ca4c52e8c762a78da0b32bf03ef546330db3e2635dc5f/regex-2026.2.28-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2234059cfe33d9813a3677ef7667999caea9eeaa83fef98eb6ce15c6cf9e0215", size = 763632, upload-time = "2026-02-28T02:17:45.073Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6d/0009021d97e79ee99f3d8641f0a8d001eed23479ade4c3125a5480bf3e2d/regex-2026.2.28-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c15af43c72a7fb0c97cbc66fa36a43546eddc5c06a662b64a0cbf30d6ac40944", size = 849320, upload-time = "2026-02-28T02:17:47.192Z" }, + { url = "https://files.pythonhosted.org/packages/05/7a/51cfbad5758f8edae430cb21961a9c8d04bce1dae4d2d18d4186eec7cfa1/regex-2026.2.28-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9185cc63359862a6e80fe97f696e04b0ad9a11c4ac0a4a927f979f611bfe3768", size = 790152, upload-time = "2026-02-28T02:17:49.067Z" }, + { url = "https://files.pythonhosted.org/packages/24/07/6c7e4cec1e585959e96cbc24299d97e4437a81173217af54f1804994e911/regex-2026.2.28-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:97054c55db06ab020342cc0d35d6f62a465fa7662871190175f1ad6c655c028f", size = 492541, upload-time = "2026-02-28T02:17:56.813Z" }, + { url = "https://files.pythonhosted.org/packages/7c/13/55eb22ada7f43d4f4bb3815b6132183ebc331c81bd496e2d1f3b8d862e0d/regex-2026.2.28-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d25a10811de831c2baa6aef3c0be91622f44dd8d31dd12e69f6398efb15e48b", size = 292984, upload-time = "2026-02-28T02:17:58.538Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/c301f8cb29ce9644a5ef85104c59244e6e7e90994a0f458da4d39baa8e17/regex-2026.2.28-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d6cfe798d8da41bb1862ed6e0cba14003d387c3c0c4a5d45591076ae9f0ce2f8", size = 291509, upload-time = "2026-02-28T02:18:00.208Z" }, + { url = "https://files.pythonhosted.org/packages/b5/43/aabe384ec1994b91796e903582427bc2ffaed9c4103819ed3c16d8e749f3/regex-2026.2.28-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd0ce43e71d825b7c0661f9c54d4d74bd97c56c3fd102a8985bcfea48236bacb", size = 809429, upload-time = "2026-02-28T02:18:02.328Z" }, + { url = "https://files.pythonhosted.org/packages/04/b8/8d2d987a816720c4f3109cee7c06a4b24ad0e02d4fc74919ab619e543737/regex-2026.2.28-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00945d007fd74a9084d2ab79b695b595c6b7ba3698972fadd43e23230c6979c1", size = 869422, upload-time = "2026-02-28T02:18:04.23Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ad/2c004509e763c0c3719f97c03eca26473bffb3868d54c5f280b8cd4f9e3d/regex-2026.2.28-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bec23c11cbbf09a4df32fe50d57cbdd777bc442269b6e39a1775654f1c95dee2", size = 915175, upload-time = "2026-02-28T02:18:06.791Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/fd429066da487ef555a9da73bf214894aec77fc8c66a261ee355a69871a8/regex-2026.2.28-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5cdcc17d935c8f9d3f4db5c2ebe2640c332e3822ad5d23c2f8e0228e6947943a", size = 812044, upload-time = "2026-02-28T02:18:08.736Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ca/feedb7055c62a3f7f659971bf45f0e0a87544b6b0cf462884761453f97c5/regex-2026.2.28-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a448af01e3d8031c89c5d902040b124a5e921a25c4e5e07a861ca591ce429341", size = 782056, upload-time = "2026-02-28T02:18:10.777Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/1aa959ed0d25c1dd7dd5047ea8ba482ceaef38ce363c401fd32a6b923e60/regex-2026.2.28-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:10d28e19bd4888e4abf43bd3925f3c134c52fdf7259219003588a42e24c2aa25", size = 798743, upload-time = "2026-02-28T02:18:13.025Z" }, + { url = "https://files.pythonhosted.org/packages/3b/1f/dadb9cf359004784051c897dcf4d5d79895f73a1bbb7b827abaa4814ae80/regex-2026.2.28-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:99985a2c277dcb9ccb63f937451af5d65177af1efdeb8173ac55b61095a0a05c", size = 864633, upload-time = "2026-02-28T02:18:16.84Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f1/b9a25eb24e1cf79890f09e6ec971ee5b511519f1851de3453bc04f6c902b/regex-2026.2.28-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:e1e7b24cb3ae9953a560c563045d1ba56ee4749fbd05cf21ba571069bd7be81b", size = 770862, upload-time = "2026-02-28T02:18:18.892Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/c5cb10b7aa6f182f9247a30cc9527e326601f46f4df864ac6db588d11fcd/regex-2026.2.28-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d8511a01d0e4ee1992eb3ba19e09bc1866fe03f05129c3aec3fdc4cbc77aad3f", size = 854788, upload-time = "2026-02-28T02:18:21.475Z" }, + { url = "https://files.pythonhosted.org/packages/0a/50/414ba0731c4bd40b011fa4703b2cc86879ec060c64f2a906e65a56452589/regex-2026.2.28-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:aaffaecffcd2479ce87aa1e74076c221700b7c804e48e98e62500ee748f0f550", size = 800184, upload-time = "2026-02-28T02:18:23.492Z" }, + { url = "https://files.pythonhosted.org/packages/cf/03/691015f7a7cb1ed6dacb2ea5de5682e4858e05a4c5506b2839cd533bbcd6/regex-2026.2.28-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:78454178c7df31372ea737996fb7f36b3c2c92cccc641d251e072478afb4babc", size = 489497, upload-time = "2026-02-28T02:18:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ba/8db8fd19afcbfa0e1036eaa70c05f20ca8405817d4ad7a38a6b4c2f031ac/regex-2026.2.28-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:5d10303dd18cedfd4d095543998404df656088240bcfd3cd20a8f95b861f74bd", size = 291295, upload-time = "2026-02-28T02:18:33.426Z" }, + { url = "https://files.pythonhosted.org/packages/5a/79/9aa0caf089e8defef9b857b52fc53801f62ff868e19e5c83d4a96612eba1/regex-2026.2.28-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:19a9c9e0a8f24f39d575a6a854d516b48ffe4cbdcb9de55cb0570a032556ecff", size = 289275, upload-time = "2026-02-28T02:18:35.247Z" }, + { url = "https://files.pythonhosted.org/packages/eb/26/ee53117066a30ef9c883bf1127eece08308ccf8ccd45c45a966e7a665385/regex-2026.2.28-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09500be324f49b470d907b3ef8af9afe857f5cca486f853853f7945ddbf75911", size = 797176, upload-time = "2026-02-28T02:18:37.15Z" }, + { url = "https://files.pythonhosted.org/packages/05/1b/67fb0495a97259925f343ae78b5d24d4a6624356ae138b57f18bd43006e4/regex-2026.2.28-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fb1c4ff62277d87a7335f2c1ea4e0387b8f2b3ad88a64efd9943906aafad4f33", size = 863813, upload-time = "2026-02-28T02:18:39.478Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/93ac9bbafc53618091c685c7ed40239a90bf9f2a82c983f0baa97cb7ae07/regex-2026.2.28-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b8b3f1be1738feadc69f62daa250c933e85c6f34fa378f54a7ff43807c1b9117", size = 908678, upload-time = "2026-02-28T02:18:41.619Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7a/a8f5e0561702b25239846a16349feece59712ae20598ebb205580332a471/regex-2026.2.28-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc8ed8c3f41c27acb83f7b6a9eb727a73fc6663441890c5cb3426a5f6a91ce7d", size = 801528, upload-time = "2026-02-28T02:18:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/96/5d/ed6d4cbde80309854b1b9f42d9062fee38ade15f7eb4909f6ef2440403b5/regex-2026.2.28-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa539be029844c0ce1114762d2952ab6cfdd7c7c9bd72e0db26b94c3c36dcc5a", size = 775373, upload-time = "2026-02-28T02:18:46.102Z" }, + { url = "https://files.pythonhosted.org/packages/6a/e9/6e53c34e8068b9deec3e87210086ecb5b9efebdefca6b0d3fa43d66dcecb/regex-2026.2.28-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7900157786428a79615a8264dac1f12c9b02957c473c8110c6b1f972dcecaddf", size = 784859, upload-time = "2026-02-28T02:18:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/48/3c/736e1c7ca7f0dcd2ae33819888fdc69058a349b7e5e84bc3e2f296bbf794/regex-2026.2.28-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0b1d2b07614d95fa2bf8a63fd1e98bd8fa2b4848dc91b1efbc8ba219fdd73952", size = 857813, upload-time = "2026-02-28T02:18:50.576Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7c/48c4659ad9da61f58e79dbe8c05223e0006696b603c16eb6b5cbfbb52c27/regex-2026.2.28-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b389c61aa28a79c2e0527ac36da579869c2e235a5b208a12c5b5318cda2501d8", size = 763705, upload-time = "2026-02-28T02:18:52.59Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a1/bc1c261789283128165f71b71b4b221dd1b79c77023752a6074c102f18d8/regex-2026.2.28-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f467cb602f03fbd1ab1908f68b53c649ce393fde056628dc8c7e634dab6bfc07", size = 848734, upload-time = "2026-02-28T02:18:54.595Z" }, + { url = "https://files.pythonhosted.org/packages/10/d8/979407faf1397036e25a5ae778157366a911c0f382c62501009f4957cf86/regex-2026.2.28-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e8c8cb2deba42f5ec1ede46374e990f8adc5e6456a57ac1a261b19be6f28e4e6", size = 789871, upload-time = "2026-02-28T02:18:57.34Z" }, + { url = "https://files.pythonhosted.org/packages/d3/eb/8389f9e940ac89bcf58d185e230a677b4fd07c5f9b917603ad5c0f8fa8fe/regex-2026.2.28-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a5dac14d0872eeb35260a8e30bac07ddf22adc1e3a0635b52b02e180d17c9c7e", size = 492546, upload-time = "2026-02-28T02:19:05.378Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c7/09441d27ce2a6fa6a61ea3150ea4639c1dcda9b31b2ea07b80d6937b24dd/regex-2026.2.28-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ec0c608b7a7465ffadb344ed7c987ff2f11ee03f6a130b569aa74d8a70e8333c", size = 292986, upload-time = "2026-02-28T02:19:07.24Z" }, + { url = "https://files.pythonhosted.org/packages/fb/69/4144b60ed7760a6bd235e4087041f487aa4aa62b45618ce018b0c14833ea/regex-2026.2.28-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c7815afb0ca45456613fdaf60ea9c993715511c8d53a83bc468305cbc0ee23c7", size = 291518, upload-time = "2026-02-28T02:19:09.698Z" }, + { url = "https://files.pythonhosted.org/packages/2d/be/77e5426cf5948c82f98c53582009ca9e94938c71f73a8918474f2e2990bb/regex-2026.2.28-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b059e71ec363968671693a78c5053bd9cb2fe410f9b8e4657e88377ebd603a2e", size = 809464, upload-time = "2026-02-28T02:19:12.494Z" }, + { url = "https://files.pythonhosted.org/packages/45/99/2c8c5ac90dc7d05c6e7d8e72c6a3599dc08cd577ac476898e91ca787d7f1/regex-2026.2.28-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8cf76f1a29f0e99dcfd7aef1551a9827588aae5a737fe31442021165f1920dc", size = 869553, upload-time = "2026-02-28T02:19:15.151Z" }, + { url = "https://files.pythonhosted.org/packages/53/34/daa66a342f0271e7737003abf6c3097aa0498d58c668dbd88362ef94eb5d/regex-2026.2.28-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:180e08a435a0319e6a4821c3468da18dc7001987e1c17ae1335488dfe7518dd8", size = 915289, upload-time = "2026-02-28T02:19:17.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c7/e22c2aaf0a12e7e22ab19b004bb78d32ca1ecc7ef245949935463c5567de/regex-2026.2.28-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e496956106fd59ba6322a8ea17141a27c5040e5ee8f9433ae92d4e5204462a0", size = 812156, upload-time = "2026-02-28T02:19:20.011Z" }, + { url = "https://files.pythonhosted.org/packages/7f/bb/2dc18c1efd9051cf389cd0d7a3a4d90f6804b9fff3a51b5dc3c85b935f71/regex-2026.2.28-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bba2b18d70eeb7b79950f12f633beeecd923f7c9ad6f6bae28e59b4cb3ab046b", size = 782215, upload-time = "2026-02-28T02:19:22.047Z" }, + { url = "https://files.pythonhosted.org/packages/17/1e/9e4ec9b9013931faa32226ec4aa3c71fe664a6d8a2b91ac56442128b332f/regex-2026.2.28-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6db7bfae0f8a2793ff1f7021468ea55e2699d0790eb58ee6ab36ae43aa00bc5b", size = 798925, upload-time = "2026-02-28T02:19:24.173Z" }, + { url = "https://files.pythonhosted.org/packages/71/57/a505927e449a9ccb41e2cc8d735e2abe3444b0213d1cf9cb364a8c1f2524/regex-2026.2.28-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d0b02e8b7e5874b48ae0f077ecca61c1a6a9f9895e9c6dfb191b55b242862033", size = 864701, upload-time = "2026-02-28T02:19:26.376Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ad/c62cb60cdd93e13eac5b3d9d6bd5d284225ed0e3329426f94d2552dd7cca/regex-2026.2.28-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:25b6eb660c5cf4b8c3407a1ed462abba26a926cc9965e164268a3267bcc06a43", size = 770899, upload-time = "2026-02-28T02:19:29.38Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5a/874f861f5c3d5ab99633e8030dee1bc113db8e0be299d1f4b07f5b5ec349/regex-2026.2.28-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:5a932ea8ad5d0430351ff9c76c8db34db0d9f53c1d78f06022a21f4e290c5c18", size = 854727, upload-time = "2026-02-28T02:19:31.494Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ca/d2c03b0efde47e13db895b975b2be6a73ed90b8ba963677927283d43bf74/regex-2026.2.28-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1c2c95e1a2b0f89d01e821ff4de1be4b5d73d1f4b0bf679fa27c1ad8d2327f1a", size = 800366, upload-time = "2026-02-28T02:19:34.248Z" }, ] [[package]] @@ -3379,369 +4224,268 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "oauthlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, -] - [[package]] name = "rich" -version = "14.1.0" +version = "14.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, ] [[package]] name = "rpds-py" -version = "0.27.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/ed/3aef893e2dd30e77e35d20d4ddb45ca459db59cead748cad9796ad479411/rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef", size = 371606, upload-time = "2025-08-27T12:12:25.189Z" }, - { url = "https://files.pythonhosted.org/packages/6d/82/9818b443e5d3eb4c83c3994561387f116aae9833b35c484474769c4a8faf/rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be", size = 353452, upload-time = "2025-08-27T12:12:27.433Z" }, - { url = "https://files.pythonhosted.org/packages/99/c7/d2a110ffaaa397fc6793a83c7bd3545d9ab22658b7cdff05a24a4535cc45/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61", size = 381519, upload-time = "2025-08-27T12:12:28.719Z" }, - { url = "https://files.pythonhosted.org/packages/5a/bc/e89581d1f9d1be7d0247eaef602566869fdc0d084008ba139e27e775366c/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb", size = 394424, upload-time = "2025-08-27T12:12:30.207Z" }, - { url = "https://files.pythonhosted.org/packages/ac/2e/36a6861f797530e74bb6ed53495f8741f1ef95939eed01d761e73d559067/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657", size = 523467, upload-time = "2025-08-27T12:12:31.808Z" }, - { url = "https://files.pythonhosted.org/packages/c4/59/c1bc2be32564fa499f988f0a5c6505c2f4746ef96e58e4d7de5cf923d77e/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013", size = 402660, upload-time = "2025-08-27T12:12:33.444Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ec/ef8bf895f0628dd0a59e54d81caed6891663cb9c54a0f4bb7da918cb88cf/rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a", size = 384062, upload-time = "2025-08-27T12:12:34.857Z" }, - { url = "https://files.pythonhosted.org/packages/69/f7/f47ff154be8d9a5e691c083a920bba89cef88d5247c241c10b9898f595a1/rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1", size = 401289, upload-time = "2025-08-27T12:12:36.085Z" }, - { url = "https://files.pythonhosted.org/packages/3b/d9/ca410363efd0615814ae579f6829cafb39225cd63e5ea5ed1404cb345293/rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10", size = 417718, upload-time = "2025-08-27T12:12:37.401Z" }, - { url = "https://files.pythonhosted.org/packages/e3/a0/8cb5c2ff38340f221cc067cc093d1270e10658ba4e8d263df923daa18e86/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808", size = 558333, upload-time = "2025-08-27T12:12:38.672Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8c/1b0de79177c5d5103843774ce12b84caa7164dfc6cd66378768d37db11bf/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8", size = 589127, upload-time = "2025-08-27T12:12:41.48Z" }, - { url = "https://files.pythonhosted.org/packages/c8/5e/26abb098d5e01266b0f3a2488d299d19ccc26849735d9d2b95c39397e945/rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9", size = 554899, upload-time = "2025-08-27T12:12:42.925Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c1/7907329fbef97cbd49db6f7303893bd1dd5a4a3eae415839ffdfb0762cae/rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881", size = 371063, upload-time = "2025-08-27T12:12:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/11/94/2aab4bc86228bcf7c48760990273653a4900de89c7537ffe1b0d6097ed39/rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5", size = 353210, upload-time = "2025-08-27T12:12:49.187Z" }, - { url = "https://files.pythonhosted.org/packages/3a/57/f5eb3ecf434342f4f1a46009530e93fd201a0b5b83379034ebdb1d7c1a58/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e", size = 381636, upload-time = "2025-08-27T12:12:50.492Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f4/ef95c5945e2ceb5119571b184dd5a1cc4b8541bbdf67461998cfeac9cb1e/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c", size = 394341, upload-time = "2025-08-27T12:12:52.024Z" }, - { url = "https://files.pythonhosted.org/packages/5a/7e/4bd610754bf492d398b61725eb9598ddd5eb86b07d7d9483dbcd810e20bc/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195", size = 523428, upload-time = "2025-08-27T12:12:53.779Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e5/059b9f65a8c9149361a8b75094864ab83b94718344db511fd6117936ed2a/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52", size = 402923, upload-time = "2025-08-27T12:12:55.15Z" }, - { url = "https://files.pythonhosted.org/packages/f5/48/64cabb7daced2968dd08e8a1b7988bf358d7bd5bcd5dc89a652f4668543c/rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed", size = 384094, upload-time = "2025-08-27T12:12:57.194Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e1/dc9094d6ff566bff87add8a510c89b9e158ad2ecd97ee26e677da29a9e1b/rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a", size = 401093, upload-time = "2025-08-27T12:12:58.985Z" }, - { url = "https://files.pythonhosted.org/packages/37/8e/ac8577e3ecdd5593e283d46907d7011618994e1d7ab992711ae0f78b9937/rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde", size = 417969, upload-time = "2025-08-27T12:13:00.367Z" }, - { url = "https://files.pythonhosted.org/packages/66/6d/87507430a8f74a93556fe55c6485ba9c259949a853ce407b1e23fea5ba31/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21", size = 558302, upload-time = "2025-08-27T12:13:01.737Z" }, - { url = "https://files.pythonhosted.org/packages/3a/bb/1db4781ce1dda3eecc735e3152659a27b90a02ca62bfeea17aee45cc0fbc/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9", size = 589259, upload-time = "2025-08-27T12:13:03.127Z" }, - { url = "https://files.pythonhosted.org/packages/7b/0e/ae1c8943d11a814d01b482e1f8da903f88047a962dff9bbdadf3bd6e6fd1/rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948", size = 554983, upload-time = "2025-08-27T12:13:04.516Z" }, - { url = "https://files.pythonhosted.org/packages/bd/fe/38de28dee5df58b8198c743fe2bea0c785c6d40941b9950bac4cdb71a014/rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90", size = 361887, upload-time = "2025-08-27T12:13:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/4b6c7eedc7dd90986bf0fab6ea2a091ec11c01b15f8ba0a14d3f80450468/rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5", size = 345795, upload-time = "2025-08-27T12:13:11.65Z" }, - { url = "https://files.pythonhosted.org/packages/6f/0e/e650e1b81922847a09cca820237b0edee69416a01268b7754d506ade11ad/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e", size = 385121, upload-time = "2025-08-27T12:13:13.008Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ea/b306067a712988e2bff00dcc7c8f31d26c29b6d5931b461aa4b60a013e33/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881", size = 398976, upload-time = "2025-08-27T12:13:14.368Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0a/26dc43c8840cb8fe239fe12dbc8d8de40f2365e838f3d395835dde72f0e5/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec", size = 525953, upload-time = "2025-08-27T12:13:15.774Z" }, - { url = "https://files.pythonhosted.org/packages/22/14/c85e8127b573aaf3a0cbd7fbb8c9c99e735a4a02180c84da2a463b766e9e/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb", size = 407915, upload-time = "2025-08-27T12:13:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/ed/7b/8f4fee9ba1fb5ec856eb22d725a4efa3deb47f769597c809e03578b0f9d9/rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5", size = 386883, upload-time = "2025-08-27T12:13:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/86/47/28fa6d60f8b74fcdceba81b272f8d9836ac0340570f68f5df6b41838547b/rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a", size = 405699, upload-time = "2025-08-27T12:13:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/d0/fd/c5987b5e054548df56953a21fe2ebed51fc1ec7c8f24fd41c067b68c4a0a/rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444", size = 423713, upload-time = "2025-08-27T12:13:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ba/3c4978b54a73ed19a7d74531be37a8bcc542d917c770e14d372b8daea186/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a", size = 562324, upload-time = "2025-08-27T12:13:22.789Z" }, - { url = "https://files.pythonhosted.org/packages/b5/6c/6943a91768fec16db09a42b08644b960cff540c66aab89b74be6d4a144ba/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1", size = 593646, upload-time = "2025-08-27T12:13:24.122Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/9d7a8f4be5f4396f011a6bb7a19fe26303a0dac9064462f5651ced2f572f/rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998", size = 558137, upload-time = "2025-08-27T12:13:25.557Z" }, - { url = "https://files.pythonhosted.org/packages/cc/77/610aeee8d41e39080c7e14afa5387138e3c9fa9756ab893d09d99e7d8e98/rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b", size = 361741, upload-time = "2025-08-27T12:13:31.039Z" }, - { url = "https://files.pythonhosted.org/packages/3a/fc/c43765f201c6a1c60be2043cbdb664013def52460a4c7adace89d6682bf4/rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf", size = 345574, upload-time = "2025-08-27T12:13:32.902Z" }, - { url = "https://files.pythonhosted.org/packages/20/42/ee2b2ca114294cd9847d0ef9c26d2b0851b2e7e00bf14cc4c0b581df0fc3/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83", size = 385051, upload-time = "2025-08-27T12:13:34.228Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e8/1e430fe311e4799e02e2d1af7c765f024e95e17d651612425b226705f910/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf", size = 398395, upload-time = "2025-08-27T12:13:36.132Z" }, - { url = "https://files.pythonhosted.org/packages/82/95/9dc227d441ff2670651c27a739acb2535ccaf8b351a88d78c088965e5996/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2", size = 524334, upload-time = "2025-08-27T12:13:37.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/01/a670c232f401d9ad461d9a332aa4080cd3cb1d1df18213dbd0d2a6a7ab51/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0", size = 407691, upload-time = "2025-08-27T12:13:38.94Z" }, - { url = "https://files.pythonhosted.org/packages/03/36/0a14aebbaa26fe7fab4780c76f2239e76cc95a0090bdb25e31d95c492fcd/rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418", size = 386868, upload-time = "2025-08-27T12:13:40.192Z" }, - { url = "https://files.pythonhosted.org/packages/3b/03/8c897fb8b5347ff6c1cc31239b9611c5bf79d78c984430887a353e1409a1/rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d", size = 405469, upload-time = "2025-08-27T12:13:41.496Z" }, - { url = "https://files.pythonhosted.org/packages/da/07/88c60edc2df74850d496d78a1fdcdc7b54360a7f610a4d50008309d41b94/rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274", size = 422125, upload-time = "2025-08-27T12:13:42.802Z" }, - { url = "https://files.pythonhosted.org/packages/6b/86/5f4c707603e41b05f191a749984f390dabcbc467cf833769b47bf14ba04f/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd", size = 562341, upload-time = "2025-08-27T12:13:44.472Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/3c0cb2492094e3cd9baf9e49bbb7befeceb584ea0c1a8b5939dca4da12e5/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2", size = 592511, upload-time = "2025-08-27T12:13:45.898Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/82e64fbb0047c46a168faa28d0d45a7851cd0582f850b966811d30f67ad8/rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002", size = 557736, upload-time = "2025-08-27T12:13:47.408Z" }, - { url = "https://files.pythonhosted.org/packages/01/76/1cdf1f91aed5c3a7bf2eba1f1c4e4d6f57832d73003919a20118870ea659/rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228", size = 358355, upload-time = "2025-08-27T12:13:54.012Z" }, - { url = "https://files.pythonhosted.org/packages/c3/6f/bf142541229374287604caf3bb2a4ae17f0a580798fd72d3b009b532db4e/rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92", size = 342138, upload-time = "2025-08-27T12:13:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/1a/77/355b1c041d6be40886c44ff5e798b4e2769e497b790f0f7fd1e78d17e9a8/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2", size = 380247, upload-time = "2025-08-27T12:13:57.683Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a4/d9cef5c3946ea271ce2243c51481971cd6e34f21925af2783dd17b26e815/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723", size = 390699, upload-time = "2025-08-27T12:13:59.137Z" }, - { url = "https://files.pythonhosted.org/packages/3a/06/005106a7b8c6c1a7e91b73169e49870f4af5256119d34a361ae5240a0c1d/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802", size = 521852, upload-time = "2025-08-27T12:14:00.583Z" }, - { url = "https://files.pythonhosted.org/packages/e5/3e/50fb1dac0948e17a02eb05c24510a8fe12d5ce8561c6b7b7d1339ab7ab9c/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f", size = 402582, upload-time = "2025-08-27T12:14:02.034Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b0/f4e224090dc5b0ec15f31a02d746ab24101dd430847c4d99123798661bfc/rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2", size = 384126, upload-time = "2025-08-27T12:14:03.437Z" }, - { url = "https://files.pythonhosted.org/packages/54/77/ac339d5f82b6afff1df8f0fe0d2145cc827992cb5f8eeb90fc9f31ef7a63/rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21", size = 399486, upload-time = "2025-08-27T12:14:05.443Z" }, - { url = "https://files.pythonhosted.org/packages/d6/29/3e1c255eee6ac358c056a57d6d6869baa00a62fa32eea5ee0632039c50a3/rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef", size = 414832, upload-time = "2025-08-27T12:14:06.902Z" }, - { url = "https://files.pythonhosted.org/packages/3f/db/6d498b844342deb3fa1d030598db93937a9964fcf5cb4da4feb5f17be34b/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081", size = 557249, upload-time = "2025-08-27T12:14:08.37Z" }, - { url = "https://files.pythonhosted.org/packages/60/f3/690dd38e2310b6f68858a331399b4d6dbb9132c3e8ef8b4333b96caf403d/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd", size = 587356, upload-time = "2025-08-27T12:14:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/86/e3/84507781cccd0145f35b1dc32c72675200c5ce8d5b30f813e49424ef68fc/rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7", size = 555300, upload-time = "2025-08-27T12:14:11.783Z" }, - { url = "https://files.pythonhosted.org/packages/70/36/b6e6066520a07cf029d385de869729a895917b411e777ab1cde878100a1d/rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334", size = 362472, upload-time = "2025-08-27T12:14:16.333Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/b4646032e0dcec0df9c73a3bd52f63bc6c5f9cda992f06bd0e73fe3fbebd/rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33", size = 345676, upload-time = "2025-08-27T12:14:17.764Z" }, - { url = "https://files.pythonhosted.org/packages/b0/16/2f1003ee5d0af4bcb13c0cf894957984c32a6751ed7206db2aee7379a55e/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a", size = 385313, upload-time = "2025-08-27T12:14:19.829Z" }, - { url = "https://files.pythonhosted.org/packages/05/cd/7eb6dd7b232e7f2654d03fa07f1414d7dfc980e82ba71e40a7c46fd95484/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b", size = 399080, upload-time = "2025-08-27T12:14:21.531Z" }, - { url = "https://files.pythonhosted.org/packages/20/51/5829afd5000ec1cb60f304711f02572d619040aa3ec033d8226817d1e571/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7", size = 523868, upload-time = "2025-08-27T12:14:23.485Z" }, - { url = "https://files.pythonhosted.org/packages/05/2c/30eebca20d5db95720ab4d2faec1b5e4c1025c473f703738c371241476a2/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136", size = 408750, upload-time = "2025-08-27T12:14:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/90/1a/cdb5083f043597c4d4276eae4e4c70c55ab5accec078da8611f24575a367/rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff", size = 387688, upload-time = "2025-08-27T12:14:27.537Z" }, - { url = "https://files.pythonhosted.org/packages/7c/92/cf786a15320e173f945d205ab31585cc43969743bb1a48b6888f7a2b0a2d/rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9", size = 407225, upload-time = "2025-08-27T12:14:28.981Z" }, - { url = "https://files.pythonhosted.org/packages/33/5c/85ee16df5b65063ef26017bef33096557a4c83fbe56218ac7cd8c235f16d/rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60", size = 423361, upload-time = "2025-08-27T12:14:30.469Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8e/1c2741307fcabd1a334ecf008e92c4f47bb6f848712cf15c923becfe82bb/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e", size = 562493, upload-time = "2025-08-27T12:14:31.987Z" }, - { url = "https://files.pythonhosted.org/packages/04/03/5159321baae9b2222442a70c1f988cbbd66b9be0675dd3936461269be360/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212", size = 592623, upload-time = "2025-08-27T12:14:33.543Z" }, - { url = "https://files.pythonhosted.org/packages/ff/39/c09fd1ad28b85bc1d4554a8710233c9f4cefd03d7717a1b8fbfd171d1167/rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675", size = 558800, upload-time = "2025-08-27T12:14:35.436Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/dc7931dc2fa4a6e46b2a4fa744a9fe5c548efd70e0ba74f40b39fa4a8c10/rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2", size = 358944, upload-time = "2025-08-27T12:14:41.199Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/4af76ac4e9f336bfb1a5f240d18a33c6b2fcaadb7472ac7680576512b49a/rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4", size = 342283, upload-time = "2025-08-27T12:14:42.699Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/2a7c619b3c2272ea9feb9ade67a45c40b3eeb500d503ad4c28c395dc51b4/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e", size = 380320, upload-time = "2025-08-27T12:14:44.157Z" }, - { url = "https://files.pythonhosted.org/packages/a2/7d/4c6d243ba4a3057e994bb5bedd01b5c963c12fe38dde707a52acdb3849e7/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817", size = 391760, upload-time = "2025-08-27T12:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/b4/71/b19401a909b83bcd67f90221330bc1ef11bc486fe4e04c24388d28a618ae/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec", size = 522476, upload-time = "2025-08-27T12:14:47.364Z" }, - { url = "https://files.pythonhosted.org/packages/e4/44/1a3b9715c0455d2e2f0f6df5ee6d6f5afdc423d0773a8a682ed2b43c566c/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a", size = 403418, upload-time = "2025-08-27T12:14:49.991Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4b/fb6c4f14984eb56673bc868a66536f53417ddb13ed44b391998100a06a96/rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8", size = 384771, upload-time = "2025-08-27T12:14:52.159Z" }, - { url = "https://files.pythonhosted.org/packages/c0/56/d5265d2d28b7420d7b4d4d85cad8ef891760f5135102e60d5c970b976e41/rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48", size = 400022, upload-time = "2025-08-27T12:14:53.859Z" }, - { url = "https://files.pythonhosted.org/packages/8f/e9/9f5fc70164a569bdd6ed9046486c3568d6926e3a49bdefeeccfb18655875/rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb", size = 416787, upload-time = "2025-08-27T12:14:55.673Z" }, - { url = "https://files.pythonhosted.org/packages/d4/64/56dd03430ba491db943a81dcdef115a985aac5f44f565cd39a00c766d45c/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734", size = 557538, upload-time = "2025-08-27T12:14:57.245Z" }, - { url = "https://files.pythonhosted.org/packages/3f/36/92cc885a3129993b1d963a2a42ecf64e6a8e129d2c7cc980dbeba84e55fb/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb", size = 588512, upload-time = "2025-08-27T12:14:58.728Z" }, - { url = "https://files.pythonhosted.org/packages/dd/10/6b283707780a81919f71625351182b4f98932ac89a09023cb61865136244/rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0", size = 555813, upload-time = "2025-08-27T12:15:00.334Z" }, - { url = "https://files.pythonhosted.org/packages/d5/63/b7cc415c345625d5e62f694ea356c58fb964861409008118f1245f8c3347/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf", size = 371360, upload-time = "2025-08-27T12:15:29.218Z" }, - { url = "https://files.pythonhosted.org/packages/e5/8c/12e1b24b560cf378b8ffbdb9dc73abd529e1adcfcf82727dfd29c4a7b88d/rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3", size = 353933, upload-time = "2025-08-27T12:15:30.837Z" }, - { url = "https://files.pythonhosted.org/packages/9b/85/1bb2210c1f7a1b99e91fea486b9f0f894aa5da3a5ec7097cbad7dec6d40f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636", size = 382962, upload-time = "2025-08-27T12:15:32.348Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c9/a839b9f219cf80ed65f27a7f5ddbb2809c1b85c966020ae2dff490e0b18e/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8", size = 394412, upload-time = "2025-08-27T12:15:33.839Z" }, - { url = "https://files.pythonhosted.org/packages/02/2d/b1d7f928b0b1f4fc2e0133e8051d199b01d7384875adc63b6ddadf3de7e5/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc", size = 523972, upload-time = "2025-08-27T12:15:35.377Z" }, - { url = "https://files.pythonhosted.org/packages/a9/af/2cbf56edd2d07716df1aec8a726b3159deb47cb5c27e1e42b71d705a7c2f/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8", size = 403273, upload-time = "2025-08-27T12:15:37.051Z" }, - { url = "https://files.pythonhosted.org/packages/c0/93/425e32200158d44ff01da5d9612c3b6711fe69f606f06e3895511f17473b/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc", size = 385278, upload-time = "2025-08-27T12:15:38.571Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1a/1a04a915ecd0551bfa9e77b7672d1937b4b72a0fc204a17deef76001cfb2/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71", size = 402084, upload-time = "2025-08-27T12:15:40.529Z" }, - { url = "https://files.pythonhosted.org/packages/51/f7/66585c0fe5714368b62951d2513b684e5215beaceab2c6629549ddb15036/rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad", size = 419041, upload-time = "2025-08-27T12:15:42.191Z" }, - { url = "https://files.pythonhosted.org/packages/8e/7e/83a508f6b8e219bba2d4af077c35ba0e0cdd35a751a3be6a7cba5a55ad71/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab", size = 560084, upload-time = "2025-08-27T12:15:43.839Z" }, - { url = "https://files.pythonhosted.org/packages/66/66/bb945683b958a1b19eb0fe715594630d0f36396ebdef4d9b89c2fa09aa56/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059", size = 590115, upload-time = "2025-08-27T12:15:46.647Z" }, - { url = "https://files.pythonhosted.org/packages/12/00/ccfaafaf7db7e7adace915e5c2f2c2410e16402561801e9c7f96683002d3/rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b", size = 556561, upload-time = "2025-08-27T12:15:48.219Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ed/e1fba02de17f4f76318b834425257c8ea297e415e12c68b4361f63e8ae92/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df", size = 371402, upload-time = "2025-08-27T12:15:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/af/7c/e16b959b316048b55585a697e94add55a4ae0d984434d279ea83442e460d/rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3", size = 354084, upload-time = "2025-08-27T12:15:53.219Z" }, - { url = "https://files.pythonhosted.org/packages/de/c1/ade645f55de76799fdd08682d51ae6724cb46f318573f18be49b1e040428/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9", size = 383090, upload-time = "2025-08-27T12:15:55.158Z" }, - { url = "https://files.pythonhosted.org/packages/1f/27/89070ca9b856e52960da1472efcb6c20ba27cfe902f4f23ed095b9cfc61d/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc", size = 394519, upload-time = "2025-08-27T12:15:57.238Z" }, - { url = "https://files.pythonhosted.org/packages/b3/28/be120586874ef906aa5aeeae95ae8df4184bc757e5b6bd1c729ccff45ed5/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4", size = 523817, upload-time = "2025-08-27T12:15:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/70cc197bc11cfcde02a86f36ac1eed15c56667c2ebddbdb76a47e90306da/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66", size = 403240, upload-time = "2025-08-27T12:16:00.923Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/46936cca449f7f518f2f4996e0e8344db4b57e2081e752441154089d2a5f/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e", size = 385194, upload-time = "2025-08-27T12:16:02.802Z" }, - { url = "https://files.pythonhosted.org/packages/e1/62/29c0d3e5125c3270b51415af7cbff1ec587379c84f55a5761cc9efa8cd06/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c", size = 402086, upload-time = "2025-08-27T12:16:04.806Z" }, - { url = "https://files.pythonhosted.org/packages/8f/66/03e1087679227785474466fdd04157fb793b3b76e3fcf01cbf4c693c1949/rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf", size = 419272, upload-time = "2025-08-27T12:16:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/6a/24/e3e72d265121e00b063aef3e3501e5b2473cf1b23511d56e529531acf01e/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf", size = 560003, upload-time = "2025-08-27T12:16:08.06Z" }, - { url = "https://files.pythonhosted.org/packages/26/ca/f5a344c534214cc2d41118c0699fffbdc2c1bc7046f2a2b9609765ab9c92/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6", size = 590482, upload-time = "2025-08-27T12:16:10.137Z" }, - { url = "https://files.pythonhosted.org/packages/ce/08/4349bdd5c64d9d193c360aa9db89adeee6f6682ab8825dca0a3f535f434f/rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a", size = 556523, upload-time = "2025-08-27T12:16:12.188Z" }, +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, ] [[package]] name = "ruff" -version = "0.14.0" +version = "0.15.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/9b/840e0039e65fcf12758adf684d2289024d6140cde9268cc59887dc55189c/ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2", size = 4574214, upload-time = "2026-03-05T20:06:34.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/20/5369c3ce21588c708bcbe517a8fbe1a8dfdb5dfd5137e14790b1da71612c/ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c", size = 10478185, upload-time = "2026-03-05T20:06:29.093Z" }, + { url = "https://files.pythonhosted.org/packages/44/ed/e81dd668547da281e5dce710cf0bc60193f8d3d43833e8241d006720e42b/ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080", size = 10859201, upload-time = "2026-03-05T20:06:32.632Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8f/533075f00aaf19b07c5cd6aa6e5d89424b06b3b3f4583bfa9c640a079059/ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010", size = 10184752, upload-time = "2026-03-05T20:06:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/66/0e/ba49e2c3fa0395b3152bad634c7432f7edfc509c133b8f4529053ff024fb/ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65", size = 10534857, upload-time = "2026-03-05T20:06:19.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/71/39234440f27a226475a0659561adb0d784b4d247dfe7f43ffc12dd02e288/ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440", size = 10309120, upload-time = "2026-03-05T20:06:00.435Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/4140aa86a93df032156982b726f4952aaec4a883bb98cb6ef73c347da253/ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204", size = 11047428, upload-time = "2026-03-05T20:05:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/4953e7e3287676f78fbe85e3a0ca414c5ca81237b7575bdadc00229ac240/ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8", size = 11914251, upload-time = "2026-03-05T20:06:22.887Z" }, + { url = "https://files.pythonhosted.org/packages/77/46/0f7c865c10cf896ccf5a939c3e84e1cfaeed608ff5249584799a74d33835/ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681", size = 11333801, upload-time = "2026-03-05T20:05:57.168Z" }, + { url = "https://files.pythonhosted.org/packages/d3/01/a10fe54b653061585e655f5286c2662ebddb68831ed3eaebfb0eb08c0a16/ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a", size = 11206821, upload-time = "2026-03-05T20:06:03.441Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0d/2132ceaf20c5e8699aa83da2706ecb5c5dcdf78b453f77edca7fb70f8a93/ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca", size = 11133326, upload-time = "2026-03-05T20:06:25.655Z" }, + { url = "https://files.pythonhosted.org/packages/72/cb/2e5259a7eb2a0f87c08c0fe5bf5825a1e4b90883a52685524596bfc93072/ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd", size = 10510820, upload-time = "2026-03-05T20:06:37.79Z" }, + { url = "https://files.pythonhosted.org/packages/ff/20/b67ce78f9e6c59ffbdb5b4503d0090e749b5f2d31b599b554698a80d861c/ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d", size = 10302395, upload-time = "2026-03-05T20:05:54.504Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e5/719f1acccd31b720d477751558ed74e9c88134adcc377e5e886af89d3072/ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752", size = 10754069, upload-time = "2026-03-05T20:06:06.422Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/d1db14469e32d98f3ca27079dbd30b7b44dbb5317d06ab36718dee3baf03/ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2", size = 11304315, upload-time = "2026-03-05T20:06:10.867Z" }, +] + +[[package]] +name = "safetensors" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/b9/9bd84453ed6dd04688de9b3f3a4146a1698e8faae2ceeccce4e14c67ae17/ruff-0.14.0.tar.gz", hash = "sha256:62ec8969b7510f77945df916de15da55311fade8d6050995ff7f680afe582c57", size = 5452071, upload-time = "2025-10-07T18:21:55.763Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/4e/79d463a5f80654e93fa653ebfb98e0becc3f0e7cf6219c9ddedf1e197072/ruff-0.14.0-py3-none-linux_armv6l.whl", hash = "sha256:58e15bffa7054299becf4bab8a1187062c6f8cafbe9f6e39e0d5aface455d6b3", size = 12494532, upload-time = "2025-10-07T18:21:00.373Z" }, - { url = "https://files.pythonhosted.org/packages/ee/40/e2392f445ed8e02aa6105d49db4bfff01957379064c30f4811c3bf38aece/ruff-0.14.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:838d1b065f4df676b7c9957992f2304e41ead7a50a568185efd404297d5701e8", size = 13160768, upload-time = "2025-10-07T18:21:04.73Z" }, - { url = "https://files.pythonhosted.org/packages/75/da/2a656ea7c6b9bd14c7209918268dd40e1e6cea65f4bb9880eaaa43b055cd/ruff-0.14.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:703799d059ba50f745605b04638fa7e9682cc3da084b2092feee63500ff3d9b8", size = 12363376, upload-time = "2025-10-07T18:21:07.833Z" }, - { url = "https://files.pythonhosted.org/packages/42/e2/1ffef5a1875add82416ff388fcb7ea8b22a53be67a638487937aea81af27/ruff-0.14.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ba9a8925e90f861502f7d974cc60e18ca29c72bb0ee8bfeabb6ade35a3abde7", size = 12608055, upload-time = "2025-10-07T18:21:10.72Z" }, - { url = "https://files.pythonhosted.org/packages/4a/32/986725199d7cee510d9f1dfdf95bf1efc5fa9dd714d0d85c1fb1f6be3bc3/ruff-0.14.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e41f785498bd200ffc276eb9e1570c019c1d907b07cfb081092c8ad51975bbe7", size = 12318544, upload-time = "2025-10-07T18:21:13.741Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ed/4969cefd53315164c94eaf4da7cfba1f267dc275b0abdd593d11c90829a3/ruff-0.14.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30a58c087aef4584c193aebf2700f0fbcfc1e77b89c7385e3139956fa90434e2", size = 14001280, upload-time = "2025-10-07T18:21:16.411Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ad/96c1fc9f8854c37681c9613d825925c7f24ca1acfc62a4eb3896b50bacd2/ruff-0.14.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f8d07350bc7af0a5ce8812b7d5c1a7293cf02476752f23fdfc500d24b79b783c", size = 15027286, upload-time = "2025-10-07T18:21:19.577Z" }, - { url = "https://files.pythonhosted.org/packages/b3/00/1426978f97df4fe331074baf69615f579dc4e7c37bb4c6f57c2aad80c87f/ruff-0.14.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eec3bbbf3a7d5482b5c1f42d5fc972774d71d107d447919fca620b0be3e3b75e", size = 14451506, upload-time = "2025-10-07T18:21:22.779Z" }, - { url = "https://files.pythonhosted.org/packages/58/d5/9c1cea6e493c0cf0647674cca26b579ea9d2a213b74b5c195fbeb9678e15/ruff-0.14.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16b68e183a0e28e5c176d51004aaa40559e8f90065a10a559176713fcf435206", size = 13437384, upload-time = "2025-10-07T18:21:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/29/b4/4cd6a4331e999fc05d9d77729c95503f99eae3ba1160469f2b64866964e3/ruff-0.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb732d17db2e945cfcbbc52af0143eda1da36ca8ae25083dd4f66f1542fdf82e", size = 13447976, upload-time = "2025-10-07T18:21:28.83Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c0/ac42f546d07e4f49f62332576cb845d45c67cf5610d1851254e341d563b6/ruff-0.14.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:c958f66ab884b7873e72df38dcabee03d556a8f2ee1b8538ee1c2bbd619883dd", size = 13682850, upload-time = "2025-10-07T18:21:31.842Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c4/4b0c9bcadd45b4c29fe1af9c5d1dc0ca87b4021665dfbe1c4688d407aa20/ruff-0.14.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7eb0499a2e01f6e0c285afc5bac43ab380cbfc17cd43a2e1dd10ec97d6f2c42d", size = 12449825, upload-time = "2025-10-07T18:21:35.074Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a8/e2e76288e6c16540fa820d148d83e55f15e994d852485f221b9524514730/ruff-0.14.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c63b2d99fafa05efca0ab198fd48fa6030d57e4423df3f18e03aa62518c565f", size = 12272599, upload-time = "2025-10-07T18:21:38.08Z" }, - { url = "https://files.pythonhosted.org/packages/18/14/e2815d8eff847391af632b22422b8207704222ff575dec8d044f9ab779b2/ruff-0.14.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:668fce701b7a222f3f5327f86909db2bbe99c30877c8001ff934c5413812ac02", size = 13193828, upload-time = "2025-10-07T18:21:41.216Z" }, - { url = "https://files.pythonhosted.org/packages/44/c6/61ccc2987cf0aecc588ff8f3212dea64840770e60d78f5606cd7dc34de32/ruff-0.14.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a86bf575e05cb68dcb34e4c7dfe1064d44d3f0c04bbc0491949092192b515296", size = 13628617, upload-time = "2025-10-07T18:21:44.04Z" }, + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, ] [[package]] name = "scikit-learn" -version = "1.7.2" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "joblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, - { name = "scipy", version = "1.16.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "threadpoolctl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221, upload-time = "2025-09-09T08:20:19.328Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834, upload-time = "2025-09-09T08:20:22.073Z" }, - { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938, upload-time = "2025-09-09T08:20:24.327Z" }, - { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818, upload-time = "2025-09-09T08:20:26.845Z" }, - { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, - { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, - { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, - { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, - { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, - { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, - { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, - { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, - { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, - { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, - { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, - { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, - { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", size = 8595835, upload-time = "2025-12-10T07:07:39.385Z" }, + { url = "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", size = 8080381, upload-time = "2025-12-10T07:07:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", size = 8799632, upload-time = "2025-12-10T07:07:43.899Z" }, + { url = "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", size = 9103788, upload-time = "2025-12-10T07:07:45.982Z" }, + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, ] [[package]] name = "scipy" -version = "1.15.3" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", -] -dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, - { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, - { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, - { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, - { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, - { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, - { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, - { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, - { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, - { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, - { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, - { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, - { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, - { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, -] - -[[package]] -name = "scipy" -version = "1.16.2" +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, + { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, + { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, + { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, + { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, + { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, + { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, +] + +[[package]] +name = "sentence-transformers" +version = "5.2.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", -] -dependencies = [ - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4c/3b/546a6f0bfe791bbb7f8d591613454d15097e53f906308ec6f7c1ce588e8e/scipy-1.16.2.tar.gz", hash = "sha256:af029b153d243a80afb6eabe40b0a07f8e35c9adc269c019f364ad747f826a6b", size = 30580599, upload-time = "2025-09-11T17:48:08.271Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/ef/37ed4b213d64b48422df92560af7300e10fe30b5d665dd79932baebee0c6/scipy-1.16.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6ab88ea43a57da1af33292ebd04b417e8e2eaf9d5aa05700be8d6e1b6501cd92", size = 36619956, upload-time = "2025-09-11T17:39:20.5Z" }, - { url = "https://files.pythonhosted.org/packages/85/ab/5c2eba89b9416961a982346a4d6a647d78c91ec96ab94ed522b3b6baf444/scipy-1.16.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c95e96c7305c96ede73a7389f46ccd6c659c4da5ef1b2789466baeaed3622b6e", size = 28931117, upload-time = "2025-09-11T17:39:29.06Z" }, - { url = "https://files.pythonhosted.org/packages/80/d1/eed51ab64d227fe60229a2d57fb60ca5898cfa50ba27d4f573e9e5f0b430/scipy-1.16.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:87eb178db04ece7c698220d523c170125dbffebb7af0345e66c3554f6f60c173", size = 20921997, upload-time = "2025-09-11T17:39:34.892Z" }, - { url = "https://files.pythonhosted.org/packages/be/7c/33ea3e23bbadde96726edba6bf9111fb1969d14d9d477ffa202c67bec9da/scipy-1.16.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:4e409eac067dcee96a57fbcf424c13f428037827ec7ee3cb671ff525ca4fc34d", size = 23523374, upload-time = "2025-09-11T17:39:40.846Z" }, - { url = "https://files.pythonhosted.org/packages/96/0b/7399dc96e1e3f9a05e258c98d716196a34f528eef2ec55aad651ed136d03/scipy-1.16.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e574be127bb760f0dad24ff6e217c80213d153058372362ccb9555a10fc5e8d2", size = 33583702, upload-time = "2025-09-11T17:39:49.011Z" }, - { url = "https://files.pythonhosted.org/packages/1a/bc/a5c75095089b96ea72c1bd37a4497c24b581ec73db4ef58ebee142ad2d14/scipy-1.16.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f5db5ba6188d698ba7abab982ad6973265b74bb40a1efe1821b58c87f73892b9", size = 35883427, upload-time = "2025-09-11T17:39:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/ab/66/e25705ca3d2b87b97fe0a278a24b7f477b4023a926847935a1a71488a6a6/scipy-1.16.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec6e74c4e884104ae006d34110677bfe0098203a3fec2f3faf349f4cb05165e3", size = 36212940, upload-time = "2025-09-11T17:40:06.013Z" }, - { url = "https://files.pythonhosted.org/packages/d6/fd/0bb911585e12f3abdd603d721d83fc1c7492835e1401a0e6d498d7822b4b/scipy-1.16.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:912f46667d2d3834bc3d57361f854226475f695eb08c08a904aadb1c936b6a88", size = 38865092, upload-time = "2025-09-11T17:40:15.143Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8d/6396e00db1282279a4ddd507c5f5e11f606812b608ee58517ce8abbf883f/scipy-1.16.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:89d6c100fa5c48472047632e06f0876b3c4931aac1f4291afc81a3644316bb0d", size = 36646259, upload-time = "2025-09-11T17:40:39.329Z" }, - { url = "https://files.pythonhosted.org/packages/3b/93/ea9edd7e193fceb8eef149804491890bde73fb169c896b61aa3e2d1e4e77/scipy-1.16.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ca748936cd579d3f01928b30a17dc474550b01272d8046e3e1ee593f23620371", size = 28888976, upload-time = "2025-09-11T17:40:46.82Z" }, - { url = "https://files.pythonhosted.org/packages/91/4d/281fddc3d80fd738ba86fd3aed9202331180b01e2c78eaae0642f22f7e83/scipy-1.16.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fac4f8ce2ddb40e2e3d0f7ec36d2a1e7f92559a2471e59aec37bd8d9de01fec0", size = 20879905, upload-time = "2025-09-11T17:40:52.545Z" }, - { url = "https://files.pythonhosted.org/packages/69/40/b33b74c84606fd301b2915f0062e45733c6ff5708d121dd0deaa8871e2d0/scipy-1.16.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:033570f1dcefd79547a88e18bccacff025c8c647a330381064f561d43b821232", size = 23553066, upload-time = "2025-09-11T17:40:59.014Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/22c739e2f21a42cc8f16bc76b47cff4ed54fbe0962832c589591c2abec34/scipy-1.16.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ea3421209bf00c8a5ef2227de496601087d8f638a2363ee09af059bd70976dc1", size = 33336407, upload-time = "2025-09-11T17:41:06.796Z" }, - { url = "https://files.pythonhosted.org/packages/53/11/a0160990b82999b45874dc60c0c183d3a3a969a563fffc476d5a9995c407/scipy-1.16.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f66bd07ba6f84cd4a380b41d1bf3c59ea488b590a2ff96744845163309ee8e2f", size = 35673281, upload-time = "2025-09-11T17:41:15.055Z" }, - { url = "https://files.pythonhosted.org/packages/96/53/7ef48a4cfcf243c3d0f1643f5887c81f29fdf76911c4e49331828e19fc0a/scipy-1.16.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e9feab931bd2aea4a23388c962df6468af3d808ddf2d40f94a81c5dc38f32ef", size = 36004222, upload-time = "2025-09-11T17:41:23.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7f/71a69e0afd460049d41c65c630c919c537815277dfea214031005f474d78/scipy-1.16.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03dfc75e52f72cf23ec2ced468645321407faad8f0fe7b1f5b49264adbc29cb1", size = 38664586, upload-time = "2025-09-11T17:41:31.021Z" }, - { url = "https://files.pythonhosted.org/packages/c1/27/c5b52f1ee81727a9fc457f5ac1e9bf3d6eab311805ea615c83c27ba06400/scipy-1.16.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:84f7bf944b43e20b8a894f5fe593976926744f6c185bacfcbdfbb62736b5cc70", size = 36604856, upload-time = "2025-09-11T17:41:47.695Z" }, - { url = "https://files.pythonhosted.org/packages/32/a9/15c20d08e950b540184caa8ced675ba1128accb0e09c653780ba023a4110/scipy-1.16.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5c39026d12edc826a1ef2ad35ad1e6d7f087f934bb868fc43fa3049c8b8508f9", size = 28864626, upload-time = "2025-09-11T17:41:52.642Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fc/ea36098df653cca26062a627c1a94b0de659e97127c8491e18713ca0e3b9/scipy-1.16.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e52729ffd45b68777c5319560014d6fd251294200625d9d70fd8626516fc49f5", size = 20855689, upload-time = "2025-09-11T17:41:57.886Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/d0b53be55727f3e6d7c72687ec18ea6d0047cf95f1f77488b99a2bafaee1/scipy-1.16.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:024dd4a118cccec09ca3209b7e8e614931a6ffb804b2a601839499cb88bdf925", size = 23512151, upload-time = "2025-09-11T17:42:02.303Z" }, - { url = "https://files.pythonhosted.org/packages/11/85/bf7dab56e5c4b1d3d8eef92ca8ede788418ad38a7dc3ff50262f00808760/scipy-1.16.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a5dc7ee9c33019973a470556081b0fd3c9f4c44019191039f9769183141a4d9", size = 33329824, upload-time = "2025-09-11T17:42:07.549Z" }, - { url = "https://files.pythonhosted.org/packages/da/6a/1a927b14ddc7714111ea51f4e568203b2bb6ed59bdd036d62127c1a360c8/scipy-1.16.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c2275ff105e508942f99d4e3bc56b6ef5e4b3c0af970386ca56b777608ce95b7", size = 35681881, upload-time = "2025-09-11T17:42:13.255Z" }, - { url = "https://files.pythonhosted.org/packages/c1/5f/331148ea5780b4fcc7007a4a6a6ee0a0c1507a796365cc642d4d226e1c3a/scipy-1.16.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:af80196eaa84f033e48444d2e0786ec47d328ba00c71e4299b602235ffef9acb", size = 36006219, upload-time = "2025-09-11T17:42:18.765Z" }, - { url = "https://files.pythonhosted.org/packages/46/3a/e991aa9d2aec723b4a8dcfbfc8365edec5d5e5f9f133888067f1cbb7dfc1/scipy-1.16.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9fb1eb735fe3d6ed1f89918224e3385fbf6f9e23757cacc35f9c78d3b712dd6e", size = 38682147, upload-time = "2025-09-11T17:42:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/09/d9/60679189bcebda55992d1a45498de6d080dcaf21ce0c8f24f888117e0c2d/scipy-1.16.2-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:53d8d2ee29b925344c13bda64ab51785f016b1b9617849dac10897f0701b20c1", size = 37012682, upload-time = "2025-09-11T17:42:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/83/be/a99d13ee4d3b7887a96f8c71361b9659ba4ef34da0338f14891e102a127f/scipy-1.16.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:9e05e33657efb4c6a9d23bd8300101536abd99c85cca82da0bffff8d8764d08a", size = 29389926, upload-time = "2025-09-11T17:42:35.845Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0a/130164a4881cec6ca8c00faf3b57926f28ed429cd6001a673f83c7c2a579/scipy-1.16.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:7fe65b36036357003b3ef9d37547abeefaa353b237e989c21027b8ed62b12d4f", size = 21381152, upload-time = "2025-09-11T17:42:40.07Z" }, - { url = "https://files.pythonhosted.org/packages/47/a6/503ffb0310ae77fba874e10cddfc4a1280bdcca1d13c3751b8c3c2996cf8/scipy-1.16.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6406d2ac6d40b861cccf57f49592f9779071655e9f75cd4f977fa0bdd09cb2e4", size = 23914410, upload-time = "2025-09-11T17:42:44.313Z" }, - { url = "https://files.pythonhosted.org/packages/fa/c7/1147774bcea50d00c02600aadaa919facbd8537997a62496270133536ed6/scipy-1.16.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff4dc42bd321991fbf611c23fc35912d690f731c9914bf3af8f417e64aca0f21", size = 33481880, upload-time = "2025-09-11T17:42:49.325Z" }, - { url = "https://files.pythonhosted.org/packages/6a/74/99d5415e4c3e46b2586f30cdbecb95e101c7192628a484a40dd0d163811a/scipy-1.16.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:654324826654d4d9133e10675325708fb954bc84dae6e9ad0a52e75c6b1a01d7", size = 35791425, upload-time = "2025-09-11T17:42:54.711Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ee/a6559de7c1cc710e938c0355d9d4fbcd732dac4d0d131959d1f3b63eb29c/scipy-1.16.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63870a84cd15c44e65220eaed2dac0e8f8b26bbb991456a033c1d9abfe8a94f8", size = 36178622, upload-time = "2025-09-11T17:43:00.375Z" }, - { url = "https://files.pythonhosted.org/packages/4e/7b/f127a5795d5ba8ece4e0dce7d4a9fb7cb9e4f4757137757d7a69ab7d4f1a/scipy-1.16.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fa01f0f6a3050fa6a9771a95d5faccc8e2f5a92b4a2e5440a0fa7264a2398472", size = 38783985, upload-time = "2025-09-11T17:43:06.661Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ac/ad8951250516db71619f0bd3b2eb2448db04b720a003dd98619b78b692c0/scipy-1.16.2-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:567e77755019bb7461513c87f02bb73fb65b11f049aaaa8ca17cfaa5a5c45d77", size = 36595109, upload-time = "2025-09-11T17:43:35.713Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f6/5779049ed119c5b503b0f3dc6d6f3f68eefc3a9190d4ad4c276f854f051b/scipy-1.16.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:17d9bb346194e8967296621208fcdfd39b55498ef7d2f376884d5ac47cec1a70", size = 28859110, upload-time = "2025-09-11T17:43:40.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/09/9986e410ae38bf0a0c737ff8189ac81a93b8e42349aac009891c054403d7/scipy-1.16.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:0a17541827a9b78b777d33b623a6dcfe2ef4a25806204d08ead0768f4e529a88", size = 20850110, upload-time = "2025-09-11T17:43:44.981Z" }, - { url = "https://files.pythonhosted.org/packages/0d/ad/485cdef2d9215e2a7df6d61b81d2ac073dfacf6ae24b9ae87274c4e936ae/scipy-1.16.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:d7d4c6ba016ffc0f9568d012f5f1eb77ddd99412aea121e6fa8b4c3b7cbad91f", size = 23497014, upload-time = "2025-09-11T17:43:49.074Z" }, - { url = "https://files.pythonhosted.org/packages/a7/74/f6a852e5d581122b8f0f831f1d1e32fb8987776ed3658e95c377d308ed86/scipy-1.16.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9702c4c023227785c779cba2e1d6f7635dbb5b2e0936cdd3a4ecb98d78fd41eb", size = 33401155, upload-time = "2025-09-11T17:43:54.661Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f5/61d243bbc7c6e5e4e13dde9887e84a5cbe9e0f75fd09843044af1590844e/scipy-1.16.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d1cdf0ac28948d225decdefcc45ad7dd91716c29ab56ef32f8e0d50657dffcc7", size = 35691174, upload-time = "2025-09-11T17:44:00.101Z" }, - { url = "https://files.pythonhosted.org/packages/03/99/59933956331f8cc57e406cdb7a483906c74706b156998f322913e789c7e1/scipy-1.16.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:70327d6aa572a17c2941cdfb20673f82e536e91850a2e4cb0c5b858b690e1548", size = 36070752, upload-time = "2025-09-11T17:44:05.619Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7d/00f825cfb47ee19ef74ecf01244b43e95eae74e7e0ff796026ea7cd98456/scipy-1.16.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5221c0b2a4b58aa7c4ed0387d360fd90ee9086d383bb34d9f2789fafddc8a936", size = 38701010, upload-time = "2025-09-11T17:44:11.322Z" }, - { url = "https://files.pythonhosted.org/packages/51/b9/60929ce350c16b221928725d2d1d7f86cf96b8bc07415547057d1196dc92/scipy-1.16.2-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:9ea2a3fed83065d77367775d689401a703d0f697420719ee10c0780bcab594d8", size = 37013193, upload-time = "2025-09-11T17:44:16.757Z" }, - { url = "https://files.pythonhosted.org/packages/2a/41/ed80e67782d4bc5fc85a966bc356c601afddd175856ba7c7bb6d9490607e/scipy-1.16.2-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7280d926f11ca945c3ef92ba960fa924e1465f8d07ce3a9923080363390624c4", size = 29390172, upload-time = "2025-09-11T17:44:21.783Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a3/2f673ace4090452696ccded5f5f8efffb353b8f3628f823a110e0170b605/scipy-1.16.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:8afae1756f6a1fe04636407ef7dbece33d826a5d462b74f3d0eb82deabefd831", size = 21381326, upload-time = "2025-09-11T17:44:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/42/bf/59df61c5d51395066c35836b78136accf506197617c8662e60ea209881e1/scipy-1.16.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:5c66511f29aa8d233388e7416a3f20d5cae7a2744d5cee2ecd38c081f4e861b3", size = 23915036, upload-time = "2025-09-11T17:44:30.527Z" }, - { url = "https://files.pythonhosted.org/packages/91/c3/edc7b300dc16847ad3672f1a6f3f7c5d13522b21b84b81c265f4f2760d4a/scipy-1.16.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efe6305aeaa0e96b0ccca5ff647a43737d9a092064a3894e46c414db84bc54ac", size = 33484341, upload-time = "2025-09-11T17:44:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/c7/24d1524e72f06ff141e8d04b833c20db3021020563272ccb1b83860082a9/scipy-1.16.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f3a337d9ae06a1e8d655ee9d8ecb835ea5ddcdcbd8d23012afa055ab014f374", size = 35790840, upload-time = "2025-09-11T17:44:41.76Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b7/5aaad984eeedd56858dc33d75efa59e8ce798d918e1033ef62d2708f2c3d/scipy-1.16.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bab3605795d269067d8ce78a910220262711b753de8913d3deeaedb5dded3bb6", size = 36174716, upload-time = "2025-09-11T17:44:47.316Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c2/e276a237acb09824822b0ada11b028ed4067fdc367a946730979feacb870/scipy-1.16.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b0348d8ddb55be2a844c518cd8cc8deeeb8aeba707cf834db5758fc89b476a2c", size = 38790088, upload-time = "2025-09-11T17:44:53.011Z" }, -] - -[[package]] -name = "selectolax" -version = "0.3.29" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/b9/b5a23e29d5e54c590eaad18bdbb1ced13b869b111e03d12ee0ae9eecf9b8/selectolax-0.3.29.tar.gz", hash = "sha256:28696fa4581765c705e15d05dfba464334f5f9bcb3eac9f25045f815aec6fbc1", size = 4691626, upload-time = "2025-04-30T15:17:37.98Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/8f/bf3d58ecc0e187806299324e2ad77646e837ff20400880f6fc0cbd14fb66/selectolax-0.3.29-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85aeae54f055cf5451828a21fbfecac99b8b5c27ec29fd10725b631593a7c9a3", size = 3643657, upload-time = "2025-04-30T15:15:40.734Z" }, - { url = "https://files.pythonhosted.org/packages/de/b0/6d90a4d0eacb8253d88a9fcbcb8758b667900f45dcdb4a11c5fbd0d31599/selectolax-0.3.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ff48efe4364c8148a553a4105773a0accee9cc25e0f2a40ddac44d18a5a3000", size = 2089380, upload-time = "2025-04-30T15:15:42.928Z" }, - { url = "https://files.pythonhosted.org/packages/f4/21/394b51998ef99f13f98da063fc71b8edf7191bb30aca06bcbc8a55d5a9ad/selectolax-0.3.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25cfccfefc41361ab8a07f15a224524a4a8b77dfa7d253b34bbd397e45856734", size = 5505065, upload-time = "2025-04-30T15:15:44.986Z" }, - { url = "https://files.pythonhosted.org/packages/dd/57/e38775b672f910e80742cbf7c3def5c670c1b6f9b05e8587b2fa8dc044c3/selectolax-0.3.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5c3523ad5199a4fb9b95b6e24ff9222d3605023ca394b23f7dd910e7536daf", size = 5529205, upload-time = "2025-04-30T15:15:47.149Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0f/f6e3030107b486b6a4870f8471a675d435c4c34b8f9de3374652ed53004b/selectolax-0.3.29-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfb803d6bbe0ef3c8847cf5a01167cc428c0d9179946e1c994cc6178b5332d1a", size = 5146713, upload-time = "2025-04-30T15:15:49.332Z" }, - { url = "https://files.pythonhosted.org/packages/d8/8d/b4fd119c216e8615ca6747f8f336643572178241921f33f5ffa4b074dc44/selectolax-0.3.29-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:db734ba4ef44fa3b57ad9374fd7ccfc7815c0ae5cfcbd5ee25fe8587092618d1", size = 5416352, upload-time = "2025-04-30T15:15:50.909Z" }, - { url = "https://files.pythonhosted.org/packages/d7/e7/94e694d14ae44bddc0d9b144647d5adbec0210d8e2c57d72ad9a133d9469/selectolax-0.3.29-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2bfe4327215a20af4197c5b7e3729a9552fb324bb57250dc7e7abfa0f848a463", size = 5140689, upload-time = "2025-04-30T15:15:52.477Z" }, - { url = "https://files.pythonhosted.org/packages/90/62/79ba965daa1f12e5477b2ec08b289f8289dfc705928b08923d9c4b60c867/selectolax-0.3.29-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a98c3f3d8fffb175456cb06096bc78103ddf6a209bea6392e0e4ea4e25aca71", size = 5481428, upload-time = "2025-04-30T15:15:54.371Z" }, - { url = "https://files.pythonhosted.org/packages/2a/5d/ca72f7adddae4b2b128394a7559739a6a12c156d29b55968cfcfe07fac4d/selectolax-0.3.29-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6a1cd0518fa7656ea1683c4b2d3b5a98306753f364da9f673517847e1680a3e", size = 3649215, upload-time = "2025-04-30T15:15:59.57Z" }, - { url = "https://files.pythonhosted.org/packages/08/c6/ca984f90b12fb10790cc56c2670f1b5f09884ed2f2012a219094b38cbcb4/selectolax-0.3.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e5354d805dd76b4b38002f58e6ae2e7b429ac311bf3601992a6662d2bc86911", size = 2091848, upload-time = "2025-04-30T15:16:01.73Z" }, - { url = "https://files.pythonhosted.org/packages/98/7f/c999ae6d9bfbaac3e8dea3dbb5ca6bdf61c220828e80a6c339e89f9db777/selectolax-0.3.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7073e3bcdc60ebdb5f8777c79b465471ec000ab556134da4e00f037d3321a2ec", size = 5638593, upload-time = "2025-04-30T15:16:03.594Z" }, - { url = "https://files.pythonhosted.org/packages/d6/32/ffd89376a888c24ecaf01fcffc5fe97b82ae03ab163158f51a559f1ebad5/selectolax-0.3.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47587db7cef411d22f8224cf2926aacdb326c4c838d386035229f16ccc2d8d26", size = 5668207, upload-time = "2025-04-30T15:16:05.564Z" }, - { url = "https://files.pythonhosted.org/packages/3a/5c/2de0c7b8be75ad52d44706c67946181b972f27641ab4f6a1f27f46d2a603/selectolax-0.3.29-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21de62b5093b1cb6c5d4cab0bef5f708b9ee1483b640d42be9d955becfcd287a", size = 5276654, upload-time = "2025-04-30T15:16:07.143Z" }, - { url = "https://files.pythonhosted.org/packages/29/29/152bb745b24072d3eecd3b395c756e74763111b9bbd265604f5b96b9a1aa/selectolax-0.3.29-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:af5cd03298cd75cb0fbf712d6ae4f8aca9c13a226d2821ca82f51cc9b33b032f", size = 5543731, upload-time = "2025-04-30T15:16:09.733Z" }, - { url = "https://files.pythonhosted.org/packages/04/1d/df65baaf16ece393f9f1a7c55f015510634adbb163ce72adcafaddf5cf9c/selectolax-0.3.29-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3f58dca53d2d3dc18dfd2cb9210a5625f32598db24e3f857f5be58f21a8f3b88", size = 5275005, upload-time = "2025-04-30T15:16:11.958Z" }, - { url = "https://files.pythonhosted.org/packages/5d/74/e56fd6f9b3087947b812f3862df3265bf5e21396d9673d076e999b1086cf/selectolax-0.3.29-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a6d8e02c6b9ba951d7b5a5dd2788a1d4bbdedc89782a4de165f1a87c4168ac", size = 5617441, upload-time = "2025-04-30T15:16:14.15Z" }, - { url = "https://files.pythonhosted.org/packages/30/ac/ca4332eecc19124782f6f0d7cb28c331da2e9d9cf25287ba2b3b6a00cea1/selectolax-0.3.29-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6d3f373efd1db18ac9b2222de2668aaa366a1f0b560241eab128f3ca68e8add1", size = 3656166, upload-time = "2025-04-30T15:16:19.907Z" }, - { url = "https://files.pythonhosted.org/packages/b8/46/2dcae03a94f80f3e0d339c149de8110b5abe1230668b015fd338d9e71a27/selectolax-0.3.29-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:97b9971bb37b54ef4440134f22792d15c9ee12d890a526a7fe0b376502240143", size = 2095991, upload-time = "2025-04-30T15:16:21.654Z" }, - { url = "https://files.pythonhosted.org/packages/1e/bd/95f15396e5f30898227d84a7ec6a39d9a9b34005f0e9f8f38e7fee21ab66/selectolax-0.3.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd99ff0f5a6c017c471635d4ee45b61d25f24689331e407147b2cf5e36892480", size = 5844493, upload-time = "2025-04-30T15:16:23.268Z" }, - { url = "https://files.pythonhosted.org/packages/36/25/64c60da9aec81f2992355b0a3ce00ea1ed99e6f5499868016d6972bd4948/selectolax-0.3.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8377c317bf1d5fd6ccc56dfb5a0928bbcbea3e800b7af54761cfbbb99dc94cb9", size = 5881062, upload-time = "2025-04-30T15:16:24.891Z" }, - { url = "https://files.pythonhosted.org/packages/b6/81/94105217f91f7c6a98ac3164210cba0c6aa8da91cb85405292a6d70e39c3/selectolax-0.3.29-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5388c56456272b2c241fc1906db9cc993984cafdad936cb5e061e3af0c44144e", size = 5470368, upload-time = "2025-04-30T15:16:26.457Z" }, - { url = "https://files.pythonhosted.org/packages/51/6e/40bc259f13e5d3dd0bb8ddd1d55ef099244db2568ffb82fd9d489984d61a/selectolax-0.3.29-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9e4690894f406863e25ba49da27e1a6fda9bfc21b0b315c399d3093be080e81", size = 5693476, upload-time = "2025-04-30T15:16:28.386Z" }, - { url = "https://files.pythonhosted.org/packages/58/bd/2668ee1d5471ad88daf83ca484515ba46774fc9c951d6c4c0beffea89952/selectolax-0.3.29-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:deeab93386b6c9a75052515f5b9e7e3dd623c585871c0c2b3126970ff902603b", size = 5449747, upload-time = "2025-04-30T15:16:30.626Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b5/1c61839ae5af70a8291c643982a99f051b543df90b220b98db1b26bd4899/selectolax-0.3.29-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6abdd8357f1c105c1add01a9f0373511fa832548b2e2778b00a8ba2a4508d6ed", size = 5786843, upload-time = "2025-04-30T15:16:32.231Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a7/083a00aa9cb6bef0317baba4269841c366652558d77189275bed2da6aa81/selectolax-0.3.29-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e3112f05a34bf36d36ecc51520b1d98c4667b54a3f123dffef5072273e89a360", size = 3651407, upload-time = "2025-04-30T15:16:37.282Z" }, - { url = "https://files.pythonhosted.org/packages/7e/cd/6c89ac27961ef5f5e9b40eda0d0653b9c95c93485fb8a554bf093eac1c77/selectolax-0.3.29-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:38462ae369897f71da287f1282079c11f1b878b99a4d1d509d1116ce05226d88", size = 2092649, upload-time = "2025-04-30T15:16:38.817Z" }, - { url = "https://files.pythonhosted.org/packages/3e/12/82710124b7b52613fdb9d5c14494a41785eb83e1c93ec7e1d1814c2ce292/selectolax-0.3.29-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdd1e63735f2fb8485fb6b9f4fe30d6c030930f438f46a4a62bd9886ab3c7fd9", size = 5821738, upload-time = "2025-04-30T15:16:40.747Z" }, - { url = "https://files.pythonhosted.org/packages/8b/08/8ceb3eb7fee9743026a4481fccb771f257c82b2c853a1a30271902234eab/selectolax-0.3.29-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea52e0c128e8e89f98ab0ccaabbc853677de5730729a3351da595976131b66e0", size = 5856069, upload-time = "2025-04-30T15:16:42.496Z" }, - { url = "https://files.pythonhosted.org/packages/47/6c/ec2b7aff0f6202e4157415d76bd588108cc518374bf53afa81c122691780/selectolax-0.3.29-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0933659b4250b91317ccd78167e6804389cdaf7ed86c5d034b058a550d23110f", size = 5443255, upload-time = "2025-04-30T15:16:44.083Z" }, - { url = "https://files.pythonhosted.org/packages/cd/90/d5fea46ff191d02c2380a779b119ea6799751b79fcddb2bb230b21b38fc5/selectolax-0.3.29-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0c9005e9089a6b0c6fb6a9f691ddbbb10a3a23ebeff54393980340f3dbcdb99", size = 5637529, upload-time = "2025-04-30T15:16:46.175Z" }, - { url = "https://files.pythonhosted.org/packages/9d/83/7f876a515f5af31f7b948cf10951be896fe6deeff2b9b713640c8ec82fd3/selectolax-0.3.29-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac940963c52f13cdf5d7266a979744949b660d367ce669efa073b557f6e09a18", size = 5379121, upload-time = "2025-04-30T15:16:47.909Z" }, - { url = "https://files.pythonhosted.org/packages/57/cb/7dc739a484b1a17ccf92a23dfe558ae615c232bd81e78a72049c25d1ff66/selectolax-0.3.29-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:484274f73839f9a143f4c13ce1b0a0123b5d64be22f967a1dc202a9a78687d67", size = 5727944, upload-time = "2025-04-30T15:16:49.52Z" }, +dependencies = [ + { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scikit-learn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "torch", version = "2.10.0", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'darwin'" }, + { name = "torch", version = "2.10.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "transformers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/30/21664028fc0776eb1ca024879480bbbab36f02923a8ff9e4cae5a150fa35/sentence_transformers-5.2.3.tar.gz", hash = "sha256:3cd3044e1f3fe859b6a1b66336aac502eaae5d3dd7d5c8fc237f37fbf58137c7", size = 381623, upload-time = "2026-02-17T14:05:20.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/9f/dba4b3e18ebbe1eaa29d9f1764fbc7da0cd91937b83f2b7928d15c5d2d36/sentence_transformers-5.2.3-py3-none-any.whl", hash = "sha256:6437c62d4112b615ddebda362dfc16a4308d604c5b68125ed586e3e95d5b2e30", size = 494225, upload-time = "2026-02-17T14:05:18.596Z" }, ] [[package]] @@ -3765,14 +4509,6 @@ version = "1.3.7" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8d/48/49393a96a2eef1ab418b17475fb92b8fcfad83d099e678751b05472e69de/setproctitle-1.3.7.tar.gz", hash = "sha256:bc2bc917691c1537d5b9bca1468437176809c7e11e5694ca79a9ca12345dcb9e", size = 27002, upload-time = "2025-09-05T12:51:25.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/48/fb401ec8c4953d519d05c87feca816ad668b8258448ff60579ac7a1c1386/setproctitle-1.3.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf555b6299f10a6eb44e4f96d2f5a3884c70ce25dc5c8796aaa2f7b40e72cb1b", size = 18079, upload-time = "2025-09-05T12:49:07.732Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a3/c2b0333c2716fb3b4c9a973dd113366ac51b4f8d56b500f4f8f704b4817a/setproctitle-1.3.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:690b4776f9c15aaf1023bb07d7c5b797681a17af98a4a69e76a1d504e41108b7", size = 13099, upload-time = "2025-09-05T12:49:09.222Z" }, - { url = "https://files.pythonhosted.org/packages/0e/f8/17bda581c517678260e6541b600eeb67745f53596dc077174141ba2f6702/setproctitle-1.3.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:00afa6fc507967d8c9d592a887cdc6c1f5742ceac6a4354d111ca0214847732c", size = 31793, upload-time = "2025-09-05T12:49:10.297Z" }, - { url = "https://files.pythonhosted.org/packages/27/d1/76a33ae80d4e788ecab9eb9b53db03e81cfc95367ec7e3fbf4989962fedd/setproctitle-1.3.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e02667f6b9fc1238ba753c0f4b0a37ae184ce8f3bbbc38e115d99646b3f4cd3", size = 32779, upload-time = "2025-09-05T12:49:12.157Z" }, - { url = "https://files.pythonhosted.org/packages/59/27/1a07c38121967061564f5e0884414a5ab11a783260450172d4fc68c15621/setproctitle-1.3.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83fcd271567d133eb9532d3b067c8a75be175b2b3b271e2812921a05303a693f", size = 34578, upload-time = "2025-09-05T12:49:13.393Z" }, - { url = "https://files.pythonhosted.org/packages/d8/d4/725e6353935962d8bb12cbf7e7abba1d0d738c7f6935f90239d8e1ccf913/setproctitle-1.3.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13fe37951dda1a45c35d77d06e3da5d90e4f875c4918a7312b3b4556cfa7ff64", size = 32030, upload-time = "2025-09-05T12:49:15.362Z" }, - { url = "https://files.pythonhosted.org/packages/67/24/e4677ae8e1cb0d549ab558b12db10c175a889be0974c589c428fece5433e/setproctitle-1.3.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a05509cfb2059e5d2ddff701d38e474169e9ce2a298cf1b6fd5f3a213a553fe5", size = 33363, upload-time = "2025-09-05T12:49:16.829Z" }, - { url = "https://files.pythonhosted.org/packages/55/d4/69ce66e4373a48fdbb37489f3ded476bb393e27f514968c3a69a67343ae0/setproctitle-1.3.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6da835e76ae18574859224a75db6e15c4c2aaa66d300a57efeaa4c97ca4c7381", size = 31508, upload-time = "2025-09-05T12:49:18.032Z" }, { url = "https://files.pythonhosted.org/packages/04/cd/1b7ba5cad635510720ce19d7122154df96a2387d2a74217be552887c93e5/setproctitle-1.3.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a600eeb4145fb0ee6c287cb82a2884bd4ec5bbb076921e287039dcc7b7cc6dd0", size = 18085, upload-time = "2025-09-05T12:49:22.183Z" }, { url = "https://files.pythonhosted.org/packages/8f/1a/b2da0a620490aae355f9d72072ac13e901a9fec809a6a24fc6493a8f3c35/setproctitle-1.3.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97a090fed480471bb175689859532709e28c085087e344bca45cf318034f70c4", size = 13097, upload-time = "2025-09-05T12:49:23.322Z" }, { url = "https://files.pythonhosted.org/packages/18/2e/bd03ff02432a181c1787f6fc2a678f53b7dacdd5ded69c318fe1619556e8/setproctitle-1.3.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1607b963e7b53e24ec8a2cb4e0ab3ae591d7c6bf0a160feef0551da63452b37f", size = 32191, upload-time = "2025-09-05T12:49:24.567Z" }, @@ -3821,19 +4557,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/92/927b7d4744aac214d149c892cb5fa6dc6f49cfa040cb2b0a844acd63dcaf/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:96c38cdeef9036eb2724c2210e8d0b93224e709af68c435d46a4733a3675fee1", size = 34201, upload-time = "2025-09-05T12:50:36.697Z" }, { url = "https://files.pythonhosted.org/packages/0a/0c/fd4901db5ba4b9d9013e62f61d9c18d52290497f956745cd3e91b0d80f90/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:45e3ef48350abb49cf937d0a8ba15e42cee1e5ae13ca41a77c66d1abc27a5070", size = 35801, upload-time = "2025-09-05T12:50:38.314Z" }, { url = "https://files.pythonhosted.org/packages/e7/e3/54b496ac724e60e61cc3447f02690105901ca6d90da0377dffe49ff99fc7/setproctitle-1.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1fae595d032b30dab4d659bece20debd202229fce12b55abab978b7f30783d73", size = 33958, upload-time = "2025-09-05T12:50:39.841Z" }, - { url = "https://files.pythonhosted.org/packages/34/8a/aff5506ce89bc3168cb492b18ba45573158d528184e8a9759a05a09088a9/setproctitle-1.3.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:eb440c5644a448e6203935ed60466ec8d0df7278cd22dc6cf782d07911bcbea6", size = 12654, upload-time = "2025-09-05T12:51:17.141Z" }, - { url = "https://files.pythonhosted.org/packages/41/89/5b6f2faedd6ced3d3c085a5efbd91380fb1f61f4c12bc42acad37932f4e9/setproctitle-1.3.7-pp310-pypy310_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:502b902a0e4c69031b87870ff4986c290ebbb12d6038a70639f09c331b18efb2", size = 14284, upload-time = "2025-09-05T12:51:18.393Z" }, { url = "https://files.pythonhosted.org/packages/c3/5b/5e1c117ac84e3cefcf8d7a7f6b2461795a87e20869da065a5c087149060b/setproctitle-1.3.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b1cac6a4b0252b8811d60b6d8d0f157c0fdfed379ac89c25a914e6346cf355a1", size = 12587, upload-time = "2025-09-05T12:51:21.195Z" }, { url = "https://files.pythonhosted.org/packages/73/02/b9eadc226195dcfa90eed37afe56b5dd6fa2f0e5220ab8b7867b8862b926/setproctitle-1.3.7-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f1704c9e041f2b1dc38f5be4552e141e1432fba3dd52c72eeffd5bc2db04dc65", size = 14286, upload-time = "2025-09-05T12:51:22.61Z" }, ] [[package]] name = "setuptools" -version = "80.9.0" +version = "80.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] @@ -3854,22 +4597,89 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sqlalchemy" +version = "2.0.46" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(platform_machine == 'AMD64' and sys_platform == 'darwin') or (platform_machine == 'WIN32' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'amd64' and sys_platform == 'darwin') or (platform_machine == 'ppc64le' and sys_platform == 'darwin') or (platform_machine == 'win32' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'AMD64' and sys_platform == 'linux') or (platform_machine == 'WIN32' and sys_platform == 'linux') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'amd64' and sys_platform == 'linux') or (platform_machine == 'ppc64le' and sys_platform == 'linux') or (platform_machine == 'win32' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/aa/9ce0f3e7a9829ead5c8ce549392f33a12c4555a6c0609bb27d882e9c7ddf/sqlalchemy-2.0.46.tar.gz", hash = "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7", size = 9865393, upload-time = "2026-01-21T18:03:45.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/ac/b42ad16800d0885105b59380ad69aad0cce5a65276e269ce2729a2343b6a/sqlalchemy-2.0.46-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684", size = 2154851, upload-time = "2026-01-21T18:27:30.54Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/d8710068cb79f64d002ebed62a7263c00c8fd95f4ebd4b5be8f7ca93f2bc/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62", size = 3311241, upload-time = "2026-01-21T18:32:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/20c71487c7219ab3aa7421c7c62d93824c97c1460f2e8bb72404b0192d13/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f", size = 3310741, upload-time = "2026-01-21T18:44:57.887Z" }, + { url = "https://files.pythonhosted.org/packages/65/80/d26d00b3b249ae000eee4db206fcfc564bf6ca5030e4747adf451f4b5108/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01", size = 3263116, upload-time = "2026-01-21T18:32:35.044Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/74dda7506640923821340541e8e45bd3edd8df78664f1f2e0aae8077192b/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999", size = 3285327, upload-time = "2026-01-21T18:44:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/b6/35/d16bfa235c8b7caba3730bba43e20b1e376d2224f407c178fbf59559f23e/sqlalchemy-2.0.46-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c", size = 2153405, upload-time = "2026-01-21T19:05:54.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/6c/3192e24486749862f495ddc6584ed730c0c994a67550ec395d872a2ad650/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9", size = 3334702, upload-time = "2026-01-21T18:46:45.384Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a2/b9f33c8d68a3747d972a0bb758c6b63691f8fb8a49014bc3379ba15d4274/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b", size = 3347664, upload-time = "2026-01-21T18:40:09.979Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d2/3e59e2a91eaec9db7e8dc6b37b91489b5caeb054f670f32c95bcba98940f/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53", size = 3277372, upload-time = "2026-01-21T18:46:47.168Z" }, + { url = "https://files.pythonhosted.org/packages/dd/dd/67bc2e368b524e2192c3927b423798deda72c003e73a1e94c21e74b20a85/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e", size = 3312425, upload-time = "2026-01-21T18:40:11.548Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4b/fa7838fe20bb752810feed60e45625a9a8b0102c0c09971e2d1d95362992/sqlalchemy-2.0.46-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00", size = 2150268, upload-time = "2026-01-21T19:05:56.621Z" }, + { url = "https://files.pythonhosted.org/packages/46/c1/b34dccd712e8ea846edf396e00973dda82d598cb93762e55e43e6835eba9/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2", size = 3276511, upload-time = "2026-01-21T18:46:49.022Z" }, + { url = "https://files.pythonhosted.org/packages/96/48/a04d9c94753e5d5d096c628c82a98c4793b9c08ca0e7155c3eb7d7db9f24/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee", size = 3292881, upload-time = "2026-01-21T18:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/be/f4/06eda6e91476f90a7d8058f74311cb65a2fb68d988171aced81707189131/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad", size = 3224559, upload-time = "2026-01-21T18:46:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a2/d2af04095412ca6345ac22b33b89fe8d6f32a481e613ffcb2377d931d8d0/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e", size = 3262728, upload-time = "2026-01-21T18:40:14.883Z" }, + { url = "https://files.pythonhosted.org/packages/56/ba/9be4f97c7eb2b9d5544f2624adfc2853e796ed51d2bb8aec90bc94b7137e/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10", size = 3556533, upload-time = "2026-01-21T18:33:06.636Z" }, + { url = "https://files.pythonhosted.org/packages/20/a6/b1fc6634564dbb4415b7ed6419cdfeaadefd2c39cdab1e3aa07a5f2474c2/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764", size = 3523208, upload-time = "2026-01-21T18:45:08.436Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d8/41e0bdfc0f930ff236f86fccd12962d8fa03713f17ed57332d38af6a3782/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b", size = 3464292, upload-time = "2026-01-21T18:33:08.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/8b/9dcbec62d95bea85f5ecad9b8d65b78cc30fb0ffceeb3597961f3712549b/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447", size = 3473497, upload-time = "2026-01-21T18:45:10.552Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f8/5ecdfc73383ec496de038ed1614de9e740a82db9ad67e6e4514ebc0708a3/sqlalchemy-2.0.46-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada", size = 2152079, upload-time = "2026-01-21T19:05:58.477Z" }, + { url = "https://files.pythonhosted.org/packages/e5/bf/eba3036be7663ce4d9c050bc3d63794dc29fbe01691f2bf5ccb64e048d20/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366", size = 3272216, upload-time = "2026-01-21T18:46:52.634Z" }, + { url = "https://files.pythonhosted.org/packages/05/45/1256fb597bb83b58a01ddb600c59fe6fdf0e5afe333f0456ed75c0f8d7bd/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d", size = 3277208, upload-time = "2026-01-21T18:40:16.38Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a0/2053b39e4e63b5d7ceb3372cface0859a067c1ddbd575ea7e9985716f771/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e", size = 3221994, upload-time = "2026-01-21T18:46:54.622Z" }, + { url = "https://files.pythonhosted.org/packages/1e/87/97713497d9502553c68f105a1cb62786ba1ee91dea3852ae4067ed956a50/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf", size = 3243990, upload-time = "2026-01-21T18:40:18.253Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f0/f96c8057c982d9d8a7a68f45d69c674bc6f78cad401099692fe16521640a/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa", size = 3561202, upload-time = "2026-01-21T18:33:10.337Z" }, + { url = "https://files.pythonhosted.org/packages/d7/53/3b37dda0a5b137f21ef608d8dfc77b08477bab0fe2ac9d3e0a66eaeab6fc/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863", size = 3526296, upload-time = "2026-01-21T18:45:12.657Z" }, + { url = "https://files.pythonhosted.org/packages/33/75/f28622ba6dde79cd545055ea7bd4062dc934e0621f7b3be2891f8563f8de/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede", size = 3470008, upload-time = "2026-01-21T18:33:11.725Z" }, + { url = "https://files.pythonhosted.org/packages/a9/42/4afecbbc38d5e99b18acef446453c76eec6fbd03db0a457a12a056836e22/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330", size = 3476137, upload-time = "2026-01-21T18:45:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a1/9c4efa03300926601c19c18582531b45aededfb961ab3c3585f1e24f120b/sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", size = 1937882, upload-time = "2026-01-21T18:22:10.456Z" }, +] + +[package.optional-dependencies] +asyncio = [ + { name = "greenlet", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + [[package]] name = "sqlparse" -version = "0.5.3" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999, upload-time = "2024-12-10T12:05:30.728Z" } +dependencies = [ + { name = "mpmath", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415, upload-time = "2024-12-10T12:05:27.824Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, ] [[package]] name = "termcolor" -version = "3.1.0" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/6c/3d75c196ac07ac8749600b60b03f4f6094d54e132c4d94ebac6ee0e0add0/termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970", size = 14324, upload-time = "2025-04-30T11:37:53.791Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/79/cf31d7a93a8fdc6aa0fbb665be84426a8c5a557d9240b6239e9e11e35fc5/termcolor-3.3.0.tar.gz", hash = "sha256:348871ca648ec6a9a983a13ab626c0acce02f515b9e1983332b17af7979521c5", size = 14434, upload-time = "2025-12-29T12:55:21.882Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload-time = "2025-04-30T11:37:52.382Z" }, + { url = "https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl", hash = "sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5", size = 7734, upload-time = "2025-12-29T12:55:20.718Z" }, ] [[package]] @@ -3888,7 +4698,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/be/65bfc47e4689ecd5ead20cf47dc0084fd767b7e71e8cfabf5fddc42aae3c/tika_client-0.10.0.tar.gz", hash = "sha256:3101e8b2482ae4cb7f87be13ada970ff691bdc3404d94cd52f5e57a09c99370c", size = 2178257, upload-time = "2025-08-04T17:47:30.414Z" } wheels = [ @@ -3896,61 +4705,244 @@ wheels = [ ] [[package]] -name = "tomli" +name = "tiktoken" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/46/21ea696b21f1d6d1efec8639c204bdf20fde8bafb351e1355c72c5d7de52/tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb", size = 1051565, upload-time = "2025-10-06T20:21:44.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" }, + { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d0/3d9275198e067f8b65076a68894bb52fd253875f3644f0a321a720277b8a/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded", size = 1152444, upload-time = "2025-10-06T20:21:48.139Z" }, + { url = "https://files.pythonhosted.org/packages/78/db/a58e09687c1698a7c592e1038e01c206569b86a0377828d51635561f8ebf/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd", size = 1195080, upload-time = "2025-10-06T20:21:49.246Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/a9e4d2bf91d515c0f74afc526fd773a812232dd6cda33ebea7f531202325/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967", size = 1255240, upload-time = "2025-10-06T20:21:50.274Z" }, + { url = "https://files.pythonhosted.org/packages/a4/85/be65d39d6b647c79800fd9d29241d081d4eeb06271f383bb87200d74cf76/tiktoken-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b97f74aca0d78a1ff21b8cd9e9925714c15a9236d6ceacf5c7327c117e6e21e8", size = 1050728, upload-time = "2025-10-06T20:21:52.756Z" }, + { url = "https://files.pythonhosted.org/packages/4a/42/6573e9129bc55c9bf7300b3a35bef2c6b9117018acca0dc760ac2d93dffe/tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b", size = 994049, upload-time = "2025-10-06T20:21:53.782Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/ed88504d2f4a5fd6856990b230b56d85a777feab84e6129af0822f5d0f70/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37", size = 1129008, upload-time = "2025-10-06T20:21:54.832Z" }, + { url = "https://files.pythonhosted.org/packages/f4/90/3dae6cc5436137ebd38944d396b5849e167896fc2073da643a49f372dc4f/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad", size = 1152665, upload-time = "2025-10-06T20:21:56.129Z" }, + { url = "https://files.pythonhosted.org/packages/a3/fe/26df24ce53ffde419a42f5f53d755b995c9318908288c17ec3f3448313a3/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5", size = 1194230, upload-time = "2025-10-06T20:21:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/20/cc/b064cae1a0e9fac84b0d2c46b89f4e57051a5f41324e385d10225a984c24/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3", size = 1254688, upload-time = "2025-10-06T20:21:58.619Z" }, + { url = "https://files.pythonhosted.org/packages/00/61/441588ee21e6b5cdf59d6870f86beb9789e532ee9718c251b391b70c68d6/tiktoken-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:775c2c55de2310cc1bc9a3ad8826761cbdc87770e586fd7b6da7d4589e13dab3", size = 1050802, upload-time = "2025-10-06T20:22:00.96Z" }, + { url = "https://files.pythonhosted.org/packages/1f/05/dcf94486d5c5c8d34496abe271ac76c5b785507c8eae71b3708f1ad9b45a/tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160", size = 993995, upload-time = "2025-10-06T20:22:02.788Z" }, + { url = "https://files.pythonhosted.org/packages/a0/70/5163fe5359b943f8db9946b62f19be2305de8c3d78a16f629d4165e2f40e/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa", size = 1128948, upload-time = "2025-10-06T20:22:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/c028aa0babf77315e1cef357d4d768800c5f8a6de04d0eac0f377cb619fa/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be", size = 1151986, upload-time = "2025-10-06T20:22:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5a/886b108b766aa53e295f7216b509be95eb7d60b166049ce2c58416b25f2a/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a", size = 1194222, upload-time = "2025-10-06T20:22:06.265Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/4db272048397636ac7a078d22773dd2795b1becee7bc4922fe6207288d57/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3", size = 1255097, upload-time = "2025-10-06T20:22:07.403Z" }, + { url = "https://files.pythonhosted.org/packages/ce/76/994fc868f88e016e6d05b0da5ac24582a14c47893f4474c3e9744283f1d5/tiktoken-0.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d5f89ea5680066b68bcb797ae85219c72916c922ef0fcdd3480c7d2315ffff16", size = 1050309, upload-time = "2025-10-06T20:22:10.939Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/57ef1456504c43a849821920d582a738a461b76a047f352f18c0b26c6516/tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a", size = 993712, upload-time = "2025-10-06T20:22:12.115Z" }, + { url = "https://files.pythonhosted.org/packages/72/90/13da56f664286ffbae9dbcfadcc625439142675845baa62715e49b87b68b/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27", size = 1128725, upload-time = "2025-10-06T20:22:13.541Z" }, + { url = "https://files.pythonhosted.org/packages/05/df/4f80030d44682235bdaecd7346c90f67ae87ec8f3df4a3442cb53834f7e4/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb", size = 1151875, upload-time = "2025-10-06T20:22:14.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/1f/ae535223a8c4ef4c0c1192e3f9b82da660be9eb66b9279e95c99288e9dab/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e", size = 1194451, upload-time = "2025-10-06T20:22:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/78/a7/f8ead382fce0243cb625c4f266e66c27f65ae65ee9e77f59ea1653b6d730/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25", size = 1253794, upload-time = "2025-10-06T20:22:16.624Z" }, + { url = "https://files.pythonhosted.org/packages/72/05/3abc1db5d2c9aadc4d2c76fa5640134e475e58d9fbb82b5c535dc0de9b01/tiktoken-0.12.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a90388128df3b3abeb2bfd1895b0681412a8d7dc644142519e6f0a97c2111646", size = 1050188, upload-time = "2025-10-06T20:22:19.563Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7b/50c2f060412202d6c95f32b20755c7a6273543b125c0985d6fa9465105af/tiktoken-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:da900aa0ad52247d8794e307d6446bd3cdea8e192769b56276695d34d2c9aa88", size = 993978, upload-time = "2025-10-06T20:22:20.702Z" }, + { url = "https://files.pythonhosted.org/packages/14/27/bf795595a2b897e271771cd31cb847d479073497344c637966bdf2853da1/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:285ba9d73ea0d6171e7f9407039a290ca77efcdb026be7769dccc01d2c8d7fff", size = 1129271, upload-time = "2025-10-06T20:22:22.06Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/9341a6d7a8f1b448573bbf3425fa57669ac58258a667eb48a25dfe916d70/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d186a5c60c6a0213f04a7a802264083dea1bbde92a2d4c7069e1a56630aef830", size = 1151216, upload-time = "2025-10-06T20:22:23.085Z" }, + { url = "https://files.pythonhosted.org/packages/75/0d/881866647b8d1be4d67cb24e50d0c26f9f807f994aa1510cb9ba2fe5f612/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:604831189bd05480f2b885ecd2d1986dc7686f609de48208ebbbddeea071fc0b", size = 1194860, upload-time = "2025-10-06T20:22:24.602Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1e/b651ec3059474dab649b8d5b69f5c65cd8fcd8918568c1935bd4136c9392/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8f317e8530bb3a222547b85a58583238c8f74fd7a7408305f9f63246d1a0958b", size = 1254567, upload-time = "2025-10-06T20:22:25.671Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a4/72eed53e8976a099539cdd5eb36f241987212c29629d0a52c305173e0a68/tiktoken-0.12.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2c714c72bc00a38ca969dae79e8266ddec999c7ceccd603cc4f0d04ccd76365", size = 1050473, upload-time = "2025-10-06T20:22:27.775Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d7/0110b8f54c008466b19672c615f2168896b83706a6611ba6e47313dbc6e9/tiktoken-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cbb9a3ba275165a2cb0f9a83f5d7025afe6b9d0ab01a22b50f0e74fee2ad253e", size = 993855, upload-time = "2025-10-06T20:22:28.799Z" }, + { url = "https://files.pythonhosted.org/packages/5f/77/4f268c41a3957c418b084dd576ea2fad2e95da0d8e1ab705372892c2ca22/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:dfdfaa5ffff8993a3af94d1125870b1d27aed7cb97aa7eb8c1cefdbc87dbee63", size = 1129022, upload-time = "2025-10-06T20:22:29.981Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2b/fc46c90fe5028bd094cd6ee25a7db321cb91d45dc87531e2bdbb26b4867a/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:584c3ad3d0c74f5269906eb8a659c8bfc6144a52895d9261cdaf90a0ae5f4de0", size = 1150736, upload-time = "2025-10-06T20:22:30.996Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/3c7a39ff68022ddfd7d93f3337ad90389a342f761c4d71de99a3ccc57857/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54c891b416a0e36b8e2045b12b33dd66fb34a4fe7965565f1b482da50da3e86a", size = 1194908, upload-time = "2025-10-06T20:22:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/ab/0d/c1ad6f4016a3968c048545f5d9b8ffebf577774b2ede3e2e352553b685fe/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0", size = 1253706, upload-time = "2025-10-06T20:22:33.385Z" }, +] + +[[package]] +name = "tinytag" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/96/59/8a8cb2331e2602b53e4dc06960f57d1387a2b18e7efd24e5f9cb60ea4925/tinytag-2.2.1.tar.gz", hash = "sha256:e6d06610ebe7cd66fd07be2d3b9495914ab32654a5e47657bb8cd44c2484523c", size = 38214, upload-time = "2026-03-15T18:48:01.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/34/d50e338631baaf65ec5396e70085e5de0b52b24b28db1ffbc1c6e82190dc/tinytag-2.2.1-py3-none-any.whl", hash = "sha256:ed8b1e6d25367937e3321e054f4974f9abfde1a3e0a538824c87da377130c2b6", size = 32927, upload-time = "2026-03-15T18:47:59.613Z" }, +] + +[[package]] +name = "tokenizers" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +] + +[[package]] +name = "torch" +version = "2.10.0" +source = { registry = "https://download.pytorch.org/whl/cpu" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and sys_platform == 'darwin'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform == 'darwin'" }, + { name = "fsspec", marker = "sys_platform == 'darwin'" }, + { name = "jinja2", marker = "sys_platform == 'darwin'" }, + { name = "networkx", marker = "sys_platform == 'darwin'" }, + { name = "setuptools", marker = "python_full_version >= '3.12' and sys_platform == 'darwin'" }, + { name = "sympy", marker = "sys_platform == 'darwin'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin'" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:0826ac8e409551e12b2360ac18b4161a838cbd111933e694752f351191331d09" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:7fbbf409143a4fe0812a40c0b46a436030a7e1d14fe8c5234dfbe44df47f617e" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:b39cafff7229699f9d6e172cac74d85fd71b568268e439e08d9c540e54732a3e" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:90821a3194b8806d9fa9fdaa9308c1bc73df0c26808274b14129a97c99f35794" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:358bd7125cbec6e692d60618a5eec7f55a51b29e3652a849fd42af021d818023" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:470de4176007c2700735e003a830828a88d27129032a3add07291da07e2a94e8" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:4584ab167995c0479f6821e3dceaf199c8166c811d3adbba5d8eedbbfa6764fd" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:45a1c5057629444aeb1c452c18298fa7f30f2f7aeadd4dc41f9d340980294407" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:339e05502b6c839db40e88720cb700f5a3b50cda332284873e851772d41b2c1e" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:840351da59cedb7bcbc51981880050813c19ef6b898a7fecf73a3afc71aff3fe" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:c88b1129fd4e14f0f882963c6728315caae35d2f47374d17edeed1edc7697497" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f4bea7dc451267c028593751612ad559299589304e68df54ae7672427893ff2c" }, +] + +[[package]] +name = "torch" +version = "2.10.0+cpu" +source = { registry = "https://download.pytorch.org/whl/cpu" } +resolution-markers = [ + "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", + "python_full_version < '3.12' and sys_platform == 'linux'", +] +dependencies = [ + { name = "filelock", marker = "sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "networkx", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12' and sys_platform == 'linux'" }, + { name = "sympy", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp311-cp311-linux_aarch64.whl", hash = "sha256:ce5c113d1f55f8c1f5af05047a24e50d11d293e0cbbb5bf7a75c6c761edd6eaa" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp311-cp311-linux_s390x.whl", hash = "sha256:0e286fcf6ce0cc7b204396c9b4ea0d375f1f0c3e752f68ce3d3aeb265511db8c" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1cfcb9b1558c6e52dffd0d4effce83b13c5ae5d97338164c372048c21f9cfccb" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b7cb1ec66cefb90fd7b676eac72cfda3b8d4e4d0cacd7a531963bc2e0a9710ab" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp312-cp312-linux_aarch64.whl", hash = "sha256:8de5a36371b775e2d4881ed12cc7f2de400b1ad3d728aa74a281f649f87c9b8c" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp312-cp312-linux_s390x.whl", hash = "sha256:9accc30b56cb6756d4a9d04fcb8ebc0bb68c7d55c1ed31a8657397d316d31596" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:179451716487f8cb09b56459667fa1f5c4c0946c1e75fbeae77cfc40a5768d87" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ee40b8a4b4b2cf0670c6fd4f35a7ef23871af956fecb238fbf5da15a72650b1d" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-linux_aarch64.whl", hash = "sha256:fd215f3d0f681905c5b56b0630a3d666900a37fcc3ca5b937f95275c66f9fd9c" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-linux_s390x.whl", hash = "sha256:170a0623108055be5199370335cf9b41ba6875b3cb6f086db4aee583331a4899" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e51994492cdb76edce29da88de3672a3022f9ef0ffd90345436948d4992be2c7" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8d316e5bf121f1eab1147e49ad0511a9d92e4c45cc357d1ab0bee440da71a095" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-linux_aarch64.whl", hash = "sha256:5af75e5f49de21b0bdf7672bc27139bd285f9e8dbcabe2d617a2eb656514ac36" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-linux_s390x.whl", hash = "sha256:ba51ef01a510baf8fff576174f702c47e1aa54389a9f1fba323bb1a5003ff0bf" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:0fedcb1a77e8f2aaf7bfd21591bf6d1e0b207473268c9be16b17cb7783253969" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:106dd1930cb30a4a337366ba3f9b25318ebf940f51fd46f789281dd9e736bdc4" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-linux_aarch64.whl", hash = "sha256:ea2bcc9d1fca66974a71d4bf9a502539283f35d61fcab5a799b4e120846f1e02" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-linux_s390x.whl", hash = "sha256:f8294fd2fc6dd8f4435a891a0122307a043b14b21f0dac1bca63c85bfb59e586" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a28fdbcfa2fbacffec81300f24dd1bed2b0ccfdbed107a823cff12bc1db070f6" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:aada8afc068add586464b2a55adb7cc9091eec55caf5320447204741cb6a0604" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-linux_aarch64.whl", hash = "sha256:9412bd37b70f5ebd1205242c4ba4cabae35a605947f2b30806d5c9b467936db9" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-linux_s390x.whl", hash = "sha256:e71c476517c33e7db69825a9ff46c7f47a723ec4dac5b2481cff4246d1c632be" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:23882f8d882460aca809882fc42f5e343bf07585274f929ced00177d1be1eb67" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.10.0%2Bcpu-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:4fcd8b4cc2ae20f2b7749fb275349c55432393868778c2d50a08e81d5ee5591e" }, ] [[package]] name = "tornado" -version = "6.5.2" +version = "6.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload-time = "2025-08-08T18:27:00.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload-time = "2025-08-08T18:26:42.945Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload-time = "2025-08-08T18:26:44.473Z" }, - { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload-time = "2025-08-08T18:26:46.021Z" }, - { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload-time = "2025-08-08T18:26:47.625Z" }, - { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload-time = "2025-08-08T18:26:50.599Z" }, - { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload-time = "2025-08-08T18:26:51.864Z" }, - { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload-time = "2025-08-08T18:26:53.625Z" }, - { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload-time = "2025-08-08T18:26:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "transformers" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "safetensors", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tokenizers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typer-slim", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/79/845941711811789c85fb7e2599cea425a14a07eda40f50896b9d3fda7492/transformers-5.0.0.tar.gz", hash = "sha256:5f5634efed6cf76ad068cc5834c7adbc32db78bbd6211fb70df2325a9c37dec8", size = 8424830, upload-time = "2026-01-26T10:46:46.813Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/52/f3/ac976fa8e305c9e49772527e09fbdc27cc6831b8a2f6b6063406626be5dd/transformers-5.0.0-py3-none-any.whl", hash = "sha256:587086f249ce64c817213cf36afdb318d087f790723e9b3d4500b97832afd52d", size = 10142091, upload-time = "2026-01-26T10:46:43.88Z" }, ] [[package]] @@ -3980,23 +4972,36 @@ tls = [ [[package]] name = "txaio" -version = "25.9.2" +version = "25.12.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2b/20/2e7ccea9ab2dd824d0bd421d9364424afde3bb33863afb80cd9180335019/txaio-25.9.2.tar.gz", hash = "sha256:e42004a077c02eb5819ff004a4989e49db113836708430d59cb13d31bd309099", size = 50008, upload-time = "2025-09-25T22:21:07.958Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/67/ea9c9ddbaa3e0b4d53c91f8778a33e42045be352dc7200ed2b9aaa7dc229/txaio-25.12.2.tar.gz", hash = "sha256:9f232c21e12aa1ff52690e365b5a0ecfd42cc27a6ec86e1b92ece88f763f4b78", size = 117393, upload-time = "2025-12-09T15:03:26.527Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/2c/e276b80f73fc0411cefa1c1eeae6bc17955197a9c3e2b41b41f957322549/txaio-25.9.2-py3-none-any.whl", hash = "sha256:a23ce6e627d130e9b795cbdd46c9eaf8abd35e42d2401bb3fea63d38beda0991", size = 31293, upload-time = "2025-09-25T22:21:06.394Z" }, + { url = "https://files.pythonhosted.org/packages/50/05/bdb6318120cac9bf97779674f49035e0595d894b42d4c43b60637bafdb1f/txaio-25.12.2-py3-none-any.whl", hash = "sha256:5f6cd6c6b397fc3305790d15efd46a2d5b91cdbefa96543b4f8666aeb56ba026", size = 31208, upload-time = "2025-12-09T04:30:27.811Z" }, +] + +[[package]] +name = "typer-slim" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/d4/064570dec6358aa9049d4708e4a10407d74c99258f8b2136bb8702303f1a/typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd", size = 110478, upload-time = "2026-01-06T11:21:11.176Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d", size = 47444, upload-time = "2026-01-06T11:21:12.441Z" }, ] [[package]] name = "types-bleach" -version = "6.2.0.20250809" +version = "6.3.0.20251115" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-html5lib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/50/f85660f9893da1a2cea3e14675c9ab4a75f2a5c12a8ab79de959e5f3f2ad/types_bleach-6.2.0.20250809.tar.gz", hash = "sha256:188d7a1119f6c953140b513ed57ba4213755695815472c19d0c22ac09c79b90b", size = 11216, upload-time = "2025-08-09T03:16:46.876Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/54/3e0d9e2e0d7a00cf9b1a2c35160038c8bf5cb7ad80003c5d7e4e5af1e9dd/types_bleach-6.3.0.20251115.tar.gz", hash = "sha256:96911b20f169a18524d03b61fa7e98a08c411292f7cdb5dc191057f55dad9ae3", size = 11452, upload-time = "2025-11-15T03:00:28.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/41/51075b7c9fd62f8ea636e6ca619ca25e5617c066a1a19d12e2f7d9343edb/types_bleach-6.2.0.20250809-py3-none-any.whl", hash = "sha256:0b372a75117947d9ac8a31ae733fd0f8d92ec75c4772e7b37093ba3fa5b48fb9", size = 11968, upload-time = "2025-08-09T03:16:46.174Z" }, + { url = "https://files.pythonhosted.org/packages/ee/fb/9f016a969603ef949a573158a58dd293948ed187c1f9f76c7cfe1bb96705/types_bleach-6.3.0.20251115-py3-none-any.whl", hash = "sha256:f81e7cf4ebac3f3d60b66b3fd5236c324e65037d1b28d22c94d5b457f0b98f42", size = 12015, upload-time = "2025-11-15T03:00:27.785Z" }, ] [[package]] @@ -4011,6 +5016,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/ec/092f2b74b49ec4855cdb53050deb9699f7105b8fda6fe034c0781b8687f3/types_cffi-1.17.0.20250915-py3-none-any.whl", hash = "sha256:cef4af1116c83359c11bb4269283c50f0688e9fc1d7f0eeb390f3661546da52c", size = 20112, upload-time = "2025-09-15T03:01:24.187Z" }, ] +[[package]] +name = "types-channels" +version = "4.3.0.20250822" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "django-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/3d/e0a164b7eaab18ab2302b7a3d90843824b729d9fe1d7bdbb3769dfc9d77b/types_channels-4.3.0.20250822.tar.gz", hash = "sha256:29a4928fdaed6d444b93b69d44fcdb5a8fe32fa72d6a41016c5d39fa7bd7f474", size = 15357, upload-time = "2025-08-22T03:04:26.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/52/4e3094e43d460feacb9051ec4c3498f8272f69d92b772647211478b25079/types_channels-4.3.0.20250822-py3-none-any.whl", hash = "sha256:d3fc0a1467c8cc901686826408c8a673822e07aa79cbe1a6d21946e7e55d9ddf", size = 21125, upload-time = "2025-08-22T03:04:25.539Z" }, +] + [[package]] name = "types-colorama" version = "0.4.15.20250801" @@ -4022,50 +5040,53 @@ wheels = [ [[package]] name = "types-dateparser" -version = "1.2.2.20250809" +version = "1.3.0.20260206" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/54/2d2b77d1beba5bdb7faeabc7d7f0b9b2f8e428f79f45a144ad7ab87d1a29/types_dateparser-1.2.2.20250809.tar.gz", hash = "sha256:a898f5527e6c34d213bc5d85254b8246d8b1e76239ed9243711198add0c8a29c", size = 15804, upload-time = "2025-08-09T03:15:11.298Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/e0/72045089c4503d22f21f53f04898eb0cf48ee7fad3d80187e32069f9593b/types_dateparser-1.3.0.20260206.tar.gz", hash = "sha256:8d2ee287aa33f0b26fe8cc48cd8e28f958ada839b2db5a4e3f54371dfe77a696", size = 16516, upload-time = "2026-02-06T04:03:39.022Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/5a/a5cf930804f639f5f1c58434613a1bbc1bd4641e29aec07444f316b41dff/types_dateparser-1.2.2.20250809-py3-none-any.whl", hash = "sha256:f12ae46abc3085e60e16fbe55730c5acbce980cbe3b176b17b08b4cef85850ef", size = 22140, upload-time = "2025-08-09T03:15:10.234Z" }, + { url = "https://files.pythonhosted.org/packages/ec/31/2d8b6c693f015349885092173e604af2e480c3fd0a16cdb5ca97024238b0/types_dateparser-1.3.0.20260206-py3-none-any.whl", hash = "sha256:d6e5d33101b46d9cc14866f105806c80c9b8826492c75e9b323c8fc45ceb1390", size = 22963, upload-time = "2026-02-06T04:03:37.711Z" }, ] [[package]] name = "types-docutils" -version = "0.22.2.20250924" +version = "0.22.3.20251115" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/6d/60326ba08f44629f778937d5021a342da996682d932261d48b4043c437f7/types_docutils-0.22.2.20250924.tar.gz", hash = "sha256:a13fb412676c164edec7c2f26fe52ab7b0b7c868168dacc4298f6a8069298f3d", size = 56679, upload-time = "2025-09-24T02:53:26.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/d7/576ec24bf61a280f571e1f22284793adc321610b9bcfba1bf468cf7b334f/types_docutils-0.22.3.20251115.tar.gz", hash = "sha256:0f79ea6a7bd4d12d56c9f824a0090ffae0ea4204203eb0006392906850913e16", size = 56828, upload-time = "2025-11-15T02:59:57.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/2b/844f3a6e972515ef0890fd8bf631890b6d74c8eacb1acbf31a72820c3b45/types_docutils-0.22.2.20250924-py3-none-any.whl", hash = "sha256:a6d52e21fa70998d34d13db6891ea35920bbb20f91459ca528a3845fd0b9ec03", size = 91873, upload-time = "2025-09-24T02:53:24.824Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/61ac9eb38f1f978b47443dc6fd2e0a3b0f647c2da741ddad30771f1b2b6f/types_docutils-0.22.3.20251115-py3-none-any.whl", hash = "sha256:c6e53715b65395d00a75a3a8a74e352c669bc63959e65a207dffaa22f4a2ad6e", size = 91951, upload-time = "2025-11-15T02:59:56.413Z" }, ] [[package]] name = "types-html5lib" -version = "1.1.11.20250917" +version = "1.1.11.20251117" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/4b/a970718e8bd9324ee8fb8eaf02ff069f6d03c20d4523bb4232892ecc3d06/types_html5lib-1.1.11.20250917.tar.gz", hash = "sha256:7b52743377f33f9b4fd7385afbd2d457b8864ee51f90ff2a795ad9e8c053373a", size = 16868, upload-time = "2025-09-17T02:47:41.18Z" } +dependencies = [ + { name = "types-webencodings", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/f3/d9a1bbba7b42b5558a3f9fe017d967f5338cf8108d35991d9b15fdea3e0d/types_html5lib-1.1.11.20251117.tar.gz", hash = "sha256:1a6a3ac5394aa12bf547fae5d5eff91dceec46b6d07c4367d9b39a37f42f201a", size = 18100, upload-time = "2025-11-17T03:08:00.78Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/8a/da91a9c64dcb5e69beb567519857411996d8ecae9f6f128bcef8260e7a8d/types_html5lib-1.1.11.20250917-py3-none-any.whl", hash = "sha256:b294fd06d60da205daeb2f615485ca4d475088d2eff1009cf427f4a80fcd5346", size = 22908, upload-time = "2025-09-17T02:47:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ab/f5606db367c1f57f7400d3cb3bead6665ee2509621439af1b29c35ef6f9e/types_html5lib-1.1.11.20251117-py3-none-any.whl", hash = "sha256:2a3fc935de788a4d2659f4535002a421e05bea5e172b649d33232e99d4272d08", size = 24302, upload-time = "2025-11-17T03:07:59.996Z" }, ] [[package]] name = "types-markdown" -version = "3.9.0.20250906" +version = "3.10.2.20260211" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/dd/8a91a5f4dce705eff6862e01e8fd9984cdc55e6d6c3cfcadc68410c43abf/types_markdown-3.9.0.20250906.tar.gz", hash = "sha256:f02dc1a2d130b093de4910c64b2d0a811ae7020f03624df41c667818d2fee050", size = 19439, upload-time = "2025-09-06T02:45:23.617Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/2e/35b30a09f6ee8a69142408d3ceb248c4454aa638c0a414d8704a3ef79563/types_markdown-3.10.2.20260211.tar.gz", hash = "sha256:66164310f88c11a58c6c706094c6f8c537c418e3525d33b76276a5fbd66b01ce", size = 19768, upload-time = "2026-02-11T04:19:29.497Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/17/b0b9d315422eae106af1d30e51afe4b59c18b42311605fed9068ac6aa065/types_markdown-3.9.0.20250906-py3-none-any.whl", hash = "sha256:afac4297e4e75f00b4043f9b3a989dc5924230d065996a233b9bce894c438cc2", size = 25830, upload-time = "2025-09-06T02:45:22.211Z" }, + { url = "https://files.pythonhosted.org/packages/54/c9/659fa2df04b232b0bfcd05d2418e683080e91ec68f636f3c0a5a267350e7/types_markdown-3.10.2.20260211-py3-none-any.whl", hash = "sha256:2d94d08587e3738203b3c4479c449845112b171abe8b5cadc9b0c12fcf3e99da", size = 25854, upload-time = "2026-02-11T04:19:28.647Z" }, ] [[package]] name = "types-pygments" -version = "2.19.0.20250809" +version = "2.19.0.20251121" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-docutils", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/1b/a6317763a8f2de01c425644273e5fbe3145d648a081f3bad590b3c34e000/types_pygments-2.19.0.20250809.tar.gz", hash = "sha256:01366fd93ef73c792e6ee16498d3abf7a184f1624b50b77f9506a47ed85974c2", size = 18454, upload-time = "2025-08-09T03:17:14.322Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/3b/cd650700ce9e26b56bd1a6aa4af397bbbc1784e22a03971cb633cdb0b601/types_pygments-2.19.0.20251121.tar.gz", hash = "sha256:eef114fde2ef6265365522045eac0f8354978a566852f69e75c531f0553822b1", size = 18590, upload-time = "2025-11-21T03:03:46.623Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/c4/d9f0923a941159664d664a0b714242fbbd745046db2d6c8de6fe1859c572/types_pygments-2.19.0.20250809-py3-none-any.whl", hash = "sha256:8e813e5fc25f741b81cadc1e181d402ebd288e34a9812862ddffee2f2b57db7c", size = 25407, upload-time = "2025-08-09T03:17:13.223Z" }, + { url = "https://files.pythonhosted.org/packages/99/8a/9244b21f1d60dcc62e261435d76b02f1853b4771663d7ec7d287e47a9ba9/types_pygments-2.19.0.20251121-py3-none-any.whl", hash = "sha256:cb3bfde34eb75b984c98fb733ce4f795213bd3378f855c32e75b49318371bb25", size = 25674, upload-time = "2025-11-21T03:03:45.72Z" }, ] [[package]] @@ -4083,20 +5104,20 @@ wheels = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20250822" +version = "2.9.0.20260305" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/0a/775f8551665992204c756be326f3575abba58c4a3a52eef9909ef4536428/types_python_dateutil-2.9.0.20250822.tar.gz", hash = "sha256:84c92c34bd8e68b117bff742bc00b692a1e8531262d4507b33afcc9f7716cd53", size = 16084, upload-time = "2025-08-22T03:02:00.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/025c624f347e10476b439a6619a95f1d200250ea88e7ccea6e09e48a7544/types_python_dateutil-2.9.0.20260305.tar.gz", hash = "sha256:389717c9f64d8f769f36d55a01873915b37e97e52ce21928198d210fbd393c8b", size = 16885, upload-time = "2026-03-05T04:00:47.409Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/d9/a29dfa84363e88b053bf85a8b7f212a04f0d7343a4d24933baa45c06e08b/types_python_dateutil-2.9.0.20250822-py3-none-any.whl", hash = "sha256:849d52b737e10a6dc6621d2bd7940ec7c65fcb69e6aa2882acf4e56b2b508ddc", size = 17892, upload-time = "2025-08-22T03:01:59.436Z" }, + { url = "https://files.pythonhosted.org/packages/0a/77/8c0d1ec97f0d9707ad3d8fa270ab8964e7b31b076d2f641c94987395cc75/types_python_dateutil-2.9.0.20260305-py3-none-any.whl", hash = "sha256:a3be9ca444d38cadabd756cfbb29780d8b338ae2a3020e73c266a83cc3025dd7", size = 18419, upload-time = "2026-03-05T04:00:46.392Z" }, ] [[package]] name = "types-pytz" -version = "2025.2.0.20250809" +version = "2025.2.0.20251108" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/e2/c774f754de26848f53f05defff5bb21dd9375a059d1ba5b5ea943cf8206e/types_pytz-2025.2.0.20250809.tar.gz", hash = "sha256:222e32e6a29bb28871f8834e8785e3801f2dc4441c715cd2082b271eecbe21e5", size = 10876, upload-time = "2025-08-09T03:14:17.453Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/ff/c047ddc68c803b46470a357454ef76f4acd8c1088f5cc4891cdd909bfcf6/types_pytz-2025.2.0.20251108.tar.gz", hash = "sha256:fca87917836ae843f07129567b74c1929f1870610681b4c92cb86a3df5817bdb", size = 10961, upload-time = "2025-11-08T02:55:57.001Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d0/91c24fe54e565f2344d7a6821e6c6bb099841ef09007ea6321a0bac0f808/types_pytz-2025.2.0.20250809-py3-none-any.whl", hash = "sha256:4f55ed1b43e925cf851a756fe1707e0f5deeb1976e15bf844bcaa025e8fbd0db", size = 10095, upload-time = "2025-08-09T03:14:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c1/56ef16bf5dcd255155cc736d276efa6ae0a5c26fd685e28f0412a4013c01/types_pytz-2025.2.0.20251108-py3-none-any.whl", hash = "sha256:0f1c9792cab4eb0e46c52f8845c8f77cf1e313cb3d68bf826aa867fe4717d91c", size = 10116, upload-time = "2025-11-08T02:55:56.194Z" }, ] [[package]] @@ -4123,35 +5144,32 @@ wheels = [ [[package]] name = "types-requests" -version = "2.32.4.20250913" +version = "2.32.4.20260107" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/27/489922f4505975b11de2b5ad07b4fe1dca0bca9be81a703f26c5f3acfce5/types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d", size = 23113, upload-time = "2025-09-13T02:40:02.309Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/f3/a0663907082280664d745929205a89d41dffb29e89a50f753af7d57d0a96/types_requests-2.32.4.20260107.tar.gz", hash = "sha256:018a11ac158f801bfa84857ddec1650750e393df8a004a8a9ae2a9bec6fcb24f", size = 23165, upload-time = "2026-01-07T03:20:54.091Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/20/9a227ea57c1285986c4cf78400d0a91615d25b24e257fd9e2969606bdfae/types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1", size = 20658, upload-time = "2025-09-13T02:40:01.115Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/709ea261f2bf91ef0a26a9eed20f2623227a8ed85610c1e54c5805692ecb/types_requests-2.32.4.20260107-py3-none-any.whl", hash = "sha256:b703fe72f8ce5b31ef031264fe9395cac8f46a04661a79f7ed31a80fb308730d", size = 20676, upload-time = "2026-01-07T03:20:52.929Z" }, ] [[package]] name = "types-setuptools" -version = "80.9.0.20250822" +version = "80.10.0.20260124" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/bd/1e5f949b7cb740c9f0feaac430e301b8f1c5f11a81e26324299ea671a237/types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965", size = 41296, upload-time = "2025-08-22T03:02:08.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/7e/116539b9610585e34771611e33c88a4c706491fa3565500f5a63139f8731/types_setuptools-80.10.0.20260124.tar.gz", hash = "sha256:1b86d9f0368858663276a0cbe5fe5a9722caf94b5acde8aba0399a6e90680f20", size = 43299, upload-time = "2026-01-24T03:18:39.527Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/2d/475bf15c1cdc172e7a0d665b6e373ebfb1e9bf734d3f2f543d668b07a142/types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3", size = 63179, upload-time = "2025-08-22T03:02:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/2b/7f/016dc5cc718ec6ccaa84fb73ed409ef1c261793fd5e637cdfaa18beb40a9/types_setuptools-80.10.0.20260124-py3-none-any.whl", hash = "sha256:efed7e044f01adb9c2806c7a8e1b6aa3656b8e382379b53d5f26ee3db24d4c01", size = 64333, upload-time = "2026-01-24T03:18:38.344Z" }, ] [[package]] -name = "types-tqdm" -version = "4.67.0.20250809" +name = "types-webencodings" +version = "0.5.0.20251108" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "types-requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d0/cf498fc630d9fdaf2428b93e60b0e67b08008fec22b78716b8323cf644dc/types_tqdm-4.67.0.20250809.tar.gz", hash = "sha256:02bf7ab91256080b9c4c63f9f11b519c27baaf52718e5fdab9e9606da168d500", size = 17200, upload-time = "2025-08-09T03:17:43.489Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/d6/75e381959a2706644f02f7527d264de3216cf6ed333f98eff95954d78e07/types_webencodings-0.5.0.20251108.tar.gz", hash = "sha256:2378e2ceccced3d41bb5e21387586e7b5305e11519fc6b0659c629f23b2e5de4", size = 7470, upload-time = "2025-11-08T02:56:00.132Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/13/3ff0781445d7c12730befce0fddbbc7a76e56eb0e7029446f2853238360a/types_tqdm-4.67.0.20250809-py3-none-any.whl", hash = "sha256:1a73053b31fcabf3c1f3e2a9d5ecdba0f301bde47a418cd0e0bdf774827c5c57", size = 24020, upload-time = "2025-08-09T03:17:42.453Z" }, + { url = "https://files.pythonhosted.org/packages/45/4e/8fcf33e193ce4af03c19d0e08483cf5f0838e883f800909c6bc61cb361be/types_webencodings-0.5.0.20251108-py3-none-any.whl", hash = "sha256:e21f81ff750795faffddaffd70a3d8bfff77d006f22c27e393eb7812586249d8", size = 8715, upload-time = "2025-11-08T02:55:59.456Z" }, ] [[package]] @@ -4163,13 +5181,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -4181,6 +5224,89 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, ] +[[package]] +name = "u-msgpack-python" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/9d/a40411a475e7d4838994b7f6bcc6bfca9acc5b119ce3a7503608c4428b49/u-msgpack-python-2.8.0.tar.gz", hash = "sha256:b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a", size = 18167, upload-time = "2023-05-18T09:28:12.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/5e/512aeb40fd819f4660d00f96f5c7371ee36fc8c6b605128c5ee59e0b28c6/u_msgpack_python-2.8.0-py2.py3-none-any.whl", hash = "sha256:1d853d33e78b72c4228a2025b4db28cda81214076e5b0422ed0ae1b1b2bb586a", size = 10590, upload-time = "2023-05-18T09:28:10.323Z" }, +] + +[[package]] +name = "uharfbuzz" +version = "0.53.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/8d/7c82298bfa5c96f018541661bc2ccdf90dfe397bb2724db46725bf495466/uharfbuzz-0.53.3.tar.gz", hash = "sha256:9a87175c14d1361322ce2a3504e63c6b66062934a5edf47266aed5b33416806c", size = 1714488, upload-time = "2026-01-24T13:10:43.693Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/88/5df9337adb60d7b1ad150b162bbc5c56d783d15546714085d92b9531f8f3/uharfbuzz-0.53.3-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d977e41a501d9e8af3f2c329d75031037ee79634bc29ca3872e9115c44e67d25", size = 2722639, upload-time = "2026-01-24T13:10:22.436Z" }, + { url = "https://files.pythonhosted.org/packages/39/c4/8b4b050e77d6cb9a84af509e5796734f0e687bd02ad11757a581bd6f197d/uharfbuzz-0.53.3-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21d512c94aa992691aaf5b433deaca7e51f4ea54c68b99f535974073364f806f", size = 1647506, upload-time = "2026-01-24T13:10:24.16Z" }, + { url = "https://files.pythonhosted.org/packages/30/ff/8e7cf78d525604f3e0a43b9468263fcf2acb5d208a3979c3bfa8dc61112d/uharfbuzz-0.53.3-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dca9a2e071c0c59ba8f382356f31a2518ac3dc7cc77e4f3519defc454c5b9a97", size = 1706448, upload-time = "2026-01-24T13:10:25.729Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a0/739471cdd52723ecc9fc80f36fb92c706a87265dc258521c1b14d99414f7/uharfbuzz-0.53.3-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1191a74ddcf18ec721161b6b33a8ab31b0c6a2b15c6724a9b663127bf7f07d2e", size = 2664628, upload-time = "2026-01-24T13:10:27.814Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4a/63a81e9eef922b9f26bd948b518b73704d01a8d8e83324b2f99084ab7af0/uharfbuzz-0.53.3-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:35ec3b600b3f63e7659792f9bd43e1ffb389d3d2aac8285f269d11efbe04787d", size = 2757384, upload-time = "2026-01-24T13:10:29.669Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d2/27be1201488323d0ff0c99fb966a0522b2736f79bd5a5b7b99526fca3d98/uharfbuzz-0.53.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6f0ad2812303d2c7ccff596fd6c9d5629874f3a83f30255e11639c9b7ba4e89d", size = 1335822, upload-time = "2026-01-24T13:10:34.774Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/53e39bcd4dec5981eb70a6a76285a862c8a76b80cd52e8f40fe51adab032/uharfbuzz-0.53.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:757d9ed1841912e8f229319f335cf7dd25a2fd377e444bda9deb720617192e12", size = 1237560, upload-time = "2026-01-24T13:10:36.971Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2b/04d8cde466acfe70373d4f489da5c6eab0aba07d50442dd21217cb0fd167/uharfbuzz-0.53.3-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d3a0b824811bd1be129356818e6cdbf0e4b056bb60aa9a5eb270bff9d21f24c", size = 1497923, upload-time = "2026-01-24T13:10:38.743Z" }, + { url = "https://files.pythonhosted.org/packages/f3/01/a250521491bc995609275e0062c552b16f437a3ce15de83250176245093e/uharfbuzz-0.53.3-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9211d798b2921a99b8c34e810676137f66372d3b5447765b72d969bdfa6abe6a", size = 1556794, upload-time = "2026-01-24T13:10:40.262Z" }, +] + +[[package]] +name = "ujson" +version = "5.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/3e/c35530c5ffc25b71c59ae0cd7b8f99df37313daa162ce1e2f7925f7c2877/ujson-5.12.0.tar.gz", hash = "sha256:14b2e1eb528d77bc0f4c5bd1a7ebc05e02b5b41beefb7e8567c9675b8b13bcf4", size = 7158451, upload-time = "2026-03-11T22:19:30.397Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/22/fd22e2f6766bae934d3050517ca47d463016bd8688508d1ecc1baa18a7ad/ujson-5.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58a11cb49482f1a095a2bd9a1d81dd7c8fb5d2357f959ece85db4e46a825fd00", size = 56139, upload-time = "2026-03-11T22:18:04.591Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fd/6839adff4fc0164cbcecafa2857ba08a6eaeedd7e098d6713cb899a91383/ujson-5.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9b3cf13facf6f77c283af0e1713e5e8c47a0fe295af81326cb3cb4380212e797", size = 53836, upload-time = "2026-03-11T22:18:05.662Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b0/0c19faac62d68ceeffa83a08dc3d71b8462cf5064d0e7e0b15ba19898dad/ujson-5.12.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb94245a715b4d6e24689de12772b85329a1f9946cbf6187923a64ecdea39e65", size = 57851, upload-time = "2026-03-11T22:18:06.744Z" }, + { url = "https://files.pythonhosted.org/packages/04/f6/e7fd283788de73b86e99e08256726bb385923249c21dcd306e59d532a1a1/ujson-5.12.0-cp311-cp311-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:0fe6b8b8968e11dd9b2348bd508f0f57cf49ab3512064b36bc4117328218718e", size = 59906, upload-time = "2026-03-11T22:18:07.791Z" }, + { url = "https://files.pythonhosted.org/packages/d7/3a/b100735a2b43ee6e8fe4c883768e362f53576f964d4ea841991060aeaf35/ujson-5.12.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89e302abd3749f6d6699691747969a5d85f7c73081d5ed7e2624c7bd9721a2ab", size = 57409, upload-time = "2026-03-11T22:18:08.79Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/f97cc20c99ca304662191b883ae13ae02912ca7244710016ba0cb8a5be34/ujson-5.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0727363b05ab05ee737a28f6200dc4078bce6b0508e10bd8aab507995a15df61", size = 1037339, upload-time = "2026-03-11T22:18:10.424Z" }, + { url = "https://files.pythonhosted.org/packages/10/7a/53ddeda0ffe1420db2f9999897b3cbb920fbcff1849d1f22b196d0f34785/ujson-5.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b62cb9a7501e1f5c9ffe190485501349c33e8862dde4377df774e40b8166871f", size = 1196625, upload-time = "2026-03-11T22:18:11.82Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/4c64a6bef522e9baf195dd5be151bc815cd4896c50c6e2489599edcda85f/ujson-5.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6ec5bf6bc361f2f0f9644907a36ce527715b488988a8df534120e5c34eeda94", size = 1089669, upload-time = "2026-03-11T22:18:13.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/f6/ac763d2108d28f3a40bb3ae7d2fafab52ca31b36c2908a4ad02cd3ceba2a/ujson-5.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09b4beff9cc91d445d5818632907b85fb06943b61cb346919ce202668bf6794a", size = 56326, upload-time = "2026-03-11T22:18:18.467Z" }, + { url = "https://files.pythonhosted.org/packages/25/46/d0b3af64dcdc549f9996521c8be6d860ac843a18a190ffc8affeb7259687/ujson-5.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca0c7ce828bb76ab78b3991904b477c2fd0f711d7815c252d1ef28ff9450b052", size = 53910, upload-time = "2026-03-11T22:18:19.502Z" }, + { url = "https://files.pythonhosted.org/packages/9a/10/853c723bcabc3e9825a079019055fc99e71b85c6bae600607a2b9d31d18d/ujson-5.12.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d79c6635ccffcbfc1d5c045874ba36b594589be81d50d43472570bb8de9c57", size = 57754, upload-time = "2026-03-11T22:18:20.874Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c6/6e024830d988f521f144ead641981c1f7a82c17ad1927c22de3242565f5c/ujson-5.12.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:7e07f6f644d2c44d53b7a320a084eef98063651912c1b9449b5f45fcbdc6ccd2", size = 59936, upload-time = "2026-03-11T22:18:21.924Z" }, + { url = "https://files.pythonhosted.org/packages/34/c9/c5f236af5abe06b720b40b88819d00d10182d2247b1664e487b3ed9229cf/ujson-5.12.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:085b6ce182cdd6657481c7c4003a417e0655c4f6e58b76f26ee18f0ae21db827", size = 57463, upload-time = "2026-03-11T22:18:22.924Z" }, + { url = "https://files.pythonhosted.org/packages/ae/04/41342d9ef68e793a87d84e4531a150c2b682f3bcedfe59a7a5e3f73e9213/ujson-5.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16b4fe9c97dc605f5e1887a9e1224287291e35c56cbc379f8aa44b6b7bcfe2bb", size = 1037239, upload-time = "2026-03-11T22:18:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/d4/81/dc2b7617d5812670d4ff4a42f6dd77926430ee52df0dedb2aec7990b2034/ujson-5.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0d2e8db5ade3736a163906154ca686203acc7d1d30736cbf577c730d13653d84", size = 1196713, upload-time = "2026-03-11T22:18:25.391Z" }, + { url = "https://files.pythonhosted.org/packages/b6/9c/80acff0504f92459ed69e80a176286e32ca0147ac6a8252cd0659aad3227/ujson-5.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93bc91fdadcf046da37a214eaa714574e7e9b1913568e93bb09527b2ceb7f759", size = 1089742, upload-time = "2026-03-11T22:18:26.738Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f1/0ef0eeab1db8493e1833c8b440fe32cf7538f7afa6e7f7c7e9f62cef464d/ujson-5.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:15d416440148f3e56b9b244fdaf8a09fcf5a72e4944b8e119f5bf60417a2bfc8", size = 56331, upload-time = "2026-03-11T22:18:31.539Z" }, + { url = "https://files.pythonhosted.org/packages/b0/2f/9159f6f399b3f572d20847a2b80d133e3a03c14712b0da4971a36879fb64/ujson-5.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0dd3676ea0837cd70ea1879765e9e9f6be063be0436de9b3ea4b775caf83654", size = 53910, upload-time = "2026-03-11T22:18:32.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a9/f96376818d71495d1a4be19a0ab6acf0cc01dd8826553734c3d4dac685b2/ujson-5.12.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7bbf05c38debc90d1a195b11340cc85cb43ab3e753dc47558a3a84a38cbc72da", size = 57757, upload-time = "2026-03-11T22:18:33.866Z" }, + { url = "https://files.pythonhosted.org/packages/98/8d/dd4a151caac6fdcb77f024fbe7f09d465ebf347a628ed6dd581a0a7f6364/ujson-5.12.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:3c2f947e55d3c7cfe124dd4521ee481516f3007d13c6ad4bf6aeb722e190eb1b", size = 59940, upload-time = "2026-03-11T22:18:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/c7/17/0d36c2fee0a8d8dc37b011ccd5bbdcfaff8b8ec2bcfc5be998661cdc935b/ujson-5.12.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ea6206043385343aff0b7da65cf73677f6f5e50de8f1c879e557f4298cac36a", size = 57465, upload-time = "2026-03-11T22:18:36.644Z" }, + { url = "https://files.pythonhosted.org/packages/8c/04/b0ee4a4b643a01ba398441da1e357480595edb37c6c94c508dbe0eb9eb60/ujson-5.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb349dbba57c76eec25e5917e07f35aabaf0a33b9e67fc13d188002500106487", size = 1037236, upload-time = "2026-03-11T22:18:37.743Z" }, + { url = "https://files.pythonhosted.org/packages/2d/08/0e7780d0bbb48fe57ded91f550144bcc99c03b5360bf2886dd0dae0ea8f5/ujson-5.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:937794042342006f707837f38d721426b11b0774d327a2a45c0bd389eb750a87", size = 1196717, upload-time = "2026-03-11T22:18:39.101Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4c/e0e34107715bb4dd2d4dcc1ce244d2f074638837adf38aff85a37506efe4/ujson-5.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ad57654570464eb1b040b5c353dee442608e06cff9102b8fcb105565a44c9ed", size = 1089748, upload-time = "2026-03-11T22:18:40.473Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/9a8d693254bada62bfea75a507e014afcfdb6b9d047b6f8dd134bfefaf67/ujson-5.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85833bca01aa5cae326ac759276dc175c5fa3f7b3733b7d543cf27f2df12d1ef", size = 56499, upload-time = "2026-03-11T22:18:45.431Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2d/285a83df8176e18dcd675d1a4cff8f7620f003f30903ea43929406e98986/ujson-5.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d22cad98c2a10bbf6aa083a8980db6ed90d4285a841c4de892890c2b28286ef9", size = 53998, upload-time = "2026-03-11T22:18:47.184Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8b/e2f09e16dabfa91f6a84555df34a4329fa7621e92ed054d170b9054b9bb2/ujson-5.12.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cc80facad240b0c2fb5a633044420878aac87a8e7c348b9486450cba93f27c", size = 57783, upload-time = "2026-03-11T22:18:48.271Z" }, + { url = "https://files.pythonhosted.org/packages/68/fb/ba1d06f3658a0c36d0ab3869ec3914f202bad0a9bde92654e41516c7bb13/ujson-5.12.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:d1831c07bd4dce53c4b666fa846c7eba4b7c414f2e641a4585b7f50b72f502dc", size = 60011, upload-time = "2026-03-11T22:18:49.284Z" }, + { url = "https://files.pythonhosted.org/packages/64/2b/3e322bf82d926d9857206cd5820438d78392d1f523dacecb8bd899952f73/ujson-5.12.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e00cec383eab2406c9e006bd4edb55d284e94bb943fda558326048178d26961", size = 57465, upload-time = "2026-03-11T22:18:50.584Z" }, + { url = "https://files.pythonhosted.org/packages/e9/fd/af72d69603f9885e5136509a529a4f6d88bf652b457263ff96aefcd3ab7d/ujson-5.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f19b3af31d02a2e79c5f9a6deaab0fb3c116456aeb9277d11720ad433de6dfc6", size = 1037275, upload-time = "2026-03-11T22:18:51.998Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a7/a2411ec81aef7872578e56304c3e41b3a544a9809e95c8e1df46923fc40b/ujson-5.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bacbd3c69862478cbe1c7ed4325caedec580d8acf31b8ee1b9a1e02a56295cad", size = 1196758, upload-time = "2026-03-11T22:18:53.548Z" }, + { url = "https://files.pythonhosted.org/packages/ed/85/aa18ae175dd03a118555aa14304d4f466f9db61b924c97c6f84388ecacb1/ujson-5.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94c5f1621cbcab83c03be46441f090b68b9f307b6c7ec44d4e3f6d5997383df4", size = 1089760, upload-time = "2026-03-11T22:18:55.336Z" }, + { url = "https://files.pythonhosted.org/packages/c3/71/9b4dacb177d3509077e50497222d39eec04c8b41edb1471efc764d645237/ujson-5.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ddb08b3c2f9213df1f2e3eb2fbea4963d80ec0f8de21f0b59898e34f3b3d96d", size = 56845, upload-time = "2026-03-11T22:18:59.629Z" }, + { url = "https://files.pythonhosted.org/packages/24/c2/8abffa3be1f3d605c4a62445fab232b3e7681512ce941c6b23014f404d36/ujson-5.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a3ae28f0b209be5af50b54ca3e2123a3de3a57d87b75f1e5aa3d7961e041983", size = 54463, upload-time = "2026-03-11T22:19:00.697Z" }, + { url = "https://files.pythonhosted.org/packages/db/2e/60114a35d1d6796eb428f7affcba00a921831ff604a37d9142c3d8bbe5c5/ujson-5.12.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30ad4359413c8821cc7b3707f7ca38aa8bc852ba3b9c5a759ee2d7740157315", size = 58689, upload-time = "2026-03-11T22:19:01.739Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ad/010925c2116c21ce119f9c2ff18d01f48a19ade3ff4c5795da03ce5829fc/ujson-5.12.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:02f93da7a4115e24f886b04fd56df1ee8741c2ce4ea491b7ab3152f744ad8f8e", size = 60618, upload-time = "2026-03-11T22:19:03.101Z" }, + { url = "https://files.pythonhosted.org/packages/9b/74/db7f638bf20282b1dccf454386cbd483faaaed3cdbb9cb27e06f74bb109e/ujson-5.12.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ff4ede90ed771140caa7e1890de17431763a483c54b3c1f88bd30f0cc1affc0", size = 58151, upload-time = "2026-03-11T22:19:04.175Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7e/3ebaecfa70a2e8ce623db8e21bd5cb05d42a5ef943bcbb3309d71b5de68d/ujson-5.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bf9cc97f05048ac8f3e02cd58f0fe62b901453c24345bfde287f4305dcc31c", size = 1038117, upload-time = "2026-03-11T22:19:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/2e/aa/e073eda7f0036c2973b28db7bb99faba17a932e7b52d801f9bb3e726271f/ujson-5.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2324d9a0502317ffc35d38e153c1b2fa9610ae03775c9d0f8d0cca7b8572b04e", size = 1197434, upload-time = "2026-03-11T22:19:06.92Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/b9a13f058fdd50c746b192c4447ca8d6352e696dcda912ccee10f032ff85/ujson-5.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:50524f4f6a1c839714dbaff5386a1afb245d2d5ec8213a01fbc99cea7307811e", size = 1090401, upload-time = "2026-03-11T22:19:08.383Z" }, + { url = "https://files.pythonhosted.org/packages/95/3c/5ee154d505d1aad2debc4ba38b1a60ae1949b26cdb5fa070e85e320d6b64/ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:bf85a00ac3b56a1e7a19c5be7b02b5180a0895ac4d3c234d717a55e86960691c", size = 54494, upload-time = "2026-03-11T22:19:13.035Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b3/9496ec399ec921e434a93b340bd5052999030b7ac364be4cbe5365ac6b20/ujson-5.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:64df53eef4ac857eb5816a56e2885ccf0d7dff6333c94065c93b39c51063e01d", size = 57999, upload-time = "2026-03-11T22:19:14.385Z" }, + { url = "https://files.pythonhosted.org/packages/0e/da/e9ae98133336e7c0d50b43626c3f2327937cecfa354d844e02ac17379ed1/ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c0aed6a4439994c9666fb8a5b6c4eac94d4ef6ddc95f9b806a599ef83547e3b", size = 54518, upload-time = "2026-03-11T22:19:15.4Z" }, + { url = "https://files.pythonhosted.org/packages/58/10/978d89dded6bb1558cd46ba78f4351198bd2346db8a8ee1a94119022ce40/ujson-5.12.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efae5df7a8cc8bdb1037b0f786b044ce281081441df5418c3a0f0e1f86fe7bb3", size = 55736, upload-time = "2026-03-11T22:19:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/19/fa/f4a957dddb99bd68c8be91928c0b6fefa7aa8aafc92c93f5d1e8b32f6702/ujson-5.12.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:871c0e5102e47995b0e37e8df7819a894a6c3da0d097545cd1f9f1f7d7079927", size = 52145, upload-time = "2026-03-11T22:19:18.566Z" }, + { url = "https://files.pythonhosted.org/packages/55/6e/50b5cf612de1ca06c7effdc5a5d7e815774dee85a5858f1882c425553b82/ujson-5.12.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:56ba3f7abbd6b0bb282a544dc38406d1a188d8bb9164f49fdb9c2fee62cb29da", size = 49577, upload-time = "2026-03-11T22:19:19.627Z" }, + { url = "https://files.pythonhosted.org/packages/6e/24/b6713fa9897774502cd4c2d6955bb4933349f7d84c3aa805531c382a4209/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c5a52987a990eb1bae55f9000994f1afdb0326c154fb089992f839ab3c30688", size = 50807, upload-time = "2026-03-11T22:19:20.778Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/c0e0f7901180ef80d16f3a4bccb5dc8b01515a717336a62928963a07b80b/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:adf28d13a33f9d750fe7a78fb481cac298fa257d8863d8727b2ea4455ea41235", size = 56972, upload-time = "2026-03-11T22:19:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/02/a9/05d91b4295ea7239151eb08cf240e5a2ba969012fda50bc27bcb1ea9cd71/ujson-5.12.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51acc750ec7a2df786cdc868fb16fa04abd6269a01d58cf59bafc57978773d8e", size = 52045, upload-time = "2026-03-11T22:19:22.879Z" }, +] + [[package]] name = "uritemplate" version = "4.2.0" @@ -4192,66 +5318,49 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, -] - -[[package]] -name = "uv" -version = "0.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dc/4a0e01bcb38c756130c8118a8561d4bf0a0bb685b70ad11e8f40a0cbfa10/uv-0.9.3.tar.gz", hash = "sha256:a290a1a8783bf04ca2d4a63d5d72191b255dfa4cc3426a9c9b5af4da49a7b5af", size = 3699151, upload-time = "2025-10-15T15:20:15.498Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/ad/194e550062e4b3b9a74cb06401dc0afd83490af8e2ec0f414737868d0262/uv-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7b1b79dd435ade1de97c6f0b8b90811a6ccf1bd0bdd70f4d034a93696cf0d0a3", size = 20584531, upload-time = "2025-10-15T15:19:14.26Z" }, - { url = "https://files.pythonhosted.org/packages/d0/1a/8e68d0020c29f6f329a265773c23b0c01e002794ea884b8bdbd594c7ea97/uv-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:596a982c5a061d58412824a2ebe2960b52db23f1b1658083ba9c0e7ae390308a", size = 19577639, upload-time = "2025-10-15T15:19:18.668Z" }, - { url = "https://files.pythonhosted.org/packages/16/25/6df8be6cd549200e80d19374579689fda39b18735afde841345284fb113d/uv-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:741e80c4230e1b9a5d0869aca2fb082b3832b251ef61537bc9278364b8e74df2", size = 18210073, upload-time = "2025-10-15T15:19:22.16Z" }, - { url = "https://files.pythonhosted.org/packages/07/19/bb8aa38b4441e03c742e71a31779f91b42d9db255ede66f80cdfdb672618/uv-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:406ab1a8b313b4b3cf67ad747fb8713a0c0cf3d3daf11942b5a4e49f60882339", size = 20022427, upload-time = "2025-10-15T15:19:25.453Z" }, - { url = "https://files.pythonhosted.org/packages/40/15/f190004dd855b443cfc1cc36edb1765e6cd0b6b340a50bb8015531dfff2e/uv-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73dbd91581a82e53bb4352243d7bc491cf78ac3ebb951d95bb8b7964e5ee0659", size = 20150307, upload-time = "2025-10-15T15:19:28.99Z" }, - { url = "https://files.pythonhosted.org/packages/dd/55/553e90bc2b881f168de9cd57f9e0b0464304a12aee289e71b54c42559e1a/uv-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:970ac8428678b92eddb990dc132d75e893234bb1b809e87b90a4acd96bb054e4", size = 21152942, upload-time = "2025-10-15T15:19:32.461Z" }, - { url = "https://files.pythonhosted.org/packages/30/fb/768647a31622c2c1da7a9394eaab937e2e7ca0e8c983ca3d1918ec623620/uv-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:32694e64d6e4ea44b647866c4240659f3964b0317e98f539b73915dbcca7d973", size = 22632018, upload-time = "2025-10-15T15:19:36.091Z" }, - { url = "https://files.pythonhosted.org/packages/98/92/66d660414aed123686bf9a2a3ea167967b847b97c08cacd13d6b2b6d1267/uv-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36df7eb562b103e3263a03df1b04cee91ee52af88d005d07ee494137c7a5782a", size = 22241856, upload-time = "2025-10-15T15:19:39.662Z" }, - { url = "https://files.pythonhosted.org/packages/0d/99/af8b0cd2c958e8cb9c20e6e2d417de9476338a2b155643492a8ee2baf077/uv-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:117c5921bcfdac04b88211ee830c6c7e412eaf93a34aa3ad4bb3230bc61646aa", size = 21391699, upload-time = "2025-10-15T15:19:42.933Z" }, - { url = "https://files.pythonhosted.org/packages/82/45/488417c6c0127c00bcdfac3556ae2ea0597df8245fe5f9bcfda35ebdbe85/uv-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ae4bbc7d555ba1738da08c64b55f21ab0ea0ff85636708cebaf460d98a440d", size = 21318117, upload-time = "2025-10-15T15:19:46.341Z" }, - { url = "https://files.pythonhosted.org/packages/1d/62/508c20f8dbdd2342cc4821ab6f41e29a9b36e2a469dfb5cbbd042e15218c/uv-0.9.3-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2e75ce14c9375e7e99422d5383fb415e8f0eab9ebdcdfba45756749dee0c42b2", size = 20132999, upload-time = "2025-10-15T15:19:49.578Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fc/ea673d1c68915ea53f1ab7e134b330a2351c543f06e9d0009b4f27cc3057/uv-0.9.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:71faefa9805ccf3f2db645ae27c9e719e47aaa8781e43dfa3760d993aadecb8c", size = 21223810, upload-time = "2025-10-15T15:19:52.711Z" }, - { url = "https://files.pythonhosted.org/packages/97/1f/af8ced7f6c8f6af887c52369088058ecae92ff21819e385531023f9ec923/uv-0.9.3-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:8844103e0b4074821fb2814abf30af59d66f33b6ca1bb2276dd37d4e5997c292", size = 20156823, upload-time = "2025-10-15T15:19:56.552Z" }, - { url = "https://files.pythonhosted.org/packages/05/2d/e1d8f74ec9d95daf57f3c53083c98a2145ee895a4f8502c61c9013c9bf5a/uv-0.9.3-py3-none-musllinux_1_1_i686.whl", hash = "sha256:214bb2fb4d87a55e2ba2bc038a8b646a24ec66980528d2ed1e6e7d0612d246e1", size = 20564971, upload-time = "2025-10-15T15:20:00.012Z" }, - { url = "https://files.pythonhosted.org/packages/bc/04/4aaf90e031f0735795407a208c9528f85b0b27b63409abe4ee3bee0d4527/uv-0.9.3-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:ccf4cd2e1907fb011764f6f4bc0e514c500e8d300288f04a4680400d5aa205ec", size = 21506573, upload-time = "2025-10-15T15:20:03.304Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/76/44a55515e8c9505aa1420aebacf4dd82552e5e15691654894e90d0bd051a/uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f", size = 1442019, upload-time = "2024-10-14T23:37:20.068Z" }, - { url = "https://files.pythonhosted.org/packages/35/5a/62d5800358a78cc25c8a6c72ef8b10851bdb8cca22e14d9c74167b7f86da/uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d", size = 801898, upload-time = "2024-10-14T23:37:22.663Z" }, - { url = "https://files.pythonhosted.org/packages/f3/96/63695e0ebd7da6c741ccd4489b5947394435e198a1382349c17b1146bb97/uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26", size = 3827735, upload-time = "2024-10-14T23:37:25.129Z" }, - { url = "https://files.pythonhosted.org/packages/61/e0/f0f8ec84979068ffae132c58c79af1de9cceeb664076beea86d941af1a30/uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb", size = 3825126, upload-time = "2024-10-14T23:37:27.59Z" }, - { url = "https://files.pythonhosted.org/packages/bf/fe/5e94a977d058a54a19df95f12f7161ab6e323ad49f4dabc28822eb2df7ea/uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f", size = 3705789, upload-time = "2024-10-14T23:37:29.385Z" }, - { url = "https://files.pythonhosted.org/packages/26/dd/c7179618e46092a77e036650c1f056041a028a35c4d76945089fcfc38af8/uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c", size = 3800523, upload-time = "2024-10-14T23:37:32.048Z" }, - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, ] [[package]] @@ -4264,56 +5373,87 @@ wheels = [ ] [[package]] -name = "virtualenv" -version = "20.34.0" +name = "watchfiles" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "distlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, + { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] - -[[package]] -name = "watchdog" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, ] [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, ] [[package]] @@ -4327,11 +5467,11 @@ wheels = [ [[package]] name = "whitenoise" -version = "6.11.0" +version = "6.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/95/8c81ec6b6ebcbf8aca2de7603070ccf37dbb873b03f20708e0f7c1664bc6/whitenoise-6.11.0.tar.gz", hash = "sha256:0f5bfce6061ae6611cd9396a8231e088722e4fc67bc13a111be74c738d99375f", size = 26432, upload-time = "2025-09-18T09:16:10.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/2a/55b3f3a4ec326cd077c1c3defeee656b9298372a69229134d930151acd01/whitenoise-6.12.0.tar.gz", hash = "sha256:f723ebb76a112e98816ff80fcea0a6c9b8ecde835f8ddda25df7a30a3c2db6ad", size = 26841, upload-time = "2026-02-27T00:05:42.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/e9/4366332f9295fe0647d7d3251ce18f5615fbcb12d02c79a26f8dba9221b3/whitenoise-6.11.0-py3-none-any.whl", hash = "sha256:b2aeb45950597236f53b5342b3121c5de69c8da0109362aee506ce88e022d258", size = 20197, upload-time = "2025-09-18T09:16:09.754Z" }, + { url = "https://files.pythonhosted.org/packages/db/eb/d5583a11486211f3ebd4b385545ae787f32363d453c19fffd81106c9c138/whitenoise-6.12.0-py3-none-any.whl", hash = "sha256:fc5e8c572e33ebf24795b47b6a7da8da3c00cff2349f5b04c02f28d0cc5a3cc2", size = 20302, upload-time = "2026-02-27T00:05:40.086Z" }, ] [[package]] @@ -4348,81 +5488,211 @@ wheels = [ [[package]] name = "wrapt" -version = "1.17.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/23/bb82321b86411eb51e5a5db3fb8f8032fd30bd7c2d74bfe936136b2fa1d6/wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04", size = 53482, upload-time = "2025-08-12T05:51:44.467Z" }, - { url = "https://files.pythonhosted.org/packages/45/69/f3c47642b79485a30a59c63f6d739ed779fb4cc8323205d047d741d55220/wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2", size = 38676, upload-time = "2025-08-12T05:51:32.636Z" }, - { url = "https://files.pythonhosted.org/packages/d1/71/e7e7f5670c1eafd9e990438e69d8fb46fa91a50785332e06b560c869454f/wrapt-1.17.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd341868a4b6714a5962c1af0bd44f7c404ef78720c7de4892901e540417111c", size = 38957, upload-time = "2025-08-12T05:51:54.655Z" }, - { url = "https://files.pythonhosted.org/packages/de/17/9f8f86755c191d6779d7ddead1a53c7a8aa18bccb7cea8e7e72dfa6a8a09/wrapt-1.17.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9b2601381be482f70e5d1051a5965c25fb3625455a2bf520b5a077b22afb775", size = 81975, upload-time = "2025-08-12T05:52:30.109Z" }, - { url = "https://files.pythonhosted.org/packages/f2/15/dd576273491f9f43dd09fce517f6c2ce6eb4fe21681726068db0d0467096/wrapt-1.17.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343e44b2a8e60e06a7e0d29c1671a0d9951f59174f3709962b5143f60a2a98bd", size = 83149, upload-time = "2025-08-12T05:52:09.316Z" }, - { url = "https://files.pythonhosted.org/packages/0c/c4/5eb4ce0d4814521fee7aa806264bf7a114e748ad05110441cd5b8a5c744b/wrapt-1.17.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33486899acd2d7d3066156b03465b949da3fd41a5da6e394ec49d271baefcf05", size = 82209, upload-time = "2025-08-12T05:52:10.331Z" }, - { url = "https://files.pythonhosted.org/packages/31/4b/819e9e0eb5c8dc86f60dfc42aa4e2c0d6c3db8732bce93cc752e604bb5f5/wrapt-1.17.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e6f40a8aa5a92f150bdb3e1c44b7e98fb7113955b2e5394122fa5532fec4b418", size = 81551, upload-time = "2025-08-12T05:52:31.137Z" }, - { url = "https://files.pythonhosted.org/packages/52/db/00e2a219213856074a213503fdac0511203dceefff26e1daa15250cc01a0/wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7", size = 53482, upload-time = "2025-08-12T05:51:45.79Z" }, - { url = "https://files.pythonhosted.org/packages/5e/30/ca3c4a5eba478408572096fe9ce36e6e915994dd26a4e9e98b4f729c06d9/wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85", size = 38674, upload-time = "2025-08-12T05:51:34.629Z" }, - { url = "https://files.pythonhosted.org/packages/31/25/3e8cc2c46b5329c5957cec959cb76a10718e1a513309c31399a4dad07eb3/wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f", size = 38959, upload-time = "2025-08-12T05:51:56.074Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8f/a32a99fc03e4b37e31b57cb9cefc65050ea08147a8ce12f288616b05ef54/wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311", size = 82376, upload-time = "2025-08-12T05:52:32.134Z" }, - { url = "https://files.pythonhosted.org/packages/31/57/4930cb8d9d70d59c27ee1332a318c20291749b4fba31f113c2f8ac49a72e/wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1", size = 83604, upload-time = "2025-08-12T05:52:11.663Z" }, - { url = "https://files.pythonhosted.org/packages/a8/f3/1afd48de81d63dd66e01b263a6fbb86e1b5053b419b9b33d13e1f6d0f7d0/wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5", size = 82782, upload-time = "2025-08-12T05:52:12.626Z" }, - { url = "https://files.pythonhosted.org/packages/1e/d7/4ad5327612173b144998232f98a85bb24b60c352afb73bc48e3e0d2bdc4e/wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2", size = 82076, upload-time = "2025-08-12T05:52:33.168Z" }, - { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, - { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, - { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, - { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, - { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, - { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, - { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, - { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, - { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, - { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, - { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, - { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, - { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, - { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, - { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, - { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, - { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, - { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, - { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/60/553997acf3939079dab022e37b67b1904b5b0cc235503226898ba573b10c/wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590", size = 77480, upload-time = "2025-11-07T00:43:30.573Z" }, + { url = "https://files.pythonhosted.org/packages/2d/50/e5b3d30895d77c52105c6d5cbf94d5b38e2a3dd4a53d22d246670da98f7c/wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6", size = 60690, upload-time = "2025-11-07T00:43:31.594Z" }, + { url = "https://files.pythonhosted.org/packages/f0/40/660b2898703e5cbbb43db10cdefcc294274458c3ca4c68637c2b99371507/wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7", size = 61578, upload-time = "2025-11-07T00:43:32.918Z" }, + { url = "https://files.pythonhosted.org/packages/5b/36/825b44c8a10556957bc0c1d84c7b29a40e05fcf1873b6c40aa9dbe0bd972/wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28", size = 114115, upload-time = "2025-11-07T00:43:35.605Z" }, + { url = "https://files.pythonhosted.org/packages/83/73/0a5d14bb1599677304d3c613a55457d34c344e9b60eda8a737c2ead7619e/wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb", size = 116157, upload-time = "2025-11-07T00:43:37.058Z" }, + { url = "https://files.pythonhosted.org/packages/01/22/1c158fe763dbf0a119f985d945711d288994fe5514c0646ebe0eb18b016d/wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c", size = 112535, upload-time = "2025-11-07T00:43:34.138Z" }, + { url = "https://files.pythonhosted.org/packages/5c/28/4f16861af67d6de4eae9927799b559c20ebdd4fe432e89ea7fe6fcd9d709/wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16", size = 115404, upload-time = "2025-11-07T00:43:39.214Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8b/7960122e625fad908f189b59c4aae2d50916eb4098b0fb2819c5a177414f/wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2", size = 111802, upload-time = "2025-11-07T00:43:40.476Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/7881eee5ac31132a713ab19a22c9e5f1f7365c8b1df50abba5d45b781312/wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd", size = 113837, upload-time = "2025-11-07T00:43:42.921Z" }, + { url = "https://files.pythonhosted.org/packages/cb/73/8cb252858dc8254baa0ce58ce382858e3a1cf616acebc497cb13374c95c6/wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c", size = 78129, upload-time = "2025-11-07T00:43:48.852Z" }, + { url = "https://files.pythonhosted.org/packages/19/42/44a0db2108526ee6e17a5ab72478061158f34b08b793df251d9fbb9a7eb4/wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841", size = 61205, upload-time = "2025-11-07T00:43:50.402Z" }, + { url = "https://files.pythonhosted.org/packages/4d/8a/5b4b1e44b791c22046e90d9b175f9a7581a8cc7a0debbb930f81e6ae8e25/wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62", size = 61692, upload-time = "2025-11-07T00:43:51.678Z" }, + { url = "https://files.pythonhosted.org/packages/11/53/3e794346c39f462bcf1f58ac0487ff9bdad02f9b6d5ee2dc84c72e0243b2/wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf", size = 121492, upload-time = "2025-11-07T00:43:55.017Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/10b7b0e8841e684c8ca76b462a9091c45d62e8f2de9c4b1390b690eadf16/wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9", size = 123064, upload-time = "2025-11-07T00:43:56.323Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d1/3c1e4321fc2f5ee7fd866b2d822aa89b84495f28676fd976c47327c5b6aa/wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b", size = 117403, upload-time = "2025-11-07T00:43:53.258Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b0/d2f0a413cf201c8c2466de08414a15420a25aa83f53e647b7255cc2fab5d/wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba", size = 121500, upload-time = "2025-11-07T00:43:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/bd/45/bddb11d28ca39970a41ed48a26d210505120f925918592283369219f83cc/wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684", size = 116299, upload-time = "2025-11-07T00:43:58.877Z" }, + { url = "https://files.pythonhosted.org/packages/81/af/34ba6dd570ef7a534e7eec0c25e2615c355602c52aba59413411c025a0cb/wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb", size = 120622, upload-time = "2025-11-07T00:43:59.962Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/41af4c46b5e498c90fc87981ab2972fbd9f0bccda597adb99d3d3441b94b/wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9", size = 78132, upload-time = "2025-11-07T00:44:04.628Z" }, + { url = "https://files.pythonhosted.org/packages/1c/92/d68895a984a5ebbbfb175512b0c0aad872354a4a2484fbd5552e9f275316/wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f", size = 61211, upload-time = "2025-11-07T00:44:05.626Z" }, + { url = "https://files.pythonhosted.org/packages/e8/26/ba83dc5ae7cf5aa2b02364a3d9cf74374b86169906a1f3ade9a2d03cf21c/wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218", size = 61689, upload-time = "2025-11-07T00:44:06.719Z" }, + { url = "https://files.pythonhosted.org/packages/cf/67/d7a7c276d874e5d26738c22444d466a3a64ed541f6ef35f740dbd865bab4/wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9", size = 121502, upload-time = "2025-11-07T00:44:09.557Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c", size = 123110, upload-time = "2025-11-07T00:44:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/e5/08/cdbb965fbe4c02c5233d185d070cabed2ecc1f1e47662854f95d77613f57/wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db", size = 117434, upload-time = "2025-11-07T00:44:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/6aae2ce39db4cb5216302fa2e9577ad74424dfbe315bd6669725569e048c/wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233", size = 121533, upload-time = "2025-11-07T00:44:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/565abf57559fbe0a9155c29879ff43ce8bd28d2ca61033a3a3dd67b70794/wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2", size = 116324, upload-time = "2025-11-07T00:44:13.28Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e0/53ff5e76587822ee33e560ad55876d858e384158272cd9947abdd4ad42ca/wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b", size = 120627, upload-time = "2025-11-07T00:44:14.431Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f4/eff2b7d711cae20d220780b9300faa05558660afb93f2ff5db61fe725b9a/wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3", size = 82028, upload-time = "2025-11-07T00:44:18.944Z" }, + { url = "https://files.pythonhosted.org/packages/0c/67/cb945563f66fd0f61a999339460d950f4735c69f18f0a87ca586319b1778/wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1", size = 62949, upload-time = "2025-11-07T00:44:20.074Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ca/f63e177f0bbe1e5cf5e8d9b74a286537cd709724384ff20860f8f6065904/wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d", size = 63681, upload-time = "2025-11-07T00:44:21.345Z" }, + { url = "https://files.pythonhosted.org/packages/39/a1/1b88fcd21fd835dca48b556daef750952e917a2794fa20c025489e2e1f0f/wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7", size = 152696, upload-time = "2025-11-07T00:44:24.318Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/d9185500c1960d9f5f77b9c0b890b7fc62282b53af7ad1b6bd779157f714/wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3", size = 158859, upload-time = "2025-11-07T00:44:25.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/60/5d796ed0f481ec003220c7878a1d6894652efe089853a208ea0838c13086/wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b", size = 146068, upload-time = "2025-11-07T00:44:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/04/f8/75282dd72f102ddbfba137e1e15ecba47b40acff32c08ae97edbf53f469e/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10", size = 155724, upload-time = "2025-11-07T00:44:26.634Z" }, + { url = "https://files.pythonhosted.org/packages/5a/27/fe39c51d1b344caebb4a6a9372157bdb8d25b194b3561b52c8ffc40ac7d1/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf", size = 144413, upload-time = "2025-11-07T00:44:27.939Z" }, + { url = "https://files.pythonhosted.org/packages/83/2b/9f6b643fe39d4505c7bf926d7c2595b7cb4b607c8c6b500e56c6b36ac238/wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e", size = 150325, upload-time = "2025-11-07T00:44:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload-time = "2025-11-07T00:44:34.691Z" }, + { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload-time = "2025-11-07T00:44:35.762Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload-time = "2025-11-07T00:44:37.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload-time = "2025-11-07T00:44:39.425Z" }, + { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload-time = "2025-11-07T00:44:40.582Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload-time = "2025-11-07T00:44:38.313Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload-time = "2025-11-07T00:44:41.69Z" }, + { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload-time = "2025-11-07T00:44:43.013Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload-time = "2025-11-07T00:44:44.523Z" }, + { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload-time = "2025-11-07T00:44:49.4Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload-time = "2025-11-07T00:44:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload-time = "2025-11-07T00:44:52.248Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload-time = "2025-11-07T00:44:54.613Z" }, + { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload-time = "2025-11-07T00:44:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload-time = "2025-11-07T00:44:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload-time = "2025-11-07T00:44:56.971Z" }, + { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload-time = "2025-11-07T00:44:58.515Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload-time = "2025-11-07T00:44:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "multidict", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "propcache", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, + { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, + { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, + { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] + +[[package]] +name = "zensical" +version = "0.0.26" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "deepmerge", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/1f/0a0b1ce8e0553a9dabaedc736d0f34b11fc33d71ff46bce44d674996d41f/zensical-0.0.26.tar.gz", hash = "sha256:f4d9c8403df25fbb3d6dd9577122dc2f23c73a2d16ab778bb7d40370dd71e987", size = 3841473, upload-time = "2026-03-11T09:51:38.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/58/fa3d9538ff1ea8cf4a193edbf47254f374fa7983fcfa876bb4336d72c53a/zensical-0.0.26-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7823b25afe7d36099253aa59d643abaac940f80fd015d4a37954210c87d3da56", size = 12263607, upload-time = "2026-03-11T09:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6e/44a3b21bd3569b9cad203364d73a956768d28a879e4c2be91bd889f74d2c/zensical-0.0.26-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c0254814382cdd3769bc7689180d09bf41de8879871dd736dc52d5f141e8ada7", size = 12144562, upload-time = "2026-03-11T09:50:53.685Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/31b9885745b3e7ef23a3ae7f175b879807288d11b3fb7e2d3c119c916258/zensical-0.0.26-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8e601b2bbd239e564b04cf235eefb9777e7dfc7e1857b8871d6cdcfb577aa0", size = 12506728, upload-time = "2026-03-11T09:50:57.775Z" }, + { url = "https://files.pythonhosted.org/packages/bd/93/f5291e2c47076474f181f6eef35ef0428117d3f192da4358c0511e2ce09e/zensical-0.0.26-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2dc43c7e6c25d9724fc0450f0273ca4e5e2506eeb7f89f52f1405a592896ca3b", size = 12454975, upload-time = "2026-03-11T09:51:01.514Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2e/61cac4f2ebad31dab768eb02753ffde9e56d4d34b8f876b949bf516fbd50/zensical-0.0.26-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ed236d1254cc474c19227eaa3670a1ccf921af53134ec5542b05853bdcd59c", size = 12791930, upload-time = "2026-03-11T09:51:05.162Z" }, + { url = "https://files.pythonhosted.org/packages/02/86/51995d1ed2dd6ad8a1a70bcdf3c5eb16b50e62ea70e638d454a6b9061c4d/zensical-0.0.26-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1110147710d1dd025d932c4a7eada836bdf079c91b70fb0ae5b202e14b094617", size = 12548166, upload-time = "2026-03-11T09:51:09.218Z" }, + { url = "https://files.pythonhosted.org/packages/3d/93/decbafdbfc77170cbc3851464632390846e9aaf45e743c8dd5a24d5673e9/zensical-0.0.26-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7d21596a785428cdebc20859bd94a05334abe14ad24f1bb9cd80d19219e3c220", size = 12682103, upload-time = "2026-03-11T09:51:12.68Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e2/391d2d08dde621177da069a796a886b549fefb15734aeeb6e696af99b662/zensical-0.0.26-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:680a3c7bb71499b4da784d6072e44b3d7b8c0df3ce9bbd9974e24bd8058c2736", size = 12724219, upload-time = "2026-03-11T09:51:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/80/2a/21b40c5c40a67da8a841f278d61dbd8d5e035e489de6fe1cef5f4e211b4f/zensical-0.0.26-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:e3294a79f98218b6fc2219232e166aa0932ae4dad58f6c8dbc0dbe0ecbff9c25", size = 12862117, upload-time = "2026-03-11T09:51:22.161Z" }, + { url = "https://files.pythonhosted.org/packages/51/76/e1910d6d75d207654c867b8efbda6822dedda9fed3601bf4a864a1f4fe26/zensical-0.0.26-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:630229587df1fb47be184a4a69d0772ce59a44cd2c481ae9f7e8852fffaff11e", size = 12815714, upload-time = "2026-03-11T09:51:26.24Z" }, ] [[package]] name = "zope-interface" -version = "8.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/3a/7fcf02178b8fad0a51e67e32765cd039ae505d054d744d76b8c2bbcba5ba/zope_interface-8.0.1.tar.gz", hash = "sha256:eba5610d042c3704a48222f7f7c6ab5b243ed26f917e2bc69379456b115e02d1", size = 253746, upload-time = "2025-09-25T05:55:51.285Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/e5/ffef169d17b92c6236b3b18b890c0ce73502f3cbd5b6532ff20d412d94a3/zope_interface-8.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fd7195081b8637eeed8d73e4d183b07199a1dc738fb28b3de6666b1b55662570", size = 207364, upload-time = "2025-09-25T05:58:50.262Z" }, - { url = "https://files.pythonhosted.org/packages/35/b6/87aca626c09af829d3a32011599d6e18864bc8daa0ad3a7e258f3d7f8bcf/zope_interface-8.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f7c4bc4021108847bce763673ce70d0716b08dfc2ba9889e7bad46ac2b3bb924", size = 207901, upload-time = "2025-09-25T05:58:51.74Z" }, - { url = "https://files.pythonhosted.org/packages/d8/c1/eec33cc9f847ebeb0bc6234d7d45fe3fc0a6fe8fc5b5e6be0442bd2c684d/zope_interface-8.0.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:758803806b962f32c87b31bb18c298b022965ba34fe532163831cc39118c24ab", size = 249358, upload-time = "2025-09-25T05:58:16.979Z" }, - { url = "https://files.pythonhosted.org/packages/58/7d/1e3476a1ef0175559bd8492dc7bb921ad0df5b73861d764b1f824ad5484a/zope_interface-8.0.1-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f8e88f35f86bbe8243cad4b2972deef0fdfca0a0723455abbebdc83bbab96b69", size = 254475, upload-time = "2025-09-25T05:58:10.032Z" }, - { url = "https://files.pythonhosted.org/packages/bc/67/ba5ea98ff23f723c5cbe7db7409f2e43c9fe2df1ced67881443c01e64478/zope_interface-8.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7844765695937d9b0d83211220b72e2cf6ac81a08608ad2b58f2c094af498d83", size = 254913, upload-time = "2025-09-25T06:26:22.263Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/c10c739bcb9b072090c97c2e08533777497190daa19d190d72b4cce9c7cb/zope_interface-8.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4bd01022d2e1bce4a4a4ed9549edb25393c92e607d7daa6deff843f1f68b479d", size = 207903, upload-time = "2025-09-25T05:58:21.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e1/9845ac3697f108d9a1af6912170c59a23732090bbfb35955fe77e5544955/zope_interface-8.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:29be8db8b712d94f1c05e24ea230a879271d787205ba1c9a6100d1d81f06c69a", size = 208345, upload-time = "2025-09-25T05:58:24.217Z" }, - { url = "https://files.pythonhosted.org/packages/f2/49/6573bc8b841cfab18e80c8e8259f1abdbbf716140011370de30231be79ad/zope_interface-8.0.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:51ae1b856565b30455b7879fdf0a56a88763b401d3f814fa9f9542d7410dbd7e", size = 255027, upload-time = "2025-09-25T05:58:19.975Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fd/908b0fd4b1ab6e412dfac9bd2b606f2893ef9ba3dd36d643f5e5b94c57b3/zope_interface-8.0.1-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d2e7596149cb1acd1d4d41b9f8fe2ffc0e9e29e2e91d026311814181d0d9efaf", size = 259800, upload-time = "2025-09-25T05:58:11.487Z" }, - { url = "https://files.pythonhosted.org/packages/dc/78/8419a2b4e88410520ed4b7f93bbd25a6d4ae66c4e2b131320f2b90f43077/zope_interface-8.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2737c11c34fb9128816759864752d007ec4f987b571c934c30723ed881a7a4f", size = 260978, upload-time = "2025-09-25T06:26:24.483Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a6/0f08713ddda834c428ebf97b2a7fd8dea50c0100065a8955924dbd94dae8/zope_interface-8.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:115f27c1cc95ce7a517d960ef381beedb0a7ce9489645e80b9ab3cbf8a78799c", size = 208609, upload-time = "2025-09-25T05:58:53.698Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5e/d423045f54dc81e0991ec655041e7a0eccf6b2642535839dd364b35f4d7f/zope_interface-8.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af655c573b84e3cb6a4f6fd3fbe04e4dc91c63c6b6f99019b3713ef964e589bc", size = 208797, upload-time = "2025-09-25T05:58:56.258Z" }, - { url = "https://files.pythonhosted.org/packages/c6/43/39d4bb3f7a80ebd261446792493cfa4e198badd47107224f5b6fe1997ad9/zope_interface-8.0.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:23f82ef9b2d5370750cc1bf883c3b94c33d098ce08557922a3fbc7ff3b63dfe1", size = 259242, upload-time = "2025-09-25T05:58:21.602Z" }, - { url = "https://files.pythonhosted.org/packages/da/29/49effcff64ef30731e35520a152a9dfcafec86cf114b4c2aff942e8264ba/zope_interface-8.0.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35a1565d5244997f2e629c5c68715b3d9d9036e8df23c4068b08d9316dcb2822", size = 264696, upload-time = "2025-09-25T05:58:13.351Z" }, - { url = "https://files.pythonhosted.org/packages/c7/39/b947673ec9a258eeaa20208dd2f6127d9fbb3e5071272a674ebe02063a78/zope_interface-8.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:029ea1db7e855a475bf88d9910baab4e94d007a054810e9007ac037a91c67c6f", size = 264229, upload-time = "2025-09-25T06:26:26.226Z" }, - { url = "https://files.pythonhosted.org/packages/5f/dc/3c12fca01c910c793d636ffe9c0984e0646abaf804e44552070228ed0ede/zope_interface-8.0.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:c7cc027fc5c61c5d69e5080c30b66382f454f43dc379c463a38e78a9c6bab71a", size = 208992, upload-time = "2025-09-25T05:58:40.712Z" }, - { url = "https://files.pythonhosted.org/packages/46/71/6127b7282a3e380ca927ab2b40778a9c97935a4a57a2656dadc312db5f30/zope_interface-8.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcf9097ff3003b7662299f1c25145e15260ec2a27f9a9e69461a585d79ca8552", size = 209051, upload-time = "2025-09-25T05:58:42.182Z" }, - { url = "https://files.pythonhosted.org/packages/56/86/4387a9f951ee18b0e41fda77da77d59c33e59f04660578e2bad688703e64/zope_interface-8.0.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6d965347dd1fb9e9a53aa852d4ded46b41ca670d517fd54e733a6b6a4d0561c2", size = 259223, upload-time = "2025-09-25T05:58:23.191Z" }, - { url = "https://files.pythonhosted.org/packages/61/08/ce60a114466abc067c68ed41e2550c655f551468ae17b4b17ea360090146/zope_interface-8.0.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9a3b8bb77a4b89427a87d1e9eb969ab05e38e6b4a338a9de10f6df23c33ec3c2", size = 264690, upload-time = "2025-09-25T05:58:15.052Z" }, - { url = "https://files.pythonhosted.org/packages/36/9a/62a9ba3a919594605a07c34eee3068659bbd648e2fa0c4a86d876810b674/zope_interface-8.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:87e6b089002c43231fb9afec89268391bcc7a3b66e76e269ffde19a8112fb8d5", size = 264201, upload-time = "2025-09-25T06:26:27.797Z" }, +version = "8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/a4/77daa5ba398996d16bb43fc721599d27d03eae68fe3c799de1963c72e228/zope_interface-8.2.tar.gz", hash = "sha256:afb20c371a601d261b4f6edb53c3c418c249db1a9717b0baafc9a9bb39ba1224", size = 254019, upload-time = "2026-01-09T07:51:07.253Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/97/9c2aa8caae79915ed64eb114e18816f178984c917aa9adf2a18345e4f2e5/zope_interface-8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c65ade7ea85516e428651048489f5e689e695c79188761de8c622594d1e13322", size = 208081, upload-time = "2026-01-09T08:05:06.623Z" }, + { url = "https://files.pythonhosted.org/packages/34/86/4e2fcb01a8f6780ac84923748e450af0805531f47c0956b83065c99ab543/zope_interface-8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1ef4b43659e1348f35f38e7d1a6bbc1682efde239761f335ffc7e31e798b65b", size = 208522, upload-time = "2026-01-09T08:05:07.986Z" }, + { url = "https://files.pythonhosted.org/packages/f6/eb/08e277da32ddcd4014922854096cf6dcb7081fad415892c2da1bedefbf02/zope_interface-8.2-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:dfc4f44e8de2ff4eba20af4f0a3ca42d3c43ab24a08e49ccd8558b7a4185b466", size = 255198, upload-time = "2026-01-09T08:05:09.532Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a1/b32484f3281a5dc83bc713ad61eca52c543735cdf204543172087a074a74/zope_interface-8.2-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8f094bfb49179ec5dc9981cb769af1275702bd64720ef94874d9e34da1390d4c", size = 259970, upload-time = "2026-01-09T08:05:11.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/bca0e8ae1e487d4093a8a7cfed2118aa2d4758c8cfd66e59d2af09d71f1c/zope_interface-8.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d2bb8e7364e18f083bf6744ccf30433b2a5f236c39c95df8514e3c13007098ce", size = 261153, upload-time = "2026-01-09T08:05:13.402Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a0/1e1fabbd2e9c53ef92b69df6d14f4adc94ec25583b1380336905dc37e9a0/zope_interface-8.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:624b6787fc7c3e45fa401984f6add2c736b70a7506518c3b537ffaacc4b29d4c", size = 208785, upload-time = "2026-01-09T08:05:17.348Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2a/88d098a06975c722a192ef1fb7d623d1b57c6a6997cf01a7aabb45ab1970/zope_interface-8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc9ded9e97a0ed17731d479596ed1071e53b18e6fdb2fc33af1e43f5fd2d3aaa", size = 208976, upload-time = "2026-01-09T08:05:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e8/757398549fdfd2f8c89f32c82ae4d2f0537ae2a5d2f21f4a2f711f5a059f/zope_interface-8.2-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:532367553e4420c80c0fc0cabcc2c74080d495573706f66723edee6eae53361d", size = 259411, upload-time = "2026-01-09T08:05:20.567Z" }, + { url = "https://files.pythonhosted.org/packages/91/af/502601f0395ce84dff622f63cab47488657a04d0065547df42bee3a680ff/zope_interface-8.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2bf9cf275468bafa3c72688aad8cfcbe3d28ee792baf0b228a1b2d93bd1d541a", size = 264859, upload-time = "2026-01-09T08:05:22.234Z" }, + { url = "https://files.pythonhosted.org/packages/89/0c/d2f765b9b4814a368a7c1b0ac23b68823c6789a732112668072fe596945d/zope_interface-8.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0009d2d3c02ea783045d7804da4fd016245e5c5de31a86cebba66dd6914d59a2", size = 264398, upload-time = "2026-01-09T08:05:23.853Z" }, + { url = "https://files.pythonhosted.org/packages/66/47/45188fb101fa060b20e6090e500682398ab415e516a0c228fbb22bc7def2/zope_interface-8.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:6068322004a0158c80dfd4708dfb103a899635408c67c3b10e9acec4dbacefec", size = 209170, upload-time = "2026-01-09T08:05:26.616Z" }, + { url = "https://files.pythonhosted.org/packages/09/03/f6b9336c03c2b48403c4eb73a1ec961d94dc2fb5354c583dfb5fa05fd41f/zope_interface-8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2499de92e8275d0dd68f84425b3e19e9268cd1fa8507997900fa4175f157733c", size = 209229, upload-time = "2026-01-09T08:05:28.521Z" }, + { url = "https://files.pythonhosted.org/packages/07/b1/65fe1dca708569f302ade02e6cdca309eab6752bc9f80105514f5b708651/zope_interface-8.2-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:f777e68c76208503609c83ca021a6864902b646530a1a39abb9ed310d1100664", size = 259393, upload-time = "2026-01-09T08:05:29.897Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a5/97b49cfceb6ed53d3dcfb3f3ebf24d83b5553194f0337fbbb3a9fec6cf78/zope_interface-8.2-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b05a919fdb0ed6ea942e5a7800e09a8b6cdae6f98fee1bef1c9d1a3fc43aaa0", size = 264863, upload-time = "2026-01-09T08:05:31.501Z" }, + { url = "https://files.pythonhosted.org/packages/cb/02/0b7a77292810efe3a0586a505b077ebafd5114e10c6e6e659f0c8e387e1f/zope_interface-8.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ccc62b5712dd7bd64cfba3ee63089fb11e840f5914b990033beeae3b2180b6cb", size = 264369, upload-time = "2026-01-09T08:05:32.941Z" }, + { url = "https://files.pythonhosted.org/packages/1a/da/3c89de3917751446728b8898b4d53318bc2f8f6bf8196e150a063c59905e/zope_interface-8.2-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:46c7e4e8cbc698398a67e56ca985d19cb92365b4aafbeb6a712e8c101090f4cb", size = 209223, upload-time = "2026-01-09T08:05:36.449Z" }, + { url = "https://files.pythonhosted.org/packages/00/7f/62d00ec53f0a6e5df0c984781e6f3999ed265129c4c3413df8128d1e0207/zope_interface-8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a87fc7517f825a97ff4a4ca4c8a950593c59e0f8e7bfe1b6f898a38d5ba9f9cf", size = 209366, upload-time = "2026-01-09T08:05:38.197Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a2/f241986315174be8e00aabecfc2153cf8029c1327cab8ed53a9d979d7e08/zope_interface-8.2-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:ccf52f7d44d669203c2096c1a0c2c15d52e36b2e7a9413df50f48392c7d4d080", size = 261037, upload-time = "2026-01-09T08:05:39.568Z" }, + { url = "https://files.pythonhosted.org/packages/02/cc/b321c51d6936ede296a1b8860cf173bee2928357fe1fff7f97234899173f/zope_interface-8.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aae807efc7bd26302eb2fea05cd6de7d59269ed6ae23a6de1ee47add6de99b8c", size = 264219, upload-time = "2026-01-09T08:05:41.624Z" }, + { url = "https://files.pythonhosted.org/packages/ab/fb/5f5e7b40a2f4efd873fe173624795ca47eaa22e29051270c981361b45209/zope_interface-8.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05a0e42d6d830f547e114de2e7cd15750dc6c0c78f8138e6c5035e51ddfff37c", size = 264390, upload-time = "2026-01-09T08:05:42.936Z" }, ] [[package]] @@ -4431,20 +5701,6 @@ version = "0.25.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" }, - { url = "https://files.pythonhosted.org/packages/96/34/ef34ef77f1ee38fc8e4f9775217a613b452916e633c4f1d98f31db52c4a5/zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7", size = 640565, upload-time = "2025-09-14T22:15:58.177Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1b/4fdb2c12eb58f31f28c4d28e8dc36611dd7205df8452e63f52fb6261d13e/zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550", size = 5345306, upload-time = "2025-09-14T22:16:00.165Z" }, - { url = "https://files.pythonhosted.org/packages/73/28/a44bdece01bca027b079f0e00be3b6bd89a4df180071da59a3dd7381665b/zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d", size = 5055561, upload-time = "2025-09-14T22:16:02.22Z" }, - { url = "https://files.pythonhosted.org/packages/e9/74/68341185a4f32b274e0fc3410d5ad0750497e1acc20bd0f5b5f64ce17785/zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b", size = 5402214, upload-time = "2025-09-14T22:16:04.109Z" }, - { url = "https://files.pythonhosted.org/packages/8b/67/f92e64e748fd6aaffe01e2b75a083c0c4fd27abe1c8747fee4555fcee7dd/zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0", size = 5449703, upload-time = "2025-09-14T22:16:06.312Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e5/6d36f92a197c3c17729a2125e29c169f460538a7d939a27eaaa6dcfcba8e/zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0", size = 5556583, upload-time = "2025-09-14T22:16:08.457Z" }, - { url = "https://files.pythonhosted.org/packages/d7/83/41939e60d8d7ebfe2b747be022d0806953799140a702b90ffe214d557638/zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd", size = 5045332, upload-time = "2025-09-14T22:16:10.444Z" }, - { url = "https://files.pythonhosted.org/packages/b3/87/d3ee185e3d1aa0133399893697ae91f221fda79deb61adbe998a7235c43f/zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701", size = 5572283, upload-time = "2025-09-14T22:16:12.128Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1d/58635ae6104df96671076ac7d4ae7816838ce7debd94aecf83e30b7121b0/zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1", size = 4959754, upload-time = "2025-09-14T22:16:14.225Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/57e9cb0a9983e9a229dd8fd2e6e96593ef2aa82a3907188436f22b111ccd/zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150", size = 5266477, upload-time = "2025-09-14T22:16:16.343Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a9/ee891e5edf33a6ebce0a028726f0bbd8567effe20fe3d5808c42323e8542/zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab", size = 5440914, upload-time = "2025-09-14T22:16:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/58/08/a8522c28c08031a9521f27abc6f78dbdee7312a7463dd2cfc658b813323b/zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e", size = 5819847, upload-time = "2025-09-14T22:16:20.559Z" }, - { url = "https://files.pythonhosted.org/packages/6f/11/4c91411805c3f7b6f31c60e78ce347ca48f6f16d552fc659af6ec3b73202/zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74", size = 5363131, upload-time = "2025-09-14T22:16:22.206Z" }, { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" }, { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" }, { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" }, @@ -4503,48 +5759,24 @@ wheels = [ [[package]] name = "zxing-cpp" -version = "2.3.0" +version = "3.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'darwin'", - "(python_full_version >= '3.11' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')", - "python_full_version < '3.11' and sys_platform == 'linux'", -] -sdist = { url = "https://files.pythonhosted.org/packages/d9/f2/b781bf6119abe665069777e3c0f154752cf924fe8a55fca027243abbc555/zxing_cpp-2.3.0.tar.gz", hash = "sha256:3babedb67a4c15c9de2c2b4c42d70af83a6c85780c1b2d9803ac64c6ae69f14e", size = 1172666, upload-time = "2025-01-01T21:54:05.856Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/93/3e830a3dd44a9f7d11219883bc6f131ca68da2a5ad48690d9645e19c3b55/zxing_cpp-2.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e1ffcdd8e44a344cbf32bb0435e1fbe67241337c0a0f22452c2b8f7c16dc75e", size = 1694502, upload-time = "2025-01-01T21:53:06.339Z" }, - { url = "https://files.pythonhosted.org/packages/d7/4c/6bf1551c9b0097e13bcc54b82828e66719c021afd3ef05fd3d7650e0e768/zxing_cpp-2.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfde95506d3fec439705dbc8771ace025d049dce324861ddbf74be3ab0fabd36", size = 991445, upload-time = "2025-01-01T21:53:08.204Z" }, - { url = "https://files.pythonhosted.org/packages/64/6c/1bf6e40fadcb73958f672385c5186b062485c818cecc32b36ddf5666da1e/zxing_cpp-2.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd3f175f7b57cfbdea56afdb5335eaebaadeebc06e20a087d9aa3f99637c4aa5", size = 982960, upload-time = "2025-01-01T21:53:10.136Z" }, - { url = "https://files.pythonhosted.org/packages/ab/60/d420be9446b25a65064a665603bd24295e143e2bafde500bfc952a07fbee/zxing_cpp-2.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6ef0548f4247480da988ce1dad4d9c5b8d7cb2871538894fb9615c9ac0bb8656", size = 1697594, upload-time = "2025-01-01T21:53:17.292Z" }, - { url = "https://files.pythonhosted.org/packages/3e/34/ea057223cc34e63b1ff27b2794bcddfa58a1a64af7314882291255b56980/zxing_cpp-2.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfc1095dc3303ed24be2622916e199a071bae19b19d432a0ce7ca993f95879ec", size = 991930, upload-time = "2025-01-01T21:53:18.808Z" }, - { url = "https://files.pythonhosted.org/packages/2e/d3/75a6d6485e704527c5e18f825f6bd6b5e5129f56c3526f28142911b48410/zxing_cpp-2.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64e5a4ff5168142d8b33ca648978c8ec4125c50b33aa1521e0c5344c6ffacef7", size = 983751, upload-time = "2025-01-01T21:53:21.757Z" }, - { url = "https://files.pythonhosted.org/packages/94/d2/e4552dc7d341ccf6242410a13bf95cbd37d7bf194a482d400729b5934b87/zxing_cpp-2.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2f457c0aa53c1de263e34cac9917ef647bfb9adcc9e3d4f42a8a1fc02558e1a6", size = 1698659, upload-time = "2025-01-01T21:53:36.692Z" }, - { url = "https://files.pythonhosted.org/packages/0e/6c/00252c1b3545c13d68922b67cb7c555f739b3a1755cc2a694fd8705ecae2/zxing_cpp-2.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:899955e0091fa0e159b9eb429e43d0a23e2be4a5347c9629c858844f02024b4b", size = 992014, upload-time = "2025-01-01T21:53:39.621Z" }, - { url = "https://files.pythonhosted.org/packages/95/30/3143bf75944d65c9432349a79b97f9414965a44875ec9eeb5745592b4ecd/zxing_cpp-2.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dec2805c0e9dec0d7707c97ca5196f98d2730d2dfcea80442807123b9f8ec850", size = 984542, upload-time = "2025-01-01T21:53:41.01Z" }, - { url = "https://files.pythonhosted.org/packages/3d/46/ef7c69bea44a7c64d4a740679dd18c59616d610fb468c057d8bfbda5f063/zxing_cpp-2.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3da0fbf0d93ef85663def561e8f7880447970710ea6b1768dfc05550a9ee3e00", size = 1698948, upload-time = "2025-01-01T21:53:46.768Z" }, - { url = "https://files.pythonhosted.org/packages/49/2e/8ed22a7b3743a8aa6a588366e34c44056d118ea7614b6bdbc44817ab4a7f/zxing_cpp-2.3.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0b36f3be2e6d928bea9bd529f173ef41092061f0f46d27f591c87486f9a7366", size = 992070, upload-time = "2025-01-01T21:53:48.258Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5e/5784ad14f8514e4321f3a828dccc00ebcf70202f6ef967174d26bcb65568/zxing_cpp-2.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ba641ca5a0f19b97d7bc6a0212e61dab267a2b1a52a84946d02bdcd859ec318", size = 984869, upload-time = "2025-01-01T21:53:51.256Z" }, -] - -[[package]] -name = "zxing-cpp" -version = "2.3.0" -source = { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl" } -resolution-markers = [ - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", -] -wheels = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_aarch64.whl", hash = "sha256:cfe600ed871ac540733fea3dac15c345b1ef61b703dd73ab0b618d29a491e611" }, -] - -[[package]] -name = "zxing-cpp" -version = "2.3.0" -source = { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl" } -resolution-markers = [ - "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", -] -wheels = [ - { url = "https://github.com/paperless-ngx/builder/releases/download/zxing-2.3.0/zxing_cpp-2.3.0-cp312-cp312-linux_x86_64.whl", hash = "sha256:15c6b1b6975a2a7d3dc679a05f6aed435753e39a105f37bed11098d00e0b5e79" }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/c6/ac2a12cdc2b1c296804fc6a65bf112b607825ca7f47742a5aca541134711/zxing_cpp-3.0.0.tar.gz", hash = "sha256:703353304de24d947bd68044fac4e062953a7b64029de6941ba8ffeb4476b60d", size = 1197544, upload-time = "2026-02-10T12:50:11.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/9c/25ddd83cd109a97a0382fe807a8b0904b3eefcf42d22df6aa6ae6a5e2b86/zxing_cpp-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c171e9b37f596293d1134e74c3285a8b7cf06ef72e2ad39c4a7d54b1aa939782", size = 912816, upload-time = "2026-02-10T12:49:33.174Z" }, + { url = "https://files.pythonhosted.org/packages/32/cc/e2e0d68e60fb132c31c728e24dc529cbb5579bfa1365c64b62290aefe317/zxing_cpp-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e712d958155408c8e902ea91d8feb3f4edfa41fd207ef85ca9e59f3f0c7060ad", size = 866684, upload-time = "2026-02-10T12:49:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/96/f9/538488cacaea1e3e989cf87c389d075e2139ee50fab786de7e59b64f9411/zxing_cpp-3.0.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4f62174643de2012bde470bf2048d8a29b5d93bb23bbdc6c075e7e92dbd5794", size = 994390, upload-time = "2026-02-10T12:49:36.294Z" }, + { url = "https://files.pythonhosted.org/packages/51/c1/3eab6fa0b1c6e83a23ce94727e1551ca49a6edabe4691adaa8d03ff742a2/zxing_cpp-3.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:156b363a0aae0b2472c58628346b5223ebb72935f0fa5def3d7ab4a7211c3e88", size = 1071503, upload-time = "2026-02-10T12:49:38.575Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7f/32b4cc8545da72061d360aca9d96c51738d48e2f3a8eebe06a47f4103dd6/zxing_cpp-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b76fac77c94545c5a6e2e6184a121c09409fff29f9c7557e350c16b78025d74", size = 914798, upload-time = "2026-02-10T12:49:43.556Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/5ba18d19383fe5f044fefa79640f4234665bc77057cf3d584e5eb979685f/zxing_cpp-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bf58043c543d3440f1cbef6bfa9e5ad7139c39c90955d1f294f4778f0cd1ec0", size = 867437, upload-time = "2026-02-10T12:49:45.424Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2a/94d98c5b728e1dfeec3a343f2581bf7f372ca448cefff50076cab0c6e0c4/zxing_cpp-3.0.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:548cc0e767f24193038031c76f60f2de0965ab5b05106dff6095bcae89607748", size = 995650, upload-time = "2026-02-10T12:49:47.222Z" }, + { url = "https://files.pythonhosted.org/packages/39/0f/03f09d048b7dde279a5bed8839ffbb21f7e8995747afa17970791c0356ff/zxing_cpp-3.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfdf7a393541f4cd7c7c9329ec5d56b49a5cfc91bf24cdc53ec301d41c2afd68", size = 1074289, upload-time = "2026-02-10T12:49:48.804Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c4f276e43c4df74896b7cac2a3e5deabaf743e8256ee6736380d64f7295b/zxing_cpp-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:26ee52319b545a0db5adc19c682d5bd7efa210456daff0293f5cc78311c52d90", size = 914828, upload-time = "2026-02-10T12:49:53.306Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/971bb37b9091b02fd12f7c13745335a77a8e9e907abc3e0530ff9c4e6b32/zxing_cpp-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c4d44e63c0cb06df1d7ab636018b3e7139d5b010c22a5dcb18f3badfa29e1e1c", size = 867410, upload-time = "2026-02-10T12:49:55.061Z" }, + { url = "https://files.pythonhosted.org/packages/8e/df/cbf7e3ad2ca5f80f71df39c99fb7061f39fb390a9cab031dab2be361c8be/zxing_cpp-3.0.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9e9f7404b9b33abf863ccb243f6b0e99c4818028894dfdd8fb41e142fcdad65", size = 996406, upload-time = "2026-02-10T12:49:56.42Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ac/ae87a5ed87a7623e18a986e4394c3e12a5fa0f4fa55dae3be7f5ca6ef392/zxing_cpp-3.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a96c8eaf1adff4c5aaf99c74d2b5ce3d542d44c21f964ac3f70eaaefcdc141e", size = 1074221, upload-time = "2026-02-10T12:49:57.971Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/8ecd68d8a9e9bb7166808480a1c09ab059c9974b5c54a40640d4e4e1d814/zxing_cpp-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:af13fcbbe24ca4285bda83309f50954107ddf7d12686c332a838f4eaf88ff619", size = 915701, upload-time = "2026-02-10T12:50:01.942Z" }, + { url = "https://files.pythonhosted.org/packages/f5/38/76f89b42fff2fae62595b3adc88b72e6eb1460acb9c43a8ed4c2455297df/zxing_cpp-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1b74a6b3608d035818d6d4fa9545875acae92635028b8927e3922175cb4fe19b", size = 868123, upload-time = "2026-02-10T12:50:03.222Z" }, + { url = "https://files.pythonhosted.org/packages/0a/3b/b76d979f74f09a7d764fe4c22583ba8322ef0f347e3193eceb1461b84913/zxing_cpp-3.0.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27901910b14e2d6a6f8eba585249d02ac23660de1a6fef3dc3a283bb017c41d0", size = 997309, upload-time = "2026-02-10T12:50:04.835Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e4/dd9ce2a725c83c15b1bc45b3d4e6be30f9528bcb9a4749002e1c4c8dca51/zxing_cpp-3.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:489fc0ab4af893e1b10b58b70c34db80fbbaf6e5c27c216e8f3f2367cf18a45d", size = 1074223, upload-time = "2026-02-10T12:50:06.622Z" }, ] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000000..d78ed4b394 --- /dev/null +++ b/zensical.toml @@ -0,0 +1,131 @@ +[project] + +site_name = "Paperless-ngx" +site_description = "Documentation for the Paperless-ngx document management system software." +site_author = "the Paperless-ngx team" + +site_url = "https://docs.paperless-ngx.com/" + +copyright = """ +Copyright © 2016 - 2026 Daniel Quinn, Jonas Winkler, and the Paperless-ngx team +""" + +repo_url = "https://github.com/paperless-ngx/paperless-ngx" +repo_name = "paperless-ngx/paperless-ngx" + +nav = [ + "index.md", + "setup.md", + "usage.md", + "configuration.md", + { Administration = [ + "administration.md", + { "v3 Migration Guide" = "migration-v3.md" }, + ] }, + "advanced_usage.md", + "api.md", + "development.md", + "faq.md", + "troubleshooting.md", + "changelog.md", +] + +edit_uri = "blob/main/docs/" + +extra_css = ["assets/extra.css"] + +[project.theme] + +logo = "assets/logo.svg" +favicon = "assets/favicon.png" + +language = "en" + +features = [ + "announce.dismiss", + "content.code.annotate", + "content.code.copy", + "content.code.select", + "content.footnote.tooltips", + "navigation.footer", + "navigation.instant", + "navigation.instant.prefetch", + "navigation.path", + "navigation.sections", + "navigation.tabs", + "navigation.top", + "navigation.tracking", + "search.highlight", + "toc.integrate", +] + +# Palette toggle for automatic mode +[[project.theme.palette]] +media = "(prefers-color-scheme)" +primary = "green" +accent = "green" +toggle.icon = "lucide/sun-moon" +toggle.name = "Switch to light mode" + +# Palette toggle for light mode +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" +scheme = "default" +primary = "green" +accent = "green" +toggle.icon = "lucide/sun" +toggle.name = "Switch to dark mode" + +# Palette toggle for dark mode +[[project.theme.palette]] +media = "(prefers-color-scheme: dark)" +scheme = "slate" +primary = "green" +accent = "green" +toggle.icon = "lucide/moon" +toggle.name = "Switch to system preference" + +[project.theme.font] +text = "Roboto" +code = "Roboto Mono" + +# Extras +[[project.extra.social]] +icon = "fontawesome/brands/github" +link = "https://github.com/paperless-ngx/paperless-ngx" + +[[project.extra.social]] +icon = "fontawesome/brands/docker" +link = "https://hub.docker.com/r/paperlessngx/paperless-ngx" + +[[project.extra.social]] +icon = "material/chat" +link = "https://matrix.to/#/#paperless:matrix.org" + +# Extensions +[project.markdown_extensions.attr_list] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.pymdownx.blocks.caption] +[project.markdown_extensions.def_list] + +[project.markdown_extensions.pymdownx.highlight] +anchor_linenums = true + +[project.markdown_extensions.pymdownx.inlinehilite] + +[project.markdown_extensions.pymdownx.tilde] + +[project.markdown_extensions.pymdownx.snippets] + +[project.markdown_extensions.admonition] + +[project.markdown_extensions.pymdownx.details] + +[project.markdown_extensions.pymdownx.superfences] +custom_fences = [ + { name = "mermaid", class = "mermaid", format = "pymdownx.superfences.fence_code_format" } +] + +[project.markdown_extensions.pymdownx.emoji] +emoji_index = "zensical.extensions.emoji.twemoji" +emoji_generator = "zensical.extensions.emoji.to_svg"